Makale Özeti

Bazen bir cümle vardır ki, uzun geceler boyunca öğrenmeye çalıştığınız, günlerce uygulamasının detaylarında kaybolduğunuz bir konuyu çok daha iyi kavrayıvermenize sebep olur. Temel ilkeler basittir. Detaylar konusundaki yetkinliğimiz ve tecrübemiz arttıkça temel ilkelerin bu basitliğini kaybetmeye başlarız. Ustalıkta daha da ilerlemeye başlayınca da tekrar bu temel ilkelere döneriz. Güvenlikle ilgili de bu çevrim geçerli. Yolun başında olan kişilerin kolaylıkla anlayabileceği şeyler anlatacağız bu yazımızda. Güvenliğe kafa yormuş kişilerin de büyük bir kısmını “tabii ki” diye okuyacakları şeyler olacak bunlar. Ama yazılımla -ya da belki sistemle- yoğun olarak uğraştığı halde, bu yazıda geçecek özdeyişlere direnç hissedecek arkadaşlar da olabilir. Bu ilkelerden biriyle çelişiyorsanız, lütfen durup düşünün. Acaba gerçekten doğru yaklaşım içinde misiniz?

Makale

Güvenlik özdeyişleri

Güvenlik özdeyişleri

Bazen bir cümle vardır ki, uzun geceler boyunca öğrenmeye çalıştığınız, günlerce uygulamasının detaylarında kaybolduğunuz bir konuyu çok daha iyi kavrayıvermenize sebep olur.
Temel ilkeler basittir. Detaylar konusundaki yetkinliğimiz ve tecrübemiz arttıkça temel ilkelerin bu basitliğini kaybetmeye başlarız. Ustalıkta daha da ilerlemeye başlayınca da tekrar bu temel ilkelere döneriz.
Güvenlikle ilgili de bu çevrim geçerli. Yolun başında olan kişilerin kolaylıkla anlayabileceği şeyler anlatacağız bu yazımızda. Güvenliğe kafa yormuş kişilerin de büyük bir kısmını “tabii ki” diye okuyacakları şeyler olacak bunlar. Ama yazılımla -ya da belki sistemle- yoğun olarak uğraştığı halde, bu yazıda geçecek özdeyişlere direnç hissedecek arkadaşlar da olabilir. Bu ilkelerden biriyle çelişiyorsanız, lütfen durup düşünün. Acaba gerçekten doğru yaklaşım içinde misiniz?
Şimdi gelelim ilkelerimize:

Mutlak güvenlik diye bir şey yoktur.

Çok iyi olabilirsiniz. Ama en iyi olmanız çok zordur. En iyi de olabilirsiniz. Ama en iyi kalmanız mümkün değildir.
Güvenlikte ne kadar ileriye giderseniz gidin, sizden daha ileriye giden ve yanınızda değil karşınızda olan bir kişi ya da kişiler her an çıkabilir.
Unutmayın ki, siz koca bir sistemin ya da binlerce, belki milyonlarca satırlık bir yazılımın her noktasını savunmak durumundasınız. Oysa saldıran kişi, tek bir zayıf nokta bulup oraya yüklenmeye çalışmaktadır.
Geniş bir ekiple çalışıyor olabilirsiniz, ama yeterince dikkat çekici bir hedefseniz, ‘dünyanın tüm hacker’larının ortak hedefi haline gelebilirsiniz. Pek iç açıcı bir yer olmasa gerek bulunmak için. Tabii ki Türkiye’de yetmiş milyon kişinin bir kanalı izlemediği gibi, dünyanın tüm hackerları da sizi hedef olarak alamaz. Ama yeterince fazla sayıda saldırganın hedefi haline gelebilirsiniz ve böyle bir saldırıya karşı duracak işgücüne sahip olmanız mümkün olmayabilir.
Çalınamayacak bir mal, girilemeyecek bir yer yoktur. Yeterince iyi bir saldırı karşısında hiçbir şey yapamayabilirsiniz.

Güvenlik her zaman bir ekonomi sorunudur.

Yeterince iyi bir saldırı karşısında hiçbir şey yapamayabilirsiniz. Ama yeterince iyi bir savunma yapıyorsanız, yeterince iyi bir saldırı, pek çok saldırganın kolay kolay göze alamayacağı maliyetler gerektirebilir.
Güvenlik iki açıdan bir ekonomi sorunudur:
Birincisi, ancak kabul edilebilir seviyede güvenlik harcaması yapabilirsiniz, bunu aşma şansınız yoktur.
İkincisi, bu kısıtlı bütçeyle, saldırganlar için size saldırmayı kabul edilebilir bir seviyenin üstünde masraf gerektirecek hale getirebilirsiniz. Masrafla kastım sadece parasal kaynakları değil, zamana bağlı kaynakları da içermektedir.
Güvenlik yatırımlarınızın fizibilitesini de yapıyor olmalısınız. Oluşturduğunuz güvenlik seviyesine karşı olası atak fizibiliteleri konusunda kafa yormanızda da fayda vardır.

Tüm savunma hatlarınızın yüksekliği eşit olsun.

Eski kalelere dikkat ettiniz mi? Çoğunlukla duvar yükseklikleri her tarafta eşittir.
Bazılarında ise bir kısım yerlerin daha yüksek, bir kısım yerlerinse daha alçak olduğunu görürsünüz. Mesela üç tarafı düz, bir tarafı uçurum olan bir kalenin, uçurum tarafındaki duvarının daha alçak olduğunu görebilirsiniz.
Aslında, bunun önemli bir sebebi var: Korumaya çalıştığınız bir şeyin etrafındaki çeşitli tedbirlerin, ortalamada belirli bir güvenlik seviyesini tutturması gerekir.
Kalenizin her duvarı eşit yükseklikte değilse, en alçak duvar çok daha fazla sayıda saldırıya hedef olacaktır. Ama eğer duvarlardan biri doğal olarak daha korunaklı durumdaysa, onu diğerleri kadar yüksek yapmasanız da diğer duvarlarla eşlenik bir güvenlik seviyesi yakalayabilirsiniz.
Unutmayın ki, bir saldırgan en zayıf tek bir nokta bulmaya çalışacaktır. Her alanda çok güvenli bir sistemi, tek bir alanda zayıf bırakırsanız, o tek alandan darbe yeme ihtimaliniz yükselir.
Mesela, binanızdan çıkarılan paketleri kontrol etmiyorsanız, yazılım için aldığınız tüm teknik önlemler boşuna olabilir.
Başka bir örnek: Yazılım geliştirirken, dışarıdan gelebilecek saldırılara karşı kodlarınızın olduğu bilgisayarları belki internete bile açmıyorken, daha 3 aylık çalışan elemanların bile dizüstü bilgisayarları ile sistemde rahatça çalışıp akşam iş çıkışı da o bilgisayarları dışarı kontrolsüz olarak çıkarmalarına izin veriyor olabilirsiniz. Güvenlik, Nasrettin Hoca’nın türbesi değildir. Kapıya kilit vururken, tüm duvarların da yerinde ve yeterince engelleyici olmasını sağlamalısınız.

Bir saldırgan, güvenliğin içinden geçmez, etrafından dolaşır.

Sanırım yeterince açık bir deyiş. Koruma altına aldığınız noktalarda korumanın kalitesini denetim altında tutmanız gerekir. Ama asıl dikkat etmeniz gereken, aldığınız önlemlerin boş bıraktığı bir nokta olup olmadığıdır.

Savunmanızı katmanlar halinde yapın.

Tek bir savunma hattı hiçbir zaman yeterli değildir. Bir web uygulamanız olduğunu düşünün, IIS’e girişte güvenlik kontrollerini yapıyorsunuz, IIS’le müşteri arasındaki veri ilişkisini de şifreli yapıyorsunuz diyelim. Bu sadece bir katmanlık bir güvenliktir. Zaten IIS üzerinden erişiliyor diye veritabanında güvenlik katmanı oluşturmazsanız, doğrudan veritabanını hedefleyen bir saldırgan tek katmanlı güvenliğiniz yüzünden size büyük zarar verebilir. Ya da bir şekilde IIS’teki güvenliğinizi aşan bir saldırgan veritabanına geldiğinde ayrıca bir güvenlik hattıyla karşılaşırsa, size vereceği zarar kısıtlanmış olur.
Bu ilkeyi eski kalelerdeki iç içe surlardan tutun, vücuttaki savunma sistemlerine kadar pek çok alanda görebiliriz. Güvenlik ilkeleri açısından dijital sistemler de fiziksel sistemlerden çok farklı değildir.

“Belirsizlik yoluyla güvenlik”e güvenilmez.

Güvenlik sisteminize ait tüm planlarınızın saldırganların elinde olduğunu düşünerek hareket etmelisiniz. Tabii kullanıcı isimleri ve parolalar hariç. Bu ilkeyi kafanızda canlandırmak için şunu düşünün:
Bir kale savunuyorsunuz ve kalenizin bir noktasında sur son derece ince. Düşman bu kısımda surun bu kadar ince olacağını nereden bilecek diye düşünmek, belirsizlik yoluyla güvenlik sağlamaya çalışmaktır.
Dijital bir örnek verelim: Web sitenizin istatistiklerinin yer aldığı bir sayfayı, web siteniz altında kullanıcı ismi ve parola istemeyen bir yolda tutuyorsunuz. Ama bu sayfaya hiçbir şekilde linkiniz yok. Bu, güvenlik değildir. Hele bir de sayfanın adını ‘stats’ falan yaptıysanız!
Emin olun, böyle korumasız bir sayfaya çok kısa sürede erişmemesi gereken kişiler tarafından erişim sağlanır.
Güvenlik tasarımlarınız bilinmediği için güvenli olan bir sistem, geçici bir süre için güvenlidir. Ama sisteminizin güvenlik tasarımları bilindiği halde saldırganların elinden bir şey gelmiyorsa, gerçek anlamda güvenli bir sisteme sahipsiniz demektir. Tabii kusursuz güvenlik diye bir şey mümkünse!

“Keep it simple”

Bu ilke aslında kısaltma olarak da geçer: KISS! Yani “keep it simple stupid”. Daha kibarca ifade edecek olursak: “Basit güzeldir!”.
Yazdığınız her satır fazlalık kod, ya da bir sisteme eklediğiniz her bir parça, karmaşıklığı, hata ihtimalini ve güvenlik risklerini artıracaktır. İşinizi gören en basit çözüm en iyi çözümdür.
Güvenlik düzenlemeleriniz mümkün olduğu kadar basit olsun; ama daha basit değil!

İlgili işi yapmak için yeterli olandan fazla ayrıcalığı bir program ya da bir kişiye vermeyin.

Bazı sistem yöneticileri şifre bilmeyi ya da daha fazla yerin anahtarına sahip olmayı pek sever. Sizde de böyle kişiler varsa, güvenlik sisteminiz alt üst olmuş demektir.
İlgili kişilere çok güveniyor olabilirsiniz. Onların güvenilir olup olmaması ayrı bir konu. Ama bir saldırı durumunda sorumluyu tespit etmek konusunda ciddi bir sorununuz olacaktır. Gereksiz bir hassas yetkiyi asla vermeyin. Gereksiz bir hassas bilgiyi asla vermeyin.
Aynı şey kodlar için de geçerlidir. Bir parça kod çalışırken, kendisi için gerekli en düşük izinlerle çalışmalıdır. Basit bir “integer overflow” hatası yüzünden masum bir program parçası, bir anda kendinize dönmüş bir silaha dönüşebilir. Eğer o kodun yetkileri kısıtlıysa, kötü niyetli bir kişinin eline geçse bile, verebileceği zarar düşük olacaktır.

Programlama zordur.

Zor bir iş yapıyoruz. Hatasız program üretmek kolay değil, zor! Çok laf yalansız, çok mal haramsız olmaz diye bir deyiş vardır, o doğru mu bilmem, ama çok kod kesinlikle hatasız olmaz.
O zaman güvenlik duyarlılığı yüksek program parçalarınızın mümkün olduğu kadar kısa olması, iyisidir!

Güvenlik orijinal tasarımın bir parçası olmalıdır.

Güvenlik, bina bitince vurulan son kat boya değildir. Baştan güvenliği dikkate almadan tasarladığınız bir sistem sonradan güvenli hale getirilemez. Getirilebilse bile, bu, çok daha maliyetli bir yol olacaktır.
Bu durum aslında sadece güvenlik için değil, kullanılabilirlik, ölçeklenebilirlik, performans gibi pek çok unsur için geçerlidir.
Sadece çalışan programlar üretmek değildir bizden beklenen. İyi çalışan, güvenli çalışan, ölçeklenebilir ve diğer önemli tasarım özelliklerine sahip programlar üretmeliyiz.

Bir programı çalıştırmıyorsanız, güvenlik açıklarının olup olmaması önemli değildir.

Ya da başka bir deyişle hedef küçültün!
Bu ilke, Windows Server 2003’teki temel değişikliklerden biridir.
Eskiden kurulu gelen pek çok hizmetin kurulmadan gelmesi, daha önce bir bütün olarak kurulan bazı hizmetlerin parça parça kurulmasının ya da etkin hale getirilmesinin gerekmesi, hep bu ilkeyle bağlantılıdır.
Siz de yazılım üretirken, kullanıcılarının çoğunun kullanmayacağı bir özelliği varsayılan olarak etkin kılmayın.

Bir program ya da protokol, güvenli olduğu ispatlanana kadar güvensizdir.

İki tür hata vardır: Bir şeyi doğruyken yanlış varsaymak. Ya da yanlışken doğru olduğunu varsaymak.
Güvenlik tasarımıyla ilgili olarak bu kuralın kullanımına bir örnek verelim: Sahte tespiti yapan para sayma makineleri.
Yapılabilecek iki hata: Para sayma makinesinin sahte bir paraya sahte değil demesi. Para sayma makinesinin sahte olmayan bir paraya sahte demesi.
Sahte olan paraya sahte değil demek, telafisi mümkün olmayan bir hatadır. Oysa sahte olma ihtimali olan bir paraya emin olmadan da sahte denmesi o kadar büyük bir hata değildir. Banka görevlisi, sahte olabilecek bu paranın fotokopisini çekip müşteriye imzalatarak teslim alabilir. Merkezdeki kontrolde sahte çıkarsa, kullanıcının hesabından düşülür.
Güvenliğinden emin olmadığınız bir kodu güvenli saymak çok tehlikelidir. Ama onun güvensiz olduğunu düşünerek tedbirli kullanmak, sadece biraz daha fazla iş çıkarır.

Bir zincir ancak en zayıf halkası kadar güçlüdür.

Bunu herkes biliyordur herhalde. Ama güvenlik sisteminizin halkalarının neler olduğunun farkında mısınız? Mesela sisteminizin kullanıcılarının da sizin güvenlik sisteminizin bir halkası olduğunu dikkate alıyor musunuz? Pek çok sistem, kullanıcıların güvenlikle ilgili hataları yüzünden delinmiştir.
Kullanıcıları ve onların psikolojilerini düşünmeden sisteminizin güvenliğini iyice katılaştırırsanız, kullanıcıların açık verme ihtimali artar.
Çok iyi tasarlanmış parola kurallarınız olabilir. Ama ezberlenmesi iyice zorlaştığı için kullanıcılar parolalarını yazıp klavyenin altına yapıştırmaya kalkabilirler.

Güvenlik ve kullanım kolaylığı arasında bir buluşma noktası gerekir.

Her işte olduğu gibi burada da türev ilkesi geçerlidir: Optimum nokta, hemen hemen hiçbir zaman fonksiyonun girdilerinden birinin maksimum noktası değildir. Güvenlik açısından 100 puanlık bir sistem tasarlayamazsınız. Böyle bir sistem başka pek çok açıdan geçer notun altında kalacaktır.
Güvenlikle en fazla çelişen özellik kullanım kolaylığıdır. Bir sistem ne kadar güvenli ise kullanım kolaylığı da ona göre azalmış demektir.
Kötü bir tasarım, güvenliği de düşük, kullanım kolaylığı da düşük bir sistemdir. Biraz daha az kötü bir tasarımda ikisinden biri iyi biri kötü olabilir.
İyi bir sistemde, güvenlik de kullanım kolaylığı da kabul edilebilir seviyededir. Her ikisinin de çok iyi olduğu bir sistemi tasarlamaksa hayli zordur.

Varlıklarınızın değerlerini küçümsemeyin.

Güvenlikle ilgili olabilecek en büyük sorunlardan biri, riskin büyüklüğünün önceden görülmesinin çok kolay olmamasıdır. Atalarımız bir musibet bin nasihatten evladır diye boşuna dememişler.
Ama özellikle web programcılığı yapan pek çok arkadaşın başına bir güvenlik açığından kaynaklanan ve sonu acı biten en az bir saldırı gelmiştir sanırım. Kendi çevremdeki programcıları düşününce bunun böyle olduğunu görüyorum.
Unutmayın ki, kredi kartı sahteciliğinin yaygınlığı yüzünden bazı alışveriş siteleri tarafından hizmet verilmeyen bir ülkede yaşıyoruz. Sokaklardaki suçların benzerleri, internette de her an işleniyor.
Bilmiyorum sizi, saldırıyla karşı karşıya kalma ihtimalinizin ne kadar yüksek olduğu konusunda ikna edebildim mi? Buna ikna olduysanız, kaybedebileceğiniz şeylerin değerini bir düşünün. Bunu yaparken de, ‘bize bişey olmaz’cı yaklaşmamanızı tavsiye ederim! : )
Güvenli günler.
Microsoft’un sertifika afişlerinden birini hatırlıyorum: “Günü kurtarın! Her gün!”