Neredeyse ADSL'in ülkemize geldiği günden beri İnternet'e dilediğimiz gibi, özgürce, sansürlere takılmadan ulaşmakta güçlük çekiyoruz. Şu ya da bu nedenlerle erişimi engellenen internet sitelerinin sayısı her geçen sene katlanarak artıyor. Üstelik birçok internet sitesi tam erişim engeline sadece içerdikleri birkaç sayfa yüzünden maruz kalıyor. Wikipedia gibi 48 milyon sayfaya ev sahipliği yapan bir internet sitesinin de buna dahil olduğunu düşündüğümüzde, bu gerçekten kulağa oldukça mantıksız geliyor.

Sahi ya, madem bir internet sitesinde yasalara aykırı ya da halkın erişmesini istemediğimiz bir içerik var, neden sadece bu içeriği engellemiyoruz ki? Birkaç sayfa için bütün siteyi engellemek, pire için yorgan yakmak değil mi?

2014 yılında birileri (kim olduğu cidden belli değil) Wikipedia'daki bazı sayfalara cinsel organ fotoğrafı içerdiği gerekçesiyle erişim engeli uygulamıştı. Evet, bazı sayfalara. Peki 2014'te yapılmış olanı neden 2019'da yapamıyoruz? Cevap: HTTPS.


HTTPS bugün internet sitelerine bağlanmak için kullandığımız, ağ üzerinde güvenli veri aktarımı sağlayan bir protokol. HTTPS protokolü ile bağlandığınız internet siteleriyle yaptığınız veri alışverişleri, yalnızca sizin cihazınız ve bağlandığınız sunucunun okuyabileceği şekilde şifrelenmiş durumdadır. Aradaki kişiler, bu bağlantıda ne gönderildiğini ve ne konuşulduğunu göremezler. Elbette, bağlanılan sunucunun IP adresi ve alan adı bağlantıya aracılık eden kişilerce görülebilir.

Bundan dolayı, sağlıklı bir HTTPS bağlantısı üzerinden ziyaret ettiğiniz web sitelerinde hangi sayfayı ziyaret ettiğinizi ağdaki herhangi bir kişinin görmesi, bu ziyareti diğer sayfalara yapılan ziyaretlerden etkili ve tutarlı bir şekilde ayırt etmesi ve site erişimini hepten engellemeden tek bir sayfaya yapılan ziyarete mani olması mümkün değil.

"Şimdi Batuhancım sen daha Instagram bile patlatamıyorsun, devletin koskoca kurumları kuruluşları varken ne demek mümkün değil? Benim bir arkadaşım var o neler yapıyor neler... Okulda ne öğretiyorlar size?"

Hay... konu samimiyetsiz kız arkadaşın çevresindeki hayali Harold Finch ve benim 6 yıldır boşuna okuyor olduğuma geldiğine göre gelin size ciddi ciddi bunun nasıl mümkün olabileceğini anlatayım. Tabii bunu anlatabilmek için önce size HTTPS sertifikalarının nasıl imzalandığı ve doğrulandığıyla ilgili aşırı derecede basitleştirilmiş olsa da birkaç bilgi vermem gerekli. Eğer konuya hakim olduğunuzu düşünüyorsanız, sizi şöyle yazının sonuna doğru alabilirim.

HTTPS Sertifikaları

Bir internet sitesi https protokolü üzerinden hizmet vermek isterse bunun için bir sertifikaya ihtiyaç duyar. Sertifika, en basit haliyle o siteyle kurulacak iletişimde kullanılacak şifreleme bilgisinden ibarettir. Bir sertifika temelde iki parçadan oluşur; gizli anahtar ve gizli anahtarın varlığı ile üretilen açık anahtar. Anahtarlar, gerçekten çok uzun kriptografik olarak güvenli rastgele metinlerdir. Bu iki anahtar birbirine matematiksel olarak bağlıdır ve bir anahtarla şifrelenen veri ancak ve ancak diğer anahtarla açılabilir. İnternet siteleri bu anahtar çiftindeki gizli anahtarı sizin tarafınızdan gönderilen veriyi çözebilmek için kendine saklar, açık anahtar ise o siteye bağlanmak isteyen herkese gönderilir ki herkes bu siteye göndereceği verileri şifreleyebilsin.

İşleyişin buraya kadar olan kısmındaki sorun, gönderdiğimiz veriyi şifreliyor olmamıza rağmen veriyi gönderdiğimiz kişinin kim olduğunu bilemiyor/doğrulayamıyor oluşumuz. Eğer site ile sizin aranızda duran herhangi birisi trafiğinizi izlemek/dinlemek isterse bağlantınıza sızıp, sitenin size gönderdiği açık anahtar yerine kendi ürettiği anahtar çiftindeki açık anahtarı size gönderebilir. Bağlantıda karşıdaki kişiyi bilemiyor/doğrulayamıyor olduğunuz için bir şey anlamazsınız fakat trafiğinizi izlemek isteyen kişinin açık anahtarını kullandığınız için gönderdiğiniz veriler aradaki bir saldırgan tarafından görülebilir/okunabilir. Bunu çözmenin bir yolu, dünyadaki tüm internet sitelerinin https protokolünde kullandıkları açık anahtarları önceden edinmektir ancak bunu yaparken de doğru sertifikaları edineceğinizin garantisi olmadığı gibi sertifikaların güvenlik için belirli bir sürede bir değişmesi/yenilenmesi gerektiğini unutmamak gerekir. Bütün bu sertifikaları nasıl güncel tutacağımız da başlı başına bir sorun olurdu. Neyse ki, bunun basit bir çözümü var.

Kök Sertifika Yetkilileri

Bu 150 kuruluş kök sertifika yetkilileridir ve bu firmaların açık anahtarları bilgisayarlarımızda, telefonlarımızda kısacası son kullanıcıyı https üzerinden internete çıkartabilen her cihazda yüklüdür diyebiliriz. Kök sertifikalar sayıca azdır, uzun kullanım sürelerine sahiptir ve nadiren değişirler. Bugün internet siteleri https protokolü üzerinden hizmet vermek istediklerinde, kendi oluşturdukları sertifika çiftini direkt kullanmazlar. Bunun yerine, ürettikleri sertifikaları Kök Sertifika Yetkilileri tarafından güvenilen kuruluşlara gönderirler ve bu kuruluşlar kendi anahtarlarıyla bu sertifikayı dijital olarak imzalar. Elbette bunu yapmadan önce sertifikayı hangi site için imzalayacaklarını bilmek isterler ve bu sitenin gerçekten sahibi olduğunu kanıtlayamayan kişilerin taleplerini geri çevirirler. Bu sayede ben ya da siz, dünya genelinde güvenilen bu kuruluşlardan facebook.com için oluşturduğumuz sertifikayı imzalatamayız; zaten biz de onlara bu yüzden güveniriz.

Sertifika Güven Zinciri

Sonuçta, elimizde güvenilir kök sertifika yetkililerinden birince güvenilen bir kuruluş tarafından dijital olarak imzalanmış bir sertifikamız var. Bu sertifikayı sitemizi ziyaret edenlere gönderebiliriz. Sitemizi ziyaret eden tarayıcılar bu sertifikayı aldıklarında, sertifikanın içine işlenmiş sertifikanın geçerli olduğu adreslerin listesini bağlantı kurulacak siteyle karşılaştırırlar. Örneğin bağlanmak istediğiniz example.com sitesi size example.com yerine example.net için imzalanmış bir sertifika gönderirse, bu geçersizdir ve bağlantı sonlandırılır. Eğer sertifikada sorun görünmüyorsa, sertifikanın o cihaz tarafından güvenilip güvenilmediğine bakar. Eğer sertifika cihaz tarafından direkt güvenilmiyorsa ve sertifikada bir üst kuruluşun imzası bulunuyorsa, bu sefer bu üst kuruluş sertifikasının cihaz tarafından güvenilip güvenilmediğine bakılır. Eğer yine direkt olarak bir güven yoksa ve varsa tekrar üst yetkiliye bakılır ve eğer bu sertifika kuruluşuna güveniliyorsa ortada bir güven zinciri mevcuttur ve bu şekilde bağlandığımız siteyi doğrulamış oluruz.

Kullandığım sertifika bensoy.com alanı için bir wildcard sertifika olduğundan, blog.bensoy.com da www.bensoy.com gibi bu sertifika için geçerli alan adlarıdır. Fakat tarayıcınız direkt benim sertifikama güvenmez, bu sertifikayı bana imzalamış Let's Encrypt kuruluşuna da güvenmesi gerekmez. Zincirin en tepesindeki DST Root sertifikasına güvenilirse dolayısıyla zincirin altındaki sertifikalar da geçerli sayılır.

