| Editor Login | Register | ||
| > Bilgisayar > Güvenlik |
|
|
| Kod Erişim Güvenliği |
Birçok güvenlik sistemi kullanıcıların kimliklerine göre sisteme ve kaynaklara erişim haklarını verir ve/veya kısıtlar. Kullanıcı kimliği olarak çoğu zaman kullanıcı adı ve şifre kullanılmaktadır. Bu yazımızda .NET"in sağladığı kod bazındaki güvenlik katmanlarının temel olarak yapısını inceleyeceğiz. Kullanıcılar kullandıkları kodların kaynaklarını bilmemektedirler, dolayısıyla kullanılan programın sadece vaat ettiği işi yaptığını veya yapmadığını bilmeleri de olanaksızdır. Daha önceki yazılarımızda da sıkça bahsettiğimiz trojan ve trap doorlar da tamamiyle bu mantık üzerine çalışmaktadırlar. Bu yüzden çoğu işletim sistemi kodu çalıştırmadan önce kodun güvenilir bir kaynaktan gelip gelmediğini araştırır. Örneğin web sitelerindeki ActiveX kontrollerinin çalıştırılabilmesi için kullanıcının siteye güvendiğini belirtmesi gerekmektedir. Buna karşın, internet üzerinden dağıtılan, güvenilir olduğuna inandığınız bir programın gerçekten de o program olup olmadığının da teyidi gerekmektedir. Bir zamanların en iyi virüs tarama programı olan FProt programındaki küçük bir hata bir çok sistemin zarar görmesine sebep olmuştur. Bu tarihteki FProt programının sürümünde unutulmuş, çok önemli bir detay vardı: Fprot tüm sistemde virüs taraması yaparken sadece kendisini tarayamıyordu. İnternet üzerinden dağıtılan virüslü FProt programını kuran kişilerin bilgisayarlarında yapacakları ilk virüs taramasıyla bilgisayarlarındaki tüm dosyalara virüs yayılması bir oluyordu. Virüs, FProt programıyla henüz taranan dosyaya kendi bulaştırarak yayılıyordu. Virüsün kaynağı virüs tarama programının kendisi olunca temizlenmesi de imkansız bir hale geliyordu. Zaten FProt programındaki bu hatadan sonra FProt"a olan güven fazlasıyla sarsılmıştır. Bir kodun belirli bir işlemi gerçekleştirmeye ya da belirli bir kaynağa erişimi için yeterli haklara sahip olup olmadığının tespiti için "call stack" (çağırma yığıtı) kullanılır. Her fonksiyon içerisinde çağırdığı fonksiyonu çağırırken "call stack" adını verdiğimizi yığıta gerekli atamaları yapar. Bu atamalar, çalışan fonksiyona çağırdığı fonksiyondan döndüğünde, her şeyi bıraktığı gibi bulması için sistem tarafından otomatik yapılır. Assembly ile uğraşmış olalnlar bilirler. Bir fonksiyonu çağırmadan önce tüm flagları, registerları stack"e push ederler. Fonksiyon dönüşü aynı değerleri tekrar pop ederler. "Call Stack" bu yapıya benzer bir yapıya sahiptir, bu yapı "call stack" değildir. .NET ile geliştirilen CLR (Common Language Runtime) kullanmayı amaçlayan tüm uygulamalar, yürütme sürecindeki güvenlik sistemi ile ortak çalışmaktadır. Şimdi bu kavramı biraz daha açalım. Geliştirilen uygulamanın sahip olacağı tüm ayrıcalık ve haklar, o an ki uygulamayı çalıştıran kullanıcının grubuna ve sistemin çalışma seviyesine bağlıdır. Çalışma seviyenize göre gerektiğinde donanımın belirli özelliklerinin kullanabilirsiniz. Akıllarda kalabilecek en basit örnek Windows"u güvenli kip de açtığınızda yönetici olarak sisteme girseniz bile, donanımlarınızın tüm özelliklerini kullanamazsınız. Kullanıcı grubuna göre sahip olduğunuz izinler değişir dediydik. Buna verilebilecek örnek ise, şu an giriş yaptığınız sitedir. Sahip olduğunuz kullanıcı adı ve şifreyle yalnızca sitedeki makaleleri okuyabilirsiniz. Yönetici ayrıcalıklarına sahip bir kullanıcı ile giriş yaptığınızda aynı makaleleri değiştirebilirsiniz, ya da yenilerini girebilirsiniz. Çalıştırılan uygulamada aynı şekilde güvenlik ayrıcalıklarını almaktadır. Öncelikle, CLR"den uygulamanın sahip olacağı hak ve ayrıcalıkları alır ve CLR üzerinde çalışmaya başlar. Uygulamanın sahip olduğu hak ve ayrıcalıklar CLR tarafından uygulamanın "call stack" "ine yazılır. Şimdi bu noktada sistemde bir açık olduğu düşüncesine kapılabilirsiniz. "Ben bu uygulamanın call stackindeki ayrıcalıklara sistem yöneticisi ayrıcalıklarını da eklersem, sistem yöneticisi olmadan sistem yöneticisi statüsüne erişebilir miyim?". Eminim bu soru bir çoğunuzun aklına gelmiştir. Cevap tabi ki de "HAYIR !!!!". Sistem yöneticisi olarak erişmek istediğiniz sahip olmanız gereken hak ve ayrıcalıklar "call stack" te yukarıdan aşağıya doğru kontrol edilir. Belki üst katmanları geçmenin bir yolunu bulabilirsiniz. Ancak daha sonraki katmanlarda yani güvenlik kontrolü .NET Framework"e kadar indiğinde, sistem tarafından security exception otomatik olarak atılacak, ve istek red edilecektir. Ayrıca unutmamanız gereken bir diğer önemli nokta da sistemin geliştirilen bir uygulamanın compile edilme süresince çok zayıf olacağıdır. Her hangi bir şekilde geliştirilen uygulamanın compile edildiği threadin kontrolü kaybolursa, sistemin güvenlik katmanı diye bir şey kalmayacaktır. Geliştirilen tüm işletim sistemlerinde genelde performans nedenleriyle güvenlik kernelde sağlanmaz. Sistem güvenliği işletim sistemleri için birer servistir. Compile süresince compile işlemini gerçekleyen thread kernele erişir. Kernele erişimlerin gerçeklendiği bu anlarda, sisteminiz bu thread üzerinden her türlü saldırıya açıktır. Bunun için gerçekten güvenilir compilerları kullanmanızı öneririz. Kod erişim güvenliği sağlanmamış uygulamalar hem kullanıcıları hem de uygulama geliştiricileri tehlikeye sokmaktadır. Oluşturacağınız sistem ne denli büyük ve kompleks olursa olsun, .NET gibi güvenilir bir framework üzerine uygulamanızı kurmanız yararınıza olacaktır. .NET ile 3D flight simulator yapılabildiğini de düşünürseniz eğer, geliştireceğiniz uygulamalar için daha güvenilir bir framework bulamazsınız. Kullanacağınız frameworkün ve compiler"in önemini de hatırlattıktan sonra yazımızı tamamlamak istiyoruz. Son Söz .NET ile kod erişim güvenliğinin nasıl sağlanacağını incelediğimiz bu yazımız da "call stack" kullanımından bahsettik. Bu tür bir stack walk kullanmak sistemimizin güvenliği için bize oldukça fazla artı getirse de sürekli yapılan bu security checkler sistemimizin performansından götürmektedir. Optimizasyon için stack walk performans için mümkün olduğunca kısa ama güvenlik için de mümkün oldukça uzun olmasına dikkat etmelisiniz. Sistem güvenliği sağlamanın yolu, sistemi ve sistem programlamayı çok iyi bilmekten geçmektedir. .NET ile kuracağınız güvenlik sistemi konusunda bazı senaryolardan bahsettik, bu senaryoları arttırmak tabi ki de mümkün. Yalnız unutmamanız gereken en önemli şey, doğru programlama araçlarını ancak doğru şekilde kullanarak yeterince güvenli sistemleri oluşturabilirsiniz.
|
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |