Kanıt (Evidence)

Kanıt (Evidence) Kod Erişim Güvenliği kullanıcının kimliğine göre değilde, çalışan kodun kimliği üzerine çalışmaktadır. Bu bize tek bir kullanıcı altında tanımlamayacak kadar çok güvenlik seviyesi oluşturmamıza izin verir. Örneğin Internetten gelen ve güvenilmeyen bir kod, üzerinde çalıştığı işletim sistemindeki kullanıcının tüm haklara sahip olmasına karşın, çok daha kısıtlı haklarla çalışmak zorundadır. Varsayılan kod erişim güvenliği politikası .NET Framework tarafından yönetilen (managed) kodlarla geliştirilmiş tüm çok çeşitli senaryodaki uygulamalara yetebilecek kadar güvenli olmalıdır. Yarı güvenilen ve güvenilmeyen ortamlardaki farklı sınırlandırmalara sahip olabilmesi gerekmektedir. Yarı güvenilen ortama örnek olarak yerel ağı, güvenilmeyen ortamlara da Internet"i verebiliriz. Sonuç olarak, Sistem yöneticilerine her ortam için ayrı bir güvenlik seviyesi oluşturmaya izin veren bir güvenlik sistemi gerekmekteydi. Dinamik olarak bileşenlerle oluşturulan sistemlerde ayrı birer güvenlik gereksinimi vardır. Çünkü uygulamanın her bir parçası tamamen farklı organizasyonlardan meydana gelebilmektedir. Her bileşen için ayrı bir güvenlik prensibi geliştirilmelidir. Örneğin, güvenilen bir organizasyon tarafından onaylanmış bileşenler özel bir bilgiye ulaşmaya çalışabilirler ya da şüpheli bir kod kritik bir kaynağa ulaşabilir. Ne yazık ki, Windows NT® ve Unix işletim sistemleri prensip temelli güvenlik modelleriyle kodun nereden geldiğiyle değil de kodu kimin çalıştırdığıyla ilgilenirler. Bileşen temelli programlamanın olmadığı 1980"li yıllar için bu yöntem en mantıklı yöntem idi. Bununla beraber bileşen temelli uygulamaların geliştirilmesiyle prensip temelli güvenlik modellerinin yetersizliği ortaya çıkmıştır. Çözüm ; Kod Erişim Güvenliği (Code Access Security). CLR (Common Language Runtime) günümüz işletim sistemlerinin aksine kullanıcıya değil de çalışan koda ayrıcalıkların verilmesi prensibine dayanan bir kod erişim güvenliği modeli üzerine kurulmuştur. Assembly"nin yüklenmesiyle CLR yüklenen kodların nereden geldiği belirleyebilmek için kanıt (evidence) arar. Bu kanıt, yüklenen assembly"nin bellekte gösterimi ile ilişkilidir. Yeni yüklenen kod için hangi hak ve ayrıcalıkların tanınması gerektiğini belirler. Kanıt, belirli bir güvenlik politikasına göre test için çalıştırılarak tespit edilir. Bunu biraz daha açmak gerekirse güvenlik politikasını kanıtı parametre olarak alan ve bir izin kümesi döndüren basit bir fonksiyon olarak düşünebiliriz. Bu şekilde tüm uygulamanın tüm kanıtlar için testinin yapılması en doğrusudur, fakat performanstan çok şey kaybettirir. Bunu engellemek için kanıt testi sadece bir güvenlik kontrolü istendiğinde gerçeklenir. Bir izin kümesi(Permission Set) adından da anlaşılacağı gibi bir güvenlik politikası tarafından sağlanan izin yığınıdır. Bir izin(permission) belirli bir işlemi yapmak ya da bir kaynağa erişim için tanımlanan güvenin bir ölçüsüdür. CLR kullanıcının gizliliğini korumak ve sistemin bütünlüğünün bozulmasını engelleyecek gömülü bazı izin kümelerine sahiptir. Bununla beraber kullanıcıların tanımlayabileceği herhangi bir izin eklenebilme ve geliştirilebilme rahatlığına da sahiptir. Yani kendi izin kümelerimizi ve güvenlik politikalarını geliştirip CLR" ye entegre edebilmemiz mümkündür. Hangi kodun hangi izin kümelerine sahip olduğunun tesbitine güvenlik politikası dendiğininden daha önce bahsetmiştik. Güvenlik politikaları çok farklı mekanizmalar ile uygulanmaktadır. Belirli bir yetki dahilinde gerçekleşecek işlemler için güvenilen harici kodların belirli ayrıcalıklara sahip olması gerekmektedir. Örneğin, önemli sistem kaynaklarını kullanan geliştirdiğimiz bir kütüphanemiz var. Bu kütüphanedeki bir yetki dahilinde erişimlerin kısıtlandığı herhangi bir yordam ya da kod bloğunu çağıran tüm harici kodların bu yordamı çalıştıracak yetkilere sahip olması gerekmektedir. Sadece o kodu çağıran kod değil tüm kodların o erişim iznine sahip olması gerekmektedir. Bir windows uygulamasını ele alalım; bir yetki dahilinde sınırlandırılmış bir sistem kaynağını kullanılması için kullanıcının kullanıcı arabiriminde bir buton"a tıklaması gerektiğini düşünelim. Bu tıklanan butonun event handler"ı bizim kendi yazdığımız bir başka assembly deki kodu çağırabilir. Bu assemblyden de sistem kaynaklarını kullanan önceden hazırlanmış kütüphaneye erişim olsun. Burada hem kendi yazdığımız diğer assembly"nin hem de kullanıcı arabiriminin bu ayrıcalıklara sahip olması gerekmektedir. Güvenlik mekanizmasının bu şekilde çalışması çok önemlidir. Çünkü, belirli ayrıcalıklara sahip güvenilen bir kod ile yetki dahilinde sınırlandırılmış koda erişimleri geçebiliriz ve bu kodu kullanan güvenilmeyen bir kod ile tüm güvenliği delebilirdik. Bu yüzden CLR"de güvenlik kontrolü yapılırken tüm call stack (çağırma yığıtı) taranır. Her biri için ayrı ayrı güvenlik kontrolü yapılır. Kod Erişim Güvenliği, bellek temizliği (garbage collection) gibi çalışma zamanında yeterli güce ve yetkiye sahip olmalıdır. Yani basit olarak, belirli bir biçimde yazılmamış bir kod ile erişimler güvenlik sistemini tehdit edebilir. Bu yüzden CLI (Common Language Infrastructure) kodları iki ana gruba ayırmaktadır; doğrulanabilir kodlar ve doğrulanamayan kodlar. CLI"nın type safe kodlar ile çalışan altyapısına uyabilen ve bu matematiksel olarak kanıtlanabilinecek olan kodlar, doğrulabilinir kodlardır. Type safe kod, yalnızca kendisine ayrılan belleğe erişen ve kullanan koddur. Visual Basic® .NET ve C# kullanıcıları hemen safe ve unsafe kod arasındaki farkı hatırlayacaklardır. Visual Basic® .NET ve C# dilleri doğrulanabilir kodu varsayılan olarak kendileri üretmektedirler. Bununla beraber, bazı progralama dillerinde kodlar type-safe olarak doğrudan sınıflandırılamamaktadırlar. Örneğin C++"daki reinterpret_cast doğal bir örneğidir. Bu sebepten ötürü C++ derleyicisinin oluşturduğu kod dışarıdan doğrudan doğrulanabilir bir kod değildir ve bu kodların kullanımı güvenliği tehdit edebilir. Sistemin bütünlüğünü koruyabilmek için, doğrulanamayan bir kodun yüklenip yüklenmemesinin kendisi ayrı bir yetki dahiline alınmalıdır. .NET Framework"ün varsayılan güvenlik politikasına göre CLR sadece yerel makine üzerinde çalışan kodlara yüklenme izni vermektedir. Aynı şekilde C tabanlı ve ye doğrulanamayan COM DLL dosyaları da sadece üzerinde yerel makine de çalıştırılabilmektedir. Genel olarak kod erişim güvenliğinin getirdiği performans yükü çok çok azdır. Assembly yükleyici koda ait kanıtları toplayabilmek için ek iş yapmak zorundadır. Bununla beraber, bu sadece yükleme zamanında olmaktadır ve uygulamanın bellekte kalacağı süreye göre düşünüldüğünde oldukça azdır. Çağırma yığıtında (call stack) yer alan tüm metotların her seferinde güvenlik testinde geçmesi önemli bir güvenlik problemi olabilmektedir. Bu maliyetlerin en aza indirgenmesi için güvenliği kendi tasarımımızın içine koymamız gerekmektedir. Ayrıca çeşitli programlama teknikleri kullanarak bu maliyetleri azaltabiliriz. Şimdi oldukça bir uygulama ile belleğe bir kodun yüklenmesiyle sistem güvenliği tarafından sağlanan kanıtı inceleyebileceğimiz basit bir uygulama yapalım. Bu örnekte, Object, String gibi bir çok veri yapısını üzerinde barındıran "mscorlib" kodu belleğe yüklenmiştir. C#using System; using System.Collections; using System.Reflection; using System.Security.Policy; namespace AssemblyEvidenceCS { class Class1 { static void Main(string[] args) { Type t = Type.GetType("System.String"); Assembly a = Assembly.GetAssembly(t); Evidence e = a.Evidence; IEnumerator i = e.GetEnumerator(); while(i.MoveNext()) Console.WriteLine(i.Current); } } } VB. NETImports System Imports System.Collections Imports System.Reflection Imports System.Security.Policy Module AssemblyEvidenceVB Sub Main() Dim t As Type = Type.GetType("System.String") Dim a As System.Reflection.Assembly a= System.Reflection.Assembly.GetAssembly(t) Dim e As Evidence = a.Evidence Dim i As IEnumerator = e.GetEnumerator() While (i.MoveNext()) Console.WriteLine(i.Current) End While End Sub End ModuleVisual C++. NET#include "stdafx.h" #using using namespace System; using namespace System::Reflection; using namespace System::Collections; using namespace System::Security::Policy; int _tmain() { Type* t = Type::GetType("System::String"); Assembly* a = Assembly::GetAssembly(t) ; Evidence* e = a->Evidence; IEnumerator* i= e->GetEnumerator(); while (i->MoveNext()) Console::WriteLine(i->Current); return 0; }Uygulamanın sonucunun ufak bir kesimi aşağıdaki gibidir; MyComputer file://C:/windows/microsoft.net/framework/v1.1.4322/mscorlib.dll 4D5A90000300000004000000FFFF0000B800000000000000400000000000000000 000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD 21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53 206D6F64652E0D0D0A2400000000000000504500004C010300A595553E0000000000000000E000 0E210B01060000601E0000000000000000001E7D1E000020000000801E00000078790020000000 100000040000000000000004000000000000000000000000100000000000000300000400001000 00100000000010000010000000000000100000000000000000000000CC7C1E004F000000000000 000000000000000000000000000000000000000000000000000C00000060130F00380000000000 0000000000000000...... Son SözSonuç olarak, Kod Erişim Güvenliği, assembly"lere kanıtlara göre izinleri atamaktadır. Bu izinlerin koda atanması için çalıştırılabilir kodun nereden geldiği ve kodunun doğrulabilirliğine göre sahip olacağı ve olabileceği ayrıcalıkları kurmaktadır. Bir kod hakkında bilgi veren, koduun kimliğinin belirleyen bilgiye kanıt denir. Kodun çalışmak için belleğe yüklenmesiyle, sunucu ortam kodla beraber bir kanıtı da koda eklemektedir. Bu kanıt ile çalışma zamanında sahip olunacak izin kümeleriyle birebir eşleme yapılarak kod ile ilgili ayrıcalıklar belirlenmelidir. Bu birebir eşleme işlemi yönetilebilir güvenlik politikasıdır. Bir sonraki makalemizde, güvenlik politikalarını çok daha detaylı olarak irdeleyeceğiz. Bir sonraki makalemizde görüşünceye dek güvende kalın.. Not : Bu makale Don Box"ın "The Security Infrastructure of the CLR Provides Evidence, Policy, Permissions, and Enforcement Services" ve MSDN"nin ilgili konu anlatımlarının yer aldığı "An Overview of Security in the .NET Framework" makalelerinden derlenmiştir.Yazar : Yunus Emre ALPÖZENe-Posta : yunus.alpozen et msakademik.net

Döküman Arama

Başlık :

Kapat