GPG (GnuPG – GNU Privacy Guard) Nedir? Nasıl Kullanılır?

Güncelleme Yayın

Veri hakkında bu kadar yazı yayınlayıp veri güvenliği -en azından kişisel verilerimiz- konusunda da bir şeyler yazmamak olmaz. Daha önce Yasaksız Güvenli İnternet ve Beaker gibi konular ve uygulamalardan bahsetmiştim. Bir önceki metadata başlıklı yazımda da özellikle kişisel veriler konusunu vurgulamaya çalıştım. Amacım en azından bu yazı için bir ön hazırlıktı. O halde, konumuza giriş yapalım; GPG (GnuPG – GNU Privacy Guard).

GPG (GnuPG / GNU Privacy Guard)

GPG (GnuPG / GNU Privacy Guard), GPL lisansına sahip, açık kaynak kodlu bir hibrit-şifreleme yazılımıdır. Hibrit-şifreleme simetrik ve asimetrik sistem algoritmalarının iyi yönlerinin bir birleşimi olarak ifade edilebilir.

GPG, OpenPGP şifreleme standardı ile tamamen uyumludur1. OpenPGP ise, izni olmayan kişilerin görmesini istemediğiniz her türlü verinin bütünlüğünü ve güvenliğini sağlayan bir protokoldür2. OpenPGP’nin temelini ise bir şifreleme yazılımı olan PGP oluşturur.

GPG, GPG kullanıcıları tarafından oluşturulan asimetrik anahtar çiftlerini kullanarak mesajları şifreler. Ortaya çıkan bu ortak anahtarlar, diğer GPG kullanıcıları ile pek çok şekilde değiştirilebilir. Bu yollardan biri de İnternet anahtar sunucularıdır. Örneğin, MIT PGP Public Key Server bu amaçla kullanılabilecek alternatiflerden biridir.

GPG İşleyiş Biçimi

GPG işlemlerinde 2 adet anahtar kullanılır. Açık anahtar (public key) bir veriyi şifrelemek için kullanılırken gizli anahtar (private key) açık anahtar ile şifrelenen verinin çözülmesi için kullanılır. Bu iki anahtar tıpkı anahtar ve kilit gibi birbirini tamamlayan bir yapı oluşturur. Açık anahtar herkese açık bir şekilde paylaşılabilir. Bir üst paragrafta bahsi geçen key server’lar bu amaca yönelik kullanılmaktadırlar. Ancak, gizli anahtarın hiçbir şekilde paylaşılmaması ve güvenli bir şekilde saklanması gerekmektedir. Aksi durumda kimlik hırsızlığı gibi sorunlar söz konusu olabilir.

Bir anahtar (key) blogu şuna benzer:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.1 (GNU/Linux)
Comment: For info see http://www.gnupg.org

mQGiBDkHP3URBACkWGsYh43pkXU9wj/X1G67K8/DSrl85r7dNtHNfLL/ewil10k2
q8saWJn26QZPsDVqdUJMOdHfJ6kQTAt9NzQbgcVrxLYNfgeBsvkHF/POtnYcZRgL
tZ6syBBWs8JB4xt5V09iJSGAMPUQE8Jpdn2aRXPApdoDw179LM8Rq6r+gwCg5ZZa
pGNlkgFu24WM5wC1zg4QTbMD/3MJCSxfL99Ek5HXcB3yhj+o0LmIrGAVBgoWdrRd
BIGjQQFhV1NSwC8YhN/4nGHWpaTxgEtnb4CI1wI/G3DK9olYMyRJinkGJ6XYfP3b
cCQmqATDF5ugIAmdditnw7deXqn/eavaMxRXJM/RQSgJJyVpbAO2OqKe6L6Inb5H
kjcZA/9obTm499dDMRQ/CNR92fA5pr0zriy/ziLUow+cqI59nt+bEb9nY1mfmUN6
SW0jCH+pIQH5lerV+EookyOyq3ocUdjeRYF/d2jl9xmeSyL2H3tDvnuE6vgqFU/N
sdvby4B2Iku7S/h06W6GPQAe+pzdyX9vS+Pnf8osu7W3j60WprQkUGF1bCBHYWxs
YWdoZXIgPHBhdWxnYWxsQHJlZGhhdC5jb20+iFYEExECABYFAjkHP3UECwoEAwMV
AwIDFgIBAheAAAoJEJECmvGCPSWpMjQAoNF2zvRgdR/8or9pBhu95zeSnkb7AKCm
/uXVS0a5KoN7J61/1vEwx11poLkBDQQ5Bz+MEAQA8ztcWRJjW8cHCgLaE402jyqQ
37gDT/n4VS66nU+YItzDFScVmgMuFRzhibLblfO9TpZzxEbSF3T6p9hLLnHCQ1bD
HRsKfh0eJYMMqB3+HyUpNeqCMEEd9AnWD9P4rQtO7Pes38sV0lX0OSvsTyMG9wEB
vSNZk+Rl+phA55r1s8cAAwUEAJjqazvk0bgFrw1OPG9m7fEeDlvPSV6HSA0fvz4w
c7ckfpuxg/URQNf3TJA00Acprk8Gg8J2CtebAyR/sP5IsrK5l1luGdk+l0M85FpT
/cen2OdJtToAF/6fGnIkeCeP1O5aWTbDgdAUHBRykpdWU3GJ7NS6923fVg5khQWg
uwrAiEYEGBECAAYFAjkHP4wACgkQkQKa8YI9JamliwCfXox/HjlorMKnQRJkeBcZ
iLyPH1QAoI33Ft/0HBqLtqdtP4vWYQRbibjW
=BMEc
-----END PGP PUBLIC KEY BLOCK-----

GPG Kullanımı

Bir GPG kullanıcısı tarafından gönderilen dosya, e-posta veya yazı kendisine ilettiğimiz açık anahtar ile şifreleyebilir ve edindiğimiz bu şifrelenmiş dosya sahip olduğumuz gizli anahtar ile kolaylıkla çözülebilir. İlgili gizli anahtar sadece bizde olduğu için bir başkası iletişim sürecini takip etse dahi dosyayı, e-posta içeriğini veya metni görüntüleyemez. Bu işlemler için GPG komut satırı arayüzü kolaylıkla kullanılabilmektedir. Ancak, farklı işlerim sistemlerinde kullanılabilecek pek çok grafiksel kullanıcı arayüzü sağlayan uygulama da mevcuttur. macOs X için Guard7 değerlendirilebilecek örneklerden biridir. Diğer yandan, popüler internet tarayıcıları, e-posta ve mesajlaşma uygulamalarının da GPG desteği bulunmaktadır. Mozilla Thunderbird, SeaMonkey, Enigform, Mozilla Firefox ve VSCode bu örneklerden bazılarıdır4.

Ben komut satırı kullanımına değineceğim. Ancak, öncesinde mac OS X bilgisayarımıza uygulamayı indirmemiz gerekmekte. Bunun için Homebrew paket yöneticisinden faydalanabiliriz.

brew install gnupg

gnupg ile ilgili temel bilgiler için man gnupg, daha detaylı bilgilendirme için ise info gnupg komutlarını kullanabilirsiniz.

GPG Public ve Secret Key İşlemleri

Öncelikle şifreleme ile imzalama arasındaki farka değinmekte fayda var. Şifreleme işlemi için bir başkasının açık anahtarını kullanırız ve gönderdiğimiz verinin (dosya, metin vb.) çözülmesi için kişi kendi gizli anahtarını kullanmak zorundadır. İmzalama işleminde ise biz kendi gizli anahtarımız ile kendi verimizi imzalarız ve veriyi gönderdimiz kişi kendisinde bulunan bize ait açık anahtar ile verinin gerçekten bizden gelip gelmediğini kontrol edebilir.

O halde işlemlerimize başlayalım ve ilk olarak kendimize bir anahtar yaratalım. --gen-key ile pratik bir şekilde sadece temel bilgileri girerek bir anahtar oluşturabiliriz. Ancak, şifreleme algoritması, anahtar uzunluğu, anahtar geçerlilik süresi gibi detaylı tanımlamalar için --full-generate-key ile anahtarımızı oluşturmamız gerekmektedir. Oluşturduğumuz tüm anahtarlar /Users/.gnupg/ altında saklanmaktadır. Ancak, anahtarlarımızı aktararak farklı ortamlarda da saklayabiliriz.

gpg --gen-key
# ya da
gpg --full-generate-key

Bir anahtar oluşturduğumuzda bizden ayrıca bir şifre girmemiz istenecektir. Bu şifre sayesinde kendi bilgisayarımızda depolanan gizli anahtarın güvenliğini sağlarız.

Şimdi de oluşturduğumuz anahtarlarımızı listeleyelim. Açık anahtarlarımızı listelemek için --list-keys, gizli anahtarlarımızı listelemek için ise --list-secret-keys komutunu kullanabiliriz.

gpg --list-keys
# ya da
gpg --list-secret-keys

Yukarıdaki komutlar anahtarlarımızı özet bir şekilde bize sunacaktır. ID içeriği ile birlikte listeleme yapmak istersek komutumuzu şu şekilde düzenleyebiliriz.

gpg --list-keys --keyid-format long

Komut sonrasında aşağıdaki gibi bir dönüş alırız. Örnekte yer alan pub açık anahtarımızı, pub satırındaki 012345ABCDEF6GH7 ise key id’mizi, uid kullanıcı id’mizi, subkey ise açık alt anahtarımızı ifade eder. İleri okumalar bölümünden subkey ile ilgili daha detaylı açıklamalara ulaşabilirsiniz.

pub   rsa2048/012345ABCDEF6GH7 2020-01-01 [SC] [expires: 2022-01-01]
      A1B23C45DE6F7G8901I23J4K567890LMNOPR1ST2
uid                 [ultimate] Ceyhun Enki Aksan <c.aksan@gmail.com>
sub   rsa2048/Z9Y8VU765TSR4321 2020-01-01 [E] [expires: 2022-01-01]
gpg --edit-key <key-id>

Bu komutu uygulamamızın ardından eğer ilgili id’e sahipsek gpg komut satırı bizi karşılayacaktır. Artık adduid komutunu kullanarak bilgilerimizi yeniden girebiliriz. Bu süreci quit komutu ile sonlandırabiliriz. Şimdi de var olan bir anahtarımızı silelim. Bu işlemi açık ve gizli anahtarlar için ayrı ayrı yapmamız gerekmektedir. uid alanına anahtar tanımında kullandığınız ad-soyad veya e-posta bilgisini yazabilirsiniz.

gpg --delete-key "<uid>"
gpg --delete-secret-key "<uid>"

--delete-key ile açık, --delete-secret-key ile gizli anahtarı sileriz. Unutmadan ekleyeyim! Oluşturduğumuz bir açık anahtarı silmek için öncelikle ilişkili gizli anahtarı silmemiz gerekir. Ardından açık anahtarı silerek tüm anahtarları silmiş oluruz.

Bu temel bilgilerin ardından artık anahtar oluşturma, dosya imzalama ve şifreleme gibi işlemlere geçebiliriz. İlk olarak belirttiğimiz id üzerinden bir açık anahtar blogu oluşturalım.

gpg --armor --export <key-id>

Oluşturduğumuz bu anahtar blogu anahtarı oluştururken belirlenen algoritma ve anahtar uzunluğu gibi tanımlamalar esas alınarak oluşturulacaktır. Örnek bir işlem olarak, bu blogu GitHub veya GitLab hesaplarımıza ekleyip commit‘lerimizin doğrulanmasını sağlayabiliriz. Elbette, oluşturduğumuz bu açık anahtarı bir metin dosyası olarak da saklamak isteyebiliriz.

gpg -a -o <dosya-adi> --export <key-id>
# ya da
gpg --armor --export <key-id> > <dosya-adi>

GPG İle Veri Şifreleme ve Şifreli Veriyi Çözme

GPG aracılığıyla, komut satırı veya grafiksel kullanıcı arayüzü üzerinden kolaylıkla dosya şifreleme ve şifrelenmiş dosyaları çözme işlemlerini uygulayabiliriz. Elimizde bir metin dosyası olduğunu varsayalım.

gpg -r <key-id> -e <dosya-adi>

alanında sistemimizdeki herhangi bir kullanıcıyı seçebiliriz. -r belirtiğimiz key-id’e sahip kullanıcının anahtarı üzerinden dosyamızı şifreleyecektir. Komutu uygulamamızın ardından dosyamızın .gpg uzantılı şifrelenmiş ve sıkıştırılmış bir kopyası oluşturulur. Şimdi bu şifrelenmiş dosyayı çözelim.

#console'da görüntülemek için
gpg -d <sifrelenmis-dosya-adi>
#içeriği belirttiğimiz bir dosyaya aktarmak için
gpg -d <sifrelenmis-dosya-adi> > <dosya-adi>
#içeriği bir dosya olarak kayıt etmek için
gpg -o <dosya-adi> -d <sifrelenmis-dosya-adi>

Komutu uygulamamızın ardından dosyanın şifrelendiği key-id’e ait gizli anahtar işleme alınacaktır. Bu nedenle gizli anahtar oluşturulurken tanımladığımız şifreye ihtiyacımız olacak. Şifreyi de doğru bir şekilde girdiğimizde şifreli dosyamızın (sifrelenmis-dosya-adi) çözülmüş hali (dosya-adi) oluşturulacaktır. Bir dosyaya ait gizli anahtar blogunu aktarmak için ise şu komuttan faydalanabiliriz.

gpg -o <sifrelenmis-dosya> -a --export-secret-key <key-id>

Gizli anahtarı dışarı aktardık, peki, bir gizli anahtarı içe aktarmak için ne yapmalıyız?

gpg --allow-secret-key-import --import <sifrelenmis-dosya-adi>

GPG İle Veri İmzalama ve İmza Kontrolü

Peki, açık bir şekilde paylaştığımız bir dosyanın veya bir e-postanın bizden gelip gelmediğini nasıl kontrol edilebilir? Hemen yine bir dosya üzerinden örneklendirelim.

gpg -s <dosya-adi>

Bu komut ile <dosya-adi> olarak belirttiğimiz dosyamızı imzalayabiliriz. Komutun uygulanmasının ardınan gizli anahtarın kullanımı için bizden anahtara ait şifremizi girmemiz istenecektir. İşlem sonrasında yine gpg uzantılı bir sıkıştırılmış kopya oluşturulur ve bu dosya okunabilir olmayacaktır. Peki, okunabilir bir kopya oluşturmak istersek ne yapmalıyız?

gpg --clearsign <dosya-adi>

Bu durumda dosyamızın asc uzantılı bir kopyası oluşturulur. Bu dosya eğer metin dosyası için bir metin editörü ile görüntüleyebiliriz. Ancak, bir medya dosyası ise görüntülememiz mümkün olmayacaktır. Sıkıştırılmış ya da sıkıştırılmamış olması fark etmeksizin oluşturulan şifrelenmiş kopyayı --verify ile doğrulayabiliriz.

gpg --verify <dosya-adi>

Açık anahtarın Anahtar Sunucusuna Kayıt Edilmesi

Yazının giriş bölümünde anahtarların sunucularda tutulabileceğinden bahsetmiştim. Bu işlemi web arayüzü yerine komut satırı aracılığıyla da gerçekleştirebiliriz. İlk olarak ~/.gnupg/ altında gpg.conf adında bir dosya oluşturalım. Bu dosya daha önce oluşturulmuşsa yeni bir satıra geçmeniz yeterli. Bu yeni sayıra anahtar sunucusuna ait yolu eklememiz yeterli. MIT için adresimiz şöyle; hkp://pgp.mit.edu.

echo 'keyserver hkp://pgp.mit.edu' >> ~/.gnupg/gpg.conf

Artık istediğimiz key-id’leri bu sunucuya tek bir komut ile aktarabiliriz.

gpg --send-keys <key-id>

Şimdi, bir örnek işlem gerçekleştirelim. Bir veri tablosunu sizinle şifreleyerek paylaştığımı varsayalım. Buradan bana ait açık anahtara ulaşabilirsiniz. Bu açık anahtar ile benim tarafımdan gönderilmiş dosyayı doğrulayabilir ve şifresini çözebilirsiniz. Bu açık anahtarı dosya olarak veya sunucu üzerinden doğrudan makinemize aktarabiliriz.

gpg --import <dosya-adi>
# ya da
gpg --keyserver pgp.mit.edu --recv-keys <key-id>

Komutları bana ait key-id üzerinden düzenlemek gerekirse;

gpg --keyserver pgp.mit.edu --recv-keys CBDC6FE7
# ya da
gpg --keyserver pgp.mit.edu --recv-keys 0x014869cfcbdc6fe7

Bu işlemin ardından anahtar makinemize indirilmiş olacaktır. gpg --list-keys --keyid-format long ile anahtarları listelediğimizde ilgili anahtarı da görebiliriz. Doğrudan bir anahtar URL’ine ya da dosyasına sahip olmayabilirsiniz. O halde sunucuda arama yapalım.

gpg --search-keys <kisi-adi-veya-e-posta-adresi>

Evet, işlemlerimiz bu kadar.


İleri Okumalar

Kaynakça

  1. GNU Privacy Guard, Wikipedia
  2. OpenPGP, Wikipedia
  3. GNUPG: Software
  4. GPG (GnuPG) ile Şifreleme İşlemleri
  5. GnuPG
  6. Linux’ta GPG Kullanımı