Web güvenliği için “Haydi Şifrele!”

letsencrypt logosu

Herhangi bir şekilde bilginin paylaşıldığı bir iş yapıyorsanız ve bu bilginin kime paylaşıldığı iş açısından önem arzediyorsa bilgi güvenliği kavramı da hayatınızın içinde demektir. Bilgi güvenliği basit önlemlerden başlayıp son derece karmaşık önlemleri içeren uzun bir sürece dönüşebilir. Bu sahip olduğunuz bilginin sizin için ne kadar önemli olduğu ve onu saklamak için ne kadar önlem almak istediğinize bağlı. İnternet de bilginin paylaşıldığı bir mecra olduğuna ve hatta en çok bilgi paylaştığımız mecralardan biri olduğuna göre burada da bilgi güvenliği için çeşitli önlemler almak kaçınılmaz.

Şifreleme?

Şifreleme kavramı daha bilgisayarların ortaya çıkmasına binlerce yıl varken ortaya çıkan bir kavram aslında. Ticari ya da diğer bilgileri başkalarının gözlerinden gizlemek isteyen insanlar, şifrelemek istedikleri veriyi kendilerinin bildiği bir yöntemle değiştirip başkalarının anlamayacağı bir hale getirmeyi başardılar. Bu sayede biri mesajı ele geçirse bile şifresini nasıl açacağını bilemediği için bu mesajı anlamayacaktı. Elbette bir kısım insan şifreleme ilgili metotlar geliştirirken bir kısım insan da bunları kırmak için uğraşmaya başlayacaktı. Özellikle m.s. 800 yılı civarında frekans analizi yöntemini geliştiren El Kindi o dönemin şifre yöntemlerinin bir çoğunu kırmayı başarmıştı.

İkinci dünya savaşında Enigma’nın ortaya çıkması haberleşme gizliliğinin önemini bir kez daha gözler önüne koyacaktı. Enigma’nın kırılması için verilen uğraş modern bilgisayarın ortaya çıkmasında çok ciddi bir aşama kaydetmemizi sağladı.

Elbette modern teknoloji hayatımıza daha fazla girmeye başladıkça bu cihazlar üzerinden yaptığımız haberleşmenin hem sıklığı hem de önemi gittikçe artmaya başladı. Dolayısıyla burada da iletişimin sağlıklı yapılabilmesi için çeşitli teknolojilere ihtiyaç duymaya başladık.

Bir asma kilit

Web’de gezinti yapan hemen herkes çoğu zaman adres çubuklarında çıkan yeşil bir asma kilit ikonuna aşinadır. Bu sevimli ikon sizinle iletişim kurduğunuz sunucunun arasında yer alan iletişimin şifrelenmiş olduğu anlamına gelmektedir ve tahmin edeceğiniz gibi bu iyi bir şeydir!

SSL (ve ardılı olan TLS) standardı 1990’lı yılların ortasına doğru ağ üzerinden haberleşme ihtiyacının artması sonucunda bu haberleşmenin güvenliğinin sağlanması için ortaya çıkmış teknolojilerdir. 1995 yılında SSL 2.0’ın Netscape tarafından protokol olarak duyurulmasından sonra SSL web teknolojileri açısından vazgeçilmez bir alt yapı haline geldi.

SSL protokolü ve standartları hem tasarımsal olarak hem de politik[export grade encryption] olarak bazı zayıflıklara sahip olduğundan bugün kullanılması tavsiye edilmeyen standartlar ve onların yerine TLS standartlarını kullanıyoruz. Buna rağmen teknoloji dünyası bu teknolojiye hala SSL demeye devam ediyor.

SSL v2 ile güvenliği sağlamak (Temsili)

Gerçi BT dünyasına yabancı olmayanların bildiği gibi geçtiğimiz yıl içinde hepimizi dehşete düşüren Heartbleed, Poodle, Drown gibi “havalı” isimli güvenlik açıkları, bu eski protokollerin ne kadar güvenilmez olduğunu göstermiş olmasına rağmen henüz bu protokolleri kullanmaya devam eden binlerce web sitesi ve uygulama var.

Asma kilit nasıl çalışıyor?

Bir sunucu ile iletişime geçmek isteyen istemci bu sunucuyla konuşmaya başladığında hemen hemen şöyle bir diyalog yaşıyorlar.

İ(stemci): Hocam[İstemci ODTÜ mezunuymuş. swh] iyi akşamlar.
S(unucu): İyi akşamlar buyurun.
İ: TLS iletişimi kuracaktık. Uyumlu olduğum şifreleme takımlarının listesini vereyim.
S: Kuralım. Benim uyumlu olduğum şifreleme metotları şunlar ve senle konuşmak için şu metodu seçiyorum. Bu arada benim kimliğimi onaylamak isteyeceksin. Dijital Sertifikam ekte.
İ: Sertifikanın güvenilir olduğunu onayladım. Senin sen olduğunu biliyorum ve şimdi sana şifreli mesajlaşmaya başlamamız için anahtarı yolluyorum.
S: Anahtarı aldım. Hazırım!
<bir takım şifreli mesajlaşmalar>

