Zorlama (Enforcement) I

Zorlama (Enforcement) I İki makaleden oluşan bu yazı dizimizde kod erişim güvenliğinin önemli bir konusu olan zorlama(enforcement)dan bahsedeceğiz. Zorluk Derecesi: 1 2 3 4 5 Anahtar Sözcükler: Kod Erişim Güvenliği, Microsoft .NET, Enforcement, Zorlama Güvenlik politikası yaşam süresinin büyük bir kısmını hareketsiz geçirir. CLR tarafından kendi içerisinde güvenlik politikası çalışması için zorlanır. Bununla beraber, güvenlik politikası güvenilen kütüphaneler aracılığıyla gizli bir kaynağı korumak için dışarıdan zorlanabilir. Bu zorlama işlemi o kodu tüm çağıranların belirli bir izne ve/ve ya izin kümesine sahip olmasını talep edilerek gerçeklenir. Bu açıdan baktığınızda hem IPermission arayüzü hem PermissionSet sınıfı güvenlik politikasının çalışmasını zorlamak için bir Demand metotuna sahiptir. Demand metotu o metotun çağıran tüm metotlar için o izin ve/ve ya izin kümesi için bir yığıt yürüyüşünün başlatılmasını tetikler. Eğer ki çağırılan metotlardan en az birinde dahi istenen izin ve/ve yaizin kümesi için yetki sağlanamazsa Demand metotu tarafından System.Security.SecurityException istisnası atılır. Tüm çağıranlar için yetkinin sağlandığını belirtmek için Demand metotu hiç bir istisna atmaz. Yani geriye true/false gibi bir değer döndürmez. Program akışına bir sonraki komut ile devam eder. Demand metotunun çağrılması için talep edilecek bir izin ve/ve ya izin kümesi tanımlanmış olması gerekir.Örneğin aşağıdaki kodu inceleyelim:C#using System.Net; public sealed class Utils { public static IPAddress LookupHost(string host) { return Dns.GetHostByName(host).AddressList[0]; } }VB.NETImports System.Net Public Class Utils Public Shared Function _ LookupHost(ByVal host As String) As IPAddress Return Dns.GetHostByName(host).AddressList(0) End Function End ClassC++.NETusing namespace System::Net; __gc class Utils { public: static System::Net::IPAddress __gc * LookupHost(System::String __gc* host) { return Dns::GetHostByName(host) ->AddressList[0]; } };J#import System.Net.*; public class Utils { public static IPAddress LookupHost(String host) { return Dns.GetHostByName(host).get_AddressList()[0]; } }Dns.GetHostByName metotu kendisini çağıranların System.Net.DnsPermission yetkisine sahip olmasını istemektedir. Yani kendi içerisinde Demand metotunu çağırmaktadır. Dns sınıfının GetHostByName metotunun kodlaması şu şekildedir:C#using System.Security.Permissions; namespace System.Net { public sealed class Dns { public static IPHostEntry GetHostByName(string host) { // güvenlik politikasını çalışması için zorla.. DnsPermission perm = new DnsPermission(PermissionState.Unrestricted); perm.Demand(); // Eğer ki buraya ulaştıysak DNS aramalarına // güvenlik politikası tarafından izin verilmektedir. // Yapılması gereken iş burada gerçeklenir } }VB.NETImports System.Security.Permissions Public Class Dns Public Shared Function GetHostByName _ (ByVal host As String) As IPHostEntry " güvenlik politikasını çalışması için zorla.. Dim perm As New DnsPermission _ (Permissions.PermissionState.Unrestricted) perm.Demand() " Eğer ki buraya ulaştıysak DNS aramalarına " güvenlik politikası tarafından izin verilmektedir. " Yapılması gereken iş burada gerçeklenir End Function End ClassC++.NETusing namespace System::Security::Permissions; namespace System { namespace Net { __gc class Dns { public: static IPHostEntry __gc* GetHostByName(String __gc * host) { // güvenlik politikasını çalışması için zorla.. DnsPermission __gc *perm = new DnsPermission (PermissionState::Unrestricted); perm->Demand(); // Eğer ki buraya ulaştıysak DNS aramalarına // güvenlik politikası tarafından izin verilmektedir. // Yapılması gereken iş burada gerçeklenir } }; } }J#package System.Net; import System.Security.Permissions.*; public class Dns { public static IPHostEntry GetHostByName(String host) { // güvenlik politikasını çalışması için zorla.. DnsPermission perm = new DnsPermission (PermissionState.Unrestricted); perm.Demand(); // Eğer ki buraya ulaştıysak DNS aramalarına // güvenlik politikası tarafından izin verilmektedir. // Yapılması gereken iş burada gerçeklenir } }Dikkat ederseniz GetHostByName metotu güvenlikle sadece metotun başında ilgilenmektedir. Eğer ki güvenlik politikası DNS aramalarını yasakladıysa arama işlemi yapılmayacak bir istisna atılacaktır. Bu yüzden Utils.LookupHost metotu bu istisnayı kendisi yakalamalı, bu durumda yapılması gereken işi tanımlamalıdır.C#using System.Net; public sealed class Utils { public static IPAddress LookupHost(string host) { try { return Dns.GetHostByName(host).AddressList[0]; } catch(SecurityException) { return IPAddress.Loopback; } } }VB.NETImports System.Net Public Class Utils Public Shared Function _ LookupHost(ByVal host As String) As IPAddress Try Return Dns.GetHostByName(host).AddressList(0) Catch ex As SecurityException Return IPAddress.Loopback End Try End Function End Class C++.NETusing namespace System::Net; __gc class Utils { public: static System::Net::IPAddress __gc * LookupHost(System::String __gc* host) { try { return Dns::GetHostByName(host) ->AddressList[0]; } catch(SecurityException __gc* ) { return IPAddress::Loopback; } } };J#import System.Net.*; public class Utils { public static IPAddress LookupHost(String host) { try { return Dns.GetHostByName(host).get_AddressList()[0]; } catch(System.Security.SecurityException ex) { return IPAddress.Loopback; } } } Demand metotu yığıttaki her metot için "en az" istenen izinlere sahip olmasını zorunlu kılar. "En az" izninin tipine göre IsSubsetOf metotunun gerçeklenmesini istemektedir. Bir işlem parçacığının CLR"yi kullanarak çalışmaya başlamasıyla yığıtın en üstteki izin kümesi oluşturulur. CLR tabanlı programlar tarafından harici olarak oluşturulmuş işlem parçacıkları için bu izin kümesi o işlem parçacığının çağırma yığıtını oluşturan izinlerin kesişimidir. Benzer bir şekilde, bir işlem parçacığı havuzuna(thread pool) ait bir işlem parçacığı bir iş isteği doğrultusunda çalışmaya başlamasıyla çoğaltan iş parçacığının izinleri en üst yığıt izinlerinin oluşturulmasını sağlar. Her iki durumda da yeni oluşturulan iş parçacığı kendisini oluşturan iş parçacığının yetkilerine sahip olur; daha fazlasına sahip olamaz. Kendi başına izin verilmeyen işler yapamaz. Bunların dışındaki tüm işlem parçacıkları(CLR tabanlı uygulamaların ana işlem parçacığı da dahil) , en üst yığın izinleri AppDomain oluşturulduğunda kanıtlar kullanılarak hesaplanır. Bu yüzden AppDomain.CreateDomain metotu parametre olarak kanıt almaktadır.System.Net.Dns sınıfı kullanarak biraz evvel verdiğimiz örnek zorunlu(imperative) güvenlik talebine örnektir. Zorunludur, çünkü bu güvenlik kontrolü programatik bir komut çalıştırılmıştır. CLR aynı zamanda tanımlamaya dayanan güvenlik taleplerinide destekelemektedir. Her izin tipi için CLR"de o izine özgü bir özelliği tanımlayan System.Security.Permissions.CodeAccessSecurityAttribute soyut sınfından türeyen bir özellik tanımlanmıştır. Tüm bu izine özgü özellikler kurucu metotuna zorunlu olarak System.Security.Permissions.SecurityAction tipinde bir güvenlik davranışı almaktadır.namespace System.Security.Permissions { public enum SecurityAction { Demand = 1, Assert, Deny, PermitOnly, LinkDemand, InheritanceDemand, RequestMinimum, RequestOptional, RequestRefuse, } }Daha önceden vermiş olduğumuz Dns sınıfına ait örneğimizdeki zorunlu güvenlik talebini şu şekilde tanımlamaya dayanan güvenlik talebi şeklinde ifade edebiliriz:C#using System.Security.Permissions; namespace System.Net { public sealed class Dns { [DnsPermission(SecurityAction.Demand, Unrestricted=true)] public static IPHostEntry GetHostByName(string host) { // buraya ulaştıysak, güvenlik politikasından izin alınmış demektir } }VB.NETImports System.Security.Permissions Public Class Dns Public Shared Function GetHostByName _ (ByVal host As String) As IPHostEntry "buraya ulaştıysak, güvenlik politikasından izin alınmış demektir End Function End ClassC++.NETusing namespace System::Security::Permissions; namespace System { namespace Net { __gc class Dns { public: [DnsPermission(SecurityAction::Demand,Unrestricted=true )] static IPHostEntry __gc* GetHostByName(String __gc * host) { // buraya ulaştıysak, güvenlik politikasından izin alınmış demektir } }; } }J#import System.Security.Permissions.*; public class Dns { /** @attribute DnsPermission(SecurityAction.Demand, Unrestricted=true ) */ public static IPHostEntry GetHostByName(String host) { // buraya ulaştıysak, güvenlik politikasından izin alınmış demektir } }Bir sonraki makalemizde bu iki tanımlamanın birbirlerine göre avantajlarını ve dezavantajlarını daha detaylı olarak inceleyeceğiz , ve zorlama(enforcement) konusuna kaldığımız yerden devam edeceğiz. Bir sonraki makalede görüşünceye dek güvende kalın. İlgili Makaleler: Zorlama (Enforcement) II Referanslar: 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ştirYazar : Yunus Emre ALPÖZENe-Posta : yunus.alpozen et msakademik.net

Döküman Arama

Başlık :

Kapat