HTTPS'in sertifika ve güven zinciri kavramlarını artık biliyorsunuz. Elbette daha değinmediğimiz bir sürü konu var ama bunlara yeri geldikçe değiniriz. Şimdi bir beyin fırtınası yapalım ve başlıktaki soruya öğrendiklerimiz ışığında bir cevap arayalım.

RE: İnternet Sitelerine Kısmi Erişim Yasağı Getirmek Neden Bu Kadar Zor?

Mesela, Twitter üzerindeki bir hesabın örneğin @batuhanbensoy hesabının herhangi bir nedenden dolayı erişimini engellemek fakat bunu yaparken Twitter'ın geri kalanına dokunmamak istiyoruz. Neler yapabileceğimize bir bakalım:

DNS Yoluyla Erişim Engeli

Bunu yazmama bile gerek yok, çalışmayacaktır. Bir site için yapılan DNS taleplerine yurt içi DNS sunucularıyla yanlış cevap vermek, yurt dışına çıkması gereken paketleri çalıp bunları maniple etmek bütün siteyi değil de alt sayfalarını engellemek istediğimiz bir senaryoda işimize yaramaz.

Protokol Düşürerek Erişimi Engellemek

Eğer kullanıcıları https:// yerine http:// kullanmaya zorlayacak olursak, trafiği görüp istediğimiz URL'yi engelleyebiliriz. Ne var ki bugün birçok site için bu mümkün değil çünkü hem artık SSLv3 gibi güvensiz protokoller tercih edilmiyor, hem de HSTS yaygın olarak kullanılıyor. HSTS kullanan bir internet sitesini ilk kez ziyaret ettiğinizde site tarayıcınıza o alan adını uzun bir x süresi için yalnızca HTTPS protokolüyle açması gerektiği konusunda bilgilendirir. HSTS kullanan bir internet sitesine, HTTPS bağlantısı tam anlamıyla sağlanmadan bağlanmanız mümkün olmayacaktır. Peki, bu HSTS başlığını daha ilk gönderimde yakalar ve bir şekilde gitmesini engellersek? Mesela tarayıcı daha önce Twitter'a hiç girmemişse ve önce http://twitter.com'u ziyaret ediyor, sonra https://twitter.com'a yönlendiriliyorsa bu ilk http talebini yakalayıp talebi https'e yükseltmemesi için maniple edemez miyiz?

HSTS Preload Listesi denilen olay olmasaydı, belki mümkün olabilirdi. Dileyen internet sitesi sahipleri, alan adlarını bu listeye kaydedebiliyor ve bütün büyük tarayıcı geliştiricileri bu listeyi her yeni tarayıcı sürümüne dahil ediyorlar. Eğer bir alan adı tarayıcının HSTS Preload listesindeyse, tarayıcı o siteye asla http:// bir talep yollamıyor. hstspreload.org adresinden twitter.com'un da bu listede olduğunu görebiliriz.

Self-Signed HTTPS Sertifikalarıyla Erişimi Engellemek

Eğer kendimize twitter.com adresi için bir sertifika imzalarsak ve Twitter sunucularına ulaşması gereken paketleri kendi sunucumuza yönlendirsek olmaz mı? Böylece sunucu gidilmek isteyen adresi görüp, eğer engelli değilse sunucuyu Twitter sunucularına proxy edebilir ya da eğer ulaşılmak istenen adres engelliyse bağlantıyı kapatıp belki de bir bildiri görüntüleyebilir.

Yapılamayacak olması haricinde, plan oldukça güzel. Öncelikle oluşturduğumuz sertifika self-signed yani yalnızca bizim tarafımdan imzalanmış olduğu için, tarayıcılar bu sertifikaya güvenmeyecektir. Site adresi HSTS Preload listesinde olduğu için de, tarayıcı Chrome'da 'gelişmiş' butonuyla ortaya çıkan twitter.com sitesine ilerle (güvenli değil) bağlantısı da bulunmayacaktır.

Yerel Bir Sertifika Otoritesini Suistimal Etmek

Kabul edelim, dünyadaki hiçbir sertifika yetkilisi kendini riske atıp sırf sizi sevdiğinden size yönetmediğiniz bir alan adı için sahte sertifikalar imzalamaz. Eğer bunu yaptırabiliyorsanız ya ikna kabiliyetiniz gerçekten yüksektir ya da ikna kabiliyetine ihtiyaç duymayacak kadar üst bir makamdasınızdır. Eğer bu sertifika yetkililerinden birine twitter.com için bir https sertifikası imzalatacak olursanız şu ana kadar konuştuğumuz bütün sorunları aşmış ve başarıya çok yakınsınızdır. Fakat...