Elbete protokol bu mizahi anlatımdan biraz daha karmaşık çalışıyor ama temel olarak çalışma prensibini anladınız diye düşünüyorum. Bu adımlarının herhangi birinde hata olması el sıkışmanın (handshake) geçersiz olmasına neden olacağı için burada yaşanacak bir hata şifreli iletişimin başlamasına engel olacak ve iletişimi kesecektir. Son adımda istemci sunucunun açık anahtarıyla kendi oluşturduğu ve her bir bağlantıya özel olan bir simetrik anahtar kullandığı için her bir bağlantının gerçek veriyi taşıyan kısmı birbirinden farklı bir şifreye şifrelenmektedir. Dolayısıyla sunucu özel anahtarını birisi ele geçirse bile daha önceden kaydedilmiş bir bağlantının içeriğini okuyamaması beklenir.

Dikkatli okuyucular bu konuşma içerisinde bir noktayı kalın harflerle işaretlediğimi fark edecektir. Evet işte bu yazının konusu güvenli haberleşmenin çalışması için gerekli Dijital Sertifika ve bu sertifikayı kendi web sitenizde Linux Foundation tarafından finanse edilen Let’s Encrypt projesi ile nasıl elde edebileceğiniz olacak.

Evet uzun bir giriş oldu…

Dijital Sertifika mı?

Resmi adıyla public key certificate – açık anahtar sertifikası – benim isimlendirmemle dijital sertifika ve halk arasında bilinen adıyla SSL sertifikası açık bir anahtarın, kimin olduğunu tasdik etmeyi amaçlamış elektronik bir belgedir. Bu belgenin içinde genellikle açık anahtarın kendisi, bu anahtarın kimin olduğunun bilgisi ve son olarak bu bilgiyi kimin onayladığına dair bilgi ve imza olur. Eğer imza geçerli ve imzayı inceleyen imza atana güveniyorsa bu sertifikanın sahibinin de söylediği kişi olduğuna inanır ve iletişim kurmayı kabul eder.

Eğer böyle bir sertifika sertifikayı üreten kişi tarafından kendi kendine imzalanmışsa yani kıymeti kendinden menkulse[self signed’ı bu şekilde çevirdim. Ağlıyordu çevirmenler] bu sertifikaya inanıp inanmamak tamamen istemciye kalmıştır. Modern web iletişiminde ise bu sertifikalar Sertifika Otoriteleri[Certificate Authority – CA]  tarafından imzalanmıştır. Modern İnternet tarayıcıları özellikle artan saldırıların etkisiyle güvenlik konusunu çok ciddiye almaktadır. Dolayısıyla hemen tüm tarayıcılar bir sertifika otoritesine güvenmek için çeşitli kriterler koymuşlardır ve ancak bu kriterlere uyan otoriteler tarayıcıların güvenilir otorite listesine girebilmektedir.

Bir sertifika otoritesi yerel mevzuata uygunluk ve yatırım gereklerini karşıladıktan sonra temelde önce bir kök sertifikası oluşturur. Hem dijital hem de fiziksel olarak güvene aldığı bu sertifika ile orta seviyeli yeni sertifikalar imzalar. Bu aşamadan sonra tarayıcılarla uyumlu çalışabilmesi için bu tarayıcıların istediği kriterleri yerine getirerek bu tarayıcıların güvenilir sertifika otoritesi listesine girmeye çalışır. Bu listeye girdikten sonra ise beklemeye başlar.

Bu arada web sitesine SSL sertifikası almak isteyen bir kişi, otoriteyi bulur ve gerekli sertifika başvurusunu yapar ve bunun karşılığında bir ödeme yapar. Sertifika otoritesi başvuruyu inceler ve kabul edilebilir olduğuna kanaat getirdiği anda dijital sertifikayı oluşturur ve başvurana iletir. Her sertifikanın bir son tarihi bulunmaktadır ve sertifikayı alan kişi o süre boyunca kendi web sitesini bu sertifikayı kullanacak şekilde ayarlar. Bu aşamadan sonra herhangi bir kişi o web sitesini SSL/TLS ile ziyaret etmek istediği zaman dijital sertifika, tarayıcının kontrolüne sunulur. Tarayıcı öncelikle sertifikada yer alan bilgiyle sertifikayı paylaşan web sitesinin aynı olup olmadığına bakar. Daha sonra bu sertifikayı imzalayan otoritenin kendi güvenilir deposunda olup olmadığını kontrol eder ve burada da bir sorun yoksa el sıkışma prosedürüne devam eder.

Dikkatini hala muhafaza eden okuyucuların bir kez daha gözünden kaçmayacağı gibi bu sertifikayı almak hemen her zaman bir maliyet içerir zira otorite bu sertifika verme işlemi için bir organizasyon tutar ve bu organizasyon yatırımını karşılamak için ürettiği sertifikalardan para alır. Dolayısıyla ister amatör bir blog olsun isterse geliri olan bir web sitesi olsun çoğu zaman bu masrafı yapmaz. Bu durumda güvenilir bir bağlantı üzerinden yapılmayan haberleşme temelde iki soruna sebebiyet verebilir.

  • Haberleşmenin başkaları tarafından görüntülenmesi: İletişimin kurulduğu bağlantının üzerinde olan herhangi bir (bir kafe’de açık bir wireless bağlantısı kullanıyorsanız yan masada oturan biri bile olabilir) kişi aldığınız ve ilettiğiniz veriyi açık olarak görebilir. Bu durumda SSL ile korunmayan bir web sitesine bir parola ile giriş yapıyorsanız ve bu parola ile örneğin Facebook parolanız aynıysa [kabul edin aynı] bir anda Facebook hesabınızı “kaptırmanız” mümkün hale gelebilir.
  • Haberleşmenin değiştirilmesi: Başkalarının görüntülemesi kadar tehlikeli bir durumda haberleşmenin değiştirilmesi ihtimalidir. Bağlantının arasına giren birisi [Man-in-the-middle] sizin haberiniz olmadan örneğin o anda indirdiğiniz dosya üzerinde bir değişiklik yaparak bilgisayarınıza zararlı bir yazılım yüklenmesine sebep olabilir. Bu genelde komplike bir atak olmakla birlikte güvenli olmayan bir bağlantı kullandığınız zaman başınıza gelebilecek bir durumdur.

Özetle bu tip zararlı sonuçlardan korunmak için mahremiyet açısından önem taşıyan bilgilerin taraflar arasında değişimini sağlamanın en iyi yolu güvenilir bir bağlantı kullanmaktan geçmesine rağmen web sitelerinin çok büyük bir çoğunluğu hala sadece açık bağlantı kullanmaktadır.

İşte bu noktada devreye Let’s Encrypt giriyor…

Evet henüz yazıya giremedik[Gözlerim kanıyor!]

Let’s Encrypt Nedir?

Let’s Encrypt, kamu yararına çalışan açık, ücretsiz ve otomatik bir sertifika otoritesidir. İçinde Linux Vakfı, Mozilla, Akamai, Cisco, EFF, Google gibi bir çok BT devinin olduğu ISRG (İnternet Güvenliği Araştırma Grubu) tarafından kurulmuş olup hali hazırla onlar tarafından işletilmektedir. ISRG amacını İnternet üzerinden yapılan iletişimin güvenliğinin arttırılmasını sağlamak için teknik, finansal ve eğitim engellerini azaltmak olarak belirlemiştir. Let’s Encrypt’in arkasında yer alan ilkelere burada da yer vermek isterim:

  • Ücretsiz: Bir internet alan adına sahip olan herkes hiç ücret ödemeden güvenilir bir sertifika alabilecektir.
  • Otomatik: Sertifikanın başvuru, oluşturma, yükleme ve yenileme süreçleri sunucu ile CA arasında iletişim sağlayan bir yazılım tarafından gerçekleştirilecektir.
  • Güvenli: Let’s Encrypt hem CA hem de sunucu tarafında TLS haberleşmesinin güvenliğini arttırmak için iyi uygulamaların paylaşılacağı bir platform görevini görecektir.
  • Şeffaf: Oluşturulan ya da kaldırılan tüm sertifikalar kamuya açık ve herkesin inceleyebileceği bir şekilde kayıt edilecektir.
  • Açık: Oluşturma ve yenileme süreçleri başkalarının da kullanmasını sağlamak amacıyla açık bir standart olacaktır.
  • İşbirlikçi: Let’s Encrypt, İnternet’in altında yatan bir çok protokol gibi tek bir organizasyonun kontrolünde değil topluluğunun faydasına işbirlikçi bir yapı olacaktır.

Peki nasıl oluyor da başka otoritelerin onaylama e-postaları, karmaşık ayarlar ve para istediği yerde Let’s Encrypt otomatik sertifika verebiliyor? Elbette süper güzel ultra mükemmel ACME protokolü sayesinde.

ACME derken?

Çocukken bir defa Roadrunner [bip bip] çizgi filmini izlemiş ya da Bugs Bunny’i tanıyorsanız gözünüze ACME yazısı muhtemelen ilişmiştir. Burada bahsettiğimiz A Company Manufacturing Everything – Her şeyi üreten şirket – olan ACME değil elbette. [Evet bir çocukluk gizeminiz çözüldü az önce.]

Burada bahsettiğimiz ACME ise Automated Certificate Management Environment demek yani Otomatik Sertifika Yönetim Ortamı.

Bu protokol sayesinde herhangi bir insan müdahalesine gerek kalmadan sisteminiz bir tarayıcı tarafından güvenilen bir sertifika alabiliyor ve bu sertifika dilerseniz otomatik olarak web sunucunuza entegre edilebiliyor. Bunu sağlamak için web sitenizde bir ajan çalıştırmanız gerekiyor. Ajanı çalıştırma işini ikinci yazıya bırakıp teknolojinin nasıl çalıştığına bakalım dilerseniz.

Dijital sertifika alan adı için verildiğinden öncelikle alan adının ajanın çalıştığı web sunucu tarafından kontrol edildiğinden emin olmamız gerekiyor. Bunun için de öncelikle alan adı doğrulama adımının çalışması gerekli.

CA, web sunucusunu ajanın açık anahtarından tanımaktadır. Dolayısıyla ajanı ilk çalıştırıp CA ile iletişime geçtiğinde öncelikle sunucunuz için bir anahtar çifti yaratacaktır. Daha sonra bu çiftin açık anahtarını CA’ya gönderip adınıza bir hesap oluşturacaktır. Bu aşamada hesabınız oluştuktan sonra sertifika istediğiniz alan adının size ait olduğunun ve ajanın çalıştığı web sunucusuna yönelik olduğunun tespit edilmesi gerekecektir.

Bu noktada CA ajanı tam olarak bir sınava tabi tutmaya başlamaktadır. Diyelim ki ornek.com için sertifika istiyorsunuz. CA bu sertifikayı vermek için ya ornek.com’da özel bir DNS kaydı oluşturmanızı ya da https://ornek.com URI içerisinde erişebileceği bir HTTP kaynağı oluşturmanızı isteyecektir. Son olarak bir de istemciye özel anahtarıyla imzalaması için bir içerik gönderecektir.

CA ile sunucu arasında sınama aşaması

Bu aşamadan sonra sunucunuz CA’nın istediklerini tamamladığını bildirecek ve topu ona atacaktır. Orta sahada topu kopan CA, araya derin paslar atacak ve sorularına cevap alıp almadığını kontrol edecektir. Eğer hem imzalanmasını istediği metindeki imzanın geçerli olduğuna kanaat getirir hem URI altında istediği içeriği bulabilirse kendisiyle iletişime geçen ajanın bu alan adını yönetmekte yetkili olduğunu onaylayacaktır.

Sonuçların değerlendirilmesi aşaması

Bu aşamadan sonra ajan o alan adı için sertifika talebinde bulunmaya yetkili hale gelir. Bundan ardından ACME protokolü PKCS’nin 10 numaralı standardına uygun bir sertifika imzalama prosedürü gerçekleştirir. Bu prosedür kapsamında imzalanması istenen anahtar çiftinin açık anahtarını imzalar ve ardından tüm isteği ilk aşamada hesaba eklenen açık anahtarla tekrar imzalar ve CA’ya gönderir. CA gelen paketi inceler ve imzaların tutarlılığını onayladıktan sonra istenen sertifikayı oluşturup bu sefer ajanın anahtarıyla imzalayıp geri gönderir.

Sertifika elde etme süreci

Bu aşamada tamamladıktan sonra eğer ajanı web sunucunuza sertifikayı otomatik olarak entegre etmesini söylediyseniz ajan bu adımları gerçekleştirir ve web sunucunuz güvenli iletişim sunar hale gelir.

Let’s Encrypt şu an public beta sürecinde ve isteyenlere sertifika verebiliyor. Yakın zamanda bir milyonuncu sertifikalarını vererek önemli bir kilometre taşını geride bıraktılar. Ben kendi sunucumda 0.2.0 sürümünden beri bu sertifikayı kullanıyorum ve şu ana kadar herhangi bir tarayıcıda uyumla ilgili bir problemle karşılaşmadım. Let’s Encrypt istemcisi tahmin edeceğiniz gibi açık kaynak olarak dağıtılıyor ve şu an bazı dağıtımlar için de paketlenmiş durumda.

Yakın zamanda ikinci bir yazı yazıp hem sunucunuz için nasıl sertifika alacağınızdan hem de TLS ile ilgili bazı ek güvenlik önlemlerinden bahsedeceğim.

Okuduğunuz için teşekkürler…


Also published on Medium.

Akın Ömeroğlu hakkında 17 makale
a lawyer who can sell Linux kernel...

İlk yorum yapan olun

Bir yanıt bırakın

E-posta hesabınız yayımlanmayacak.


*