Bu kadar kolay olmasını beklemiyordunuz zaten değil mi? HTTPS PKP ya da açık anahtar işaretlemesi, bir siteye bağlanırken kullanılacak HTTPS sertifikasının sadece geçerli bir kuruluş tarafından imzalanmış geçerli bir sertifika olmasının yanı sıra açık anahtarın da site tarafından sağlanan imzalardan birisiyle uyuşmasını şart koşar. Dolayısıyla her şeyi doğru da yapsanız bile oluşturduğunuz açık anahtar verilen listede bulunmayacağı için ve site HSTS kullandığı için bu bağlantıya girmeniz yine mümkün gözükmüyor. Evet, PKP uzun zamandır tartışılan ve sonunda kaldırılması kararı alınan bir sistem ancak bunun size faydası olacağını düşünüyorsanız bu fikri aklınızdan çıkarın çünkü şimdi gelecek olan şey, sizi fazlasıyla zora sokacak.

Sertifika Şeffaflığı (CT)

Bu kadar şeyi denedikten sonra, kimsenin bu girişimleri fark etmeyeceğini sanıyorsanız yanılıyorsunuz. Sertifika Şeffaflığı'nın amacı tam da az önce bahsettiğim tarzdaki suistimalleri yeltenildiği anda fark etmek. Sertifika Şeffaflığı gereği sertifika kuruluşlarının imzaladıkları sertifikayla ilgili bazı bilgileri çeşitli sunuculara göndermek zorunda. Böylelikle, örneğin birisi gizlice sunucunuza erişip kendine bir sertifika imzalatacak olursa bunu kolaylıkla fark edebilir ve önlemlerinizi alabilirsiniz. CT kayıtları herkese açıktır ve crt.sh gibi sitelerden bu kayıtlara erişebilir, arama yapabilirsiniz. Ayrıca Facebook'un da size takip ettiğiniz domain için yeni bir sertifika imzalanacak olursa bunu bildirim olarak size haber veren bir aracı mevcut. Eğer bir sertifika kuruluşu yoldan çıkıp kafasına göre, örneğin twitter.com için bir sertifika imzalayacak olursa bu saniyeler içerisinde fark edilebilecektir. Sadece bu bile sertifika kuruluşlarının ayağını denk alması için yeterli çünkü bir sonraki Symantec Distrust onların da başına gelebilir.

Peki sonuçları ne olursa olsun bunu yapmakta kararlıysak?

O zaman geriye tek bir çare kalıyor. Kendinize bir Kök Sertifikası oluşturacaksınız ve ağda DPI işlevi yerine getiren bütün cihazlara bu sertifikayı ekleyeceksiniz. twitter.com/batuhanbensoy adresine erişim engeli koymak istediğinizde twitter.com için dünyanın geri kalanında tamamen geçersiz hatta ülkenizde bile geçersiz bir sertifika oluşturacaksınız. twitter.com'daki herhangi bir adresi ziyaret etmek isteyen bütün kullanıcılara oluşturduğunuz bu sahte sertifikayı göndereceksiniz. Bunu, alt sayfalarından birini engellemek istediğiniz her site için yapacaksınız. Tarayıcılarının bağlantıyı kabul etmesi için bu siteye girmek isteyen/isteyecek herkese önceden kök sertifikanızı gönderecek ve bu sertifikayı cihazlarına yüklemelerini isteyeceksiniz. Bu sayede DPI işlevi yürüttüğünüz ağ cihazları trafiği analiz edebilecek ve hangi URL'e hangi veriyi gönderip aldığınızı görebilecek ve trafiği buna göre yönlendirecek ya da bağlantınızı kapatacak. Bir kurum/kuruluşun bu trafiği izleyebiliyor olması sorun değilse bile bu elle sertifika yükleme olayı çok hızlı bir şekilde kontrolden çıkma potansiyeline sahip olduğu için her iki taraf da çok dikkatli davranmazsa eğer, ağ trafiğini izleyecek tek kişinin bu kurum/kuruluşlar olacağını aklınızdan bile geçirmeyin.

Bunun kimsenin kalkışmak istemeyeceği ölçüde büyük ve utandırıcı bir proje olduğunu düşünüyorum ve yapılacağına ihtimal de vermiyorum. Yine de eğer böyle bir şey olacak olursa, aşağı yukarı nasıl yapılabileceği konusunda bilgi sahibi olmakta fayda var.