Makale Özeti

Bu makale dizinsinde COM+'ın ne olduğu, ne işe yaradığını anlatan temel bir dökümanı 9 bölümde inceleyeceğiz. Makale serisinin sonunda COM+ ın temel özellikleri hakkında bilgiye sahip olacak ve kolaylıkla kullanabilir halde olacağız.

Makale

COM+’da Role Based Security
 
COM+ uygulamalarındaki rol tabanlı güvenlik sistemi aynı zamanda System.EnterpriseServices namespace’i kullanarakda ayarlanabilmektedir. Şimdi ise role based security ile ilgili güvenlik ayarlarının metod bazında kodla nasıl yapılabileceğini veya yönetim aracını kullanarak nasıl yapabileceğimizi inceleyeceğiz.
 
COM+ bize iki seviyede güvenlik ayarı yapma olasılığı sunmaktadır bunlar uygulama bazında veya class bazında yapılabilecek güvenlik ayarlarıdır. Uygulama bazında güvenlik ayarlarını yapmak için ApplicationAccessControl attribute’ini kullanabileceğiniz gibi Class bazında güvenlik ayarları için ise ComponentAccessControl attribute’ini kullanabilirsiniz. Şimdi ise bu ayarların yapıldıklarına uygulama için ne anlam ifade edeceklerini inceleyelim.
 
 
Applıcation Security
Class Security
Result
Enabled
Disabled
Uygulama bazında güvenlik etkin kılınır ancak client uygulamaya her eriştiğinde yetkileri kontrol edilir.
Enabled
Enabled
Uygulama bazında güvenlik etkin kılınır. Client herhangi bir class’a eriştiğinde yetkileri kontrol edilir.
Disabled
Enabled / Disabled
Uygulamadi tüm classlar için güvenlik devre dışı bırakılır.
 
Application Bazında Güvenliğin Etkinleştirilmesi
 
Rol tabanlı güvenlik sistemini uygulamanızda kullanabilmek için ilk önce uygulama bazında güvenliğin etkinleştirilmiş olması gerekmektedir. Bir uygulama için güvenliği COM+ Kataloğunda bulunan ApplicationAccessControl attribute’ini kullanarak etkin kulabilirsiniz. Bunu yapabilmek için ilk önce AssemblyInfo.vb dosyasına aşağıdaki kodları eklemeniz gerekmektedir.
 
<Assembly: ApplicationAccessControl(AccessChecksLevel:=AccessChecksLevelOption.ApplicationComponent)>
 
ApplicationAccessControl attribute’ini kullanırken kullanabileceğiniz bir kaç özellik bulunmaktadır bunlar; AccessChecksLevel, Authentication, ImpersonationLevel, Value dir. Bunların arasında en önemli özellik AccessChecksLevel’dir vede uygulamanın kullanacağı erişim izni kontrol mekanizmasını belirlemekte kullanılır. İki çeşir değeri vardır. Bunlar;
 
AccessChecksLevelOption.Application : Erişim kontrollerini sadece uygulama düzeyinde etkin kılar. Bileşen, metod veya interface düzeyinde herhangi bir güvenlik kontrolü yapılmamaktadır.
 
AccessChecksLevelOption.ApplicationComponent : Her düzey için erişim izni kontrolünü etkin kılar. Bu yöntemi kullanmanız daha faydalı olacaktır. Bu yöntemin artısı bileşen, metod veya interface’lerde de güvenlik kontrolünün yapılmasıdır.
 
Bu özellik için herhangi bir değer belirtilmediği durumda varsayılan değeri AccessChecksLevelOption.ApplicationComponent’dır.Bu ayarları yönetim aracının Security sekmesindeki Properties penceresinden yapmanızda mümkündür.
 
 
Bileşen Bazında Güvenliğin Etkinleştirilmesi
 
ComponentAccessControl attribute’i bize bileşen, metod veya interface bazından güvenliği kullanabilmemizi sağlar. Unutulmaması gereken bir nokta bir bileşen için güvenliğin etkinleştirilmesinden önce o bileşeni barındıran uygulama için güvenliğin etkinleştirilmesinin gerekliliğidir. Bileşen bazında kontroller sadece AssemblyInfo.vb dosyasında ApplicationAccessControl attribute’nde ki AccessChecksLevel property’sinin değerinin AccessChecksLevelOption.ApplicationComponent olarak atanmış olması veya Bileşenin property penceresinde Enforce Component Level Access Checks kutucuğunun işaretlenmiş olması gereklidir.
 
 
Securityrole Ve Securemethod Attrıbute’larını Kullanarak Roller Yaratmak
 
Uygulamanız için güvenliği etkinleştirdikten sonra uygulamanız iin roller yaratmalısınız ve windows kullanıcılarını ve kullanıcı guruplarını bu rollere atamalısınız. Bundan sonraki adım ise belirlenen bu rollerin hangi kaynaklar üzerinde yetki sahibi olacaklarıdır. Bu noktada SecurityRoler attribute’i size role yaratma ve bu rolleri çeşitli kaynaklarda yetkili kılma yeteneği sunar. SecureMethod ise güvenlik kontrollerinin yapılmasını zorlamaya ve belirlenen metodların sadece bunlarla ilişkili interface’ler üzerinden kullanıldığından emin olmamıza yarar. Peki bu attribute’ları nasıl kullanacağız.
 
<SecurityRole("Calisan", Description:="Sirketimizde Calisan Kullanici")> _
Public Class SecurityOrnegi
    Inherits ServicedComponent
    Public Interface IMaas
        Function MaasOgren(ByVal CalisanId As Integer) As Integer
    End Interface
End Class
 
Public Class Maaslar
    Inherits ServicedComponent
    Implements SecurityOrnegi.IMaas
    <SecurityRole("Calisan"), SecurityRole("Stajyer", True)> _
    Public Function MaasOgren(ByVal CalisanId As Integer) As Integer Implements SecurityOrnegi.IMaas.MaasOgren
        'Kodumuz
    End Function
End Class
 
Bu yazılı kodu yapmak aynı zmanda yönetimsel araç içinde bulunan uygulama, bileşen, interface veya metod özelliklerinde güvenlik sekmesinde bulunan rollerin seçilmesi ilede kolaylıkla yapılabilmektedir.
 
Component Services Aracını Kullanarak Roller Yaratma Ve Yönetme
 
Component Services Yönetimsel Aracını kullanarak rol yaratmak için rol atamak istediğiniz uygulamanın nodunu genişlettikten sonra roles klasörüne sağ tıklayın ve açılan menüden New Role seçeneğini seçiniz. Karşınıza çıkan penceredeye yaratmak istediğiniz rolün adını yazın ve OK tuşuna basınız.
 
Rolleri yarattıktan sonra ve uygulamayı hayata geçirdikten sonra bu rollere windows kullanıcı guruplarını veya kullanıcılarını atamak zorundasınız. Bununn için tecrübelere dayanılarak tavsiye edilen en genel yol COM+ uygulamanızdaki her bir rol için bir Windows kullanıcı gurubu yaratmak ve yarattığınız b guruplara uygulayı o rolle kullanacak Windows kullanıcılarını atamaktır. Şimdi yaratmış olduğumuz bu gurupları kendi COM+ uygulamamızdaki roller ile nasıl ilişkilendireceğimizi inceleyelim.
 
Bu işlemi yatabilmek için yönetimsel araç’ta bulunan windows kullanıcı gurubunu atamak istediğiniz rolü barındıran uygulamaya ait nodu ve onun altında bulunan Roles klasörünü genişleterek windows gurubunu atamak istediğiniz rolü seçiniz. Role ait Users klasörüne sağ tıklayarak açılan menüden New user’ı seçerek  karşınıza açılacak olan pencereden istediğiniz Windows kullanıcı guruplarını veya kullanıcılarını seçebilirsiniz.
 
Ancak bazı durumlarda aynı metoda erişim izni olan kullanıcılara göre farklı işlemler yapılmak isteniyorsa, örneğin bazı kullanıcıların belirli bir meblağ üzerinde işlem yapmasının engellenmesi gibi. Bu durumda role based security nin yanısıra program bazında security algoritmasının hard code olarak yazılması gerekmektedir. Ancak COM+ bize bu konusa IsCallerInRole veya IsSecurityEnabled gibi iki tane metod sunar.
 
IsCallerInRole metodu bize o an istekte bulunan kullanıcının hangi role dahil olduğu bilgisini verir, ancak nesne üzerinde erişim kontrolü yapılmıyorsa bu metod bize her zaman true değerini döndürecektir.
 
IsSecurityEnabled ise bize nesne için güvenlik kontrolünün etkinleştirilip etkinleştirilmediğini bize geri döndürür.
 
Şimdi bunu bir örnek kodla inceleyelim.
 
Public Class Securtiy
    Inherits ServicedComponent
    Public Function OgrenciSil(ByVal OgrenciId) As Boolean
        If Not ContextUtil.IsSecurityEnabled Then
            Return False
        End If
        If Not ContextUtil.IsCallerInRole("Mudur") Then
            Return False
        End If
        OgrenciSil(OgrenciId)
    End Function
End Class
 
 
Bir başka önemli konu ise metodlarımızı veya bileşenlerimizi çağıran programları ident edebilmektir. ContextUtil classı mevcut context ile ilgili bilgiler taşırken bileşenimize erişen programlar ile ilgili bilgileri SecurityCallContext class’ından alabiliriz. Bu metodu kullanabilmek için ilk önce mevcut istek bilgilerini SecurityCallContext nesnesinin içine doldurmanız gerekmektedir. Bu class’ta yer alan propertylere ve işlevlerine göz atacak olursak.
 
CurrentCall : Mevcut isteğin bir örneğini alarak yeni bir nesne oluşturmak için kullanılır.
Callers : İstemcilerin bilgilerini tutan SecurityCallers nesnesini alır.
DirectCaller : Su an nesneyi çağıran.
NumCallers : Mevcut çağrılarda bulunan çağrıcı sayısı.
OrginalCaller : Çağrı zincirinin ilk halkasında bulunan çağrıcı.
 
Çağrıcıların bilgilerini taşıyan class SecurityIdentity classıdır. Bu classın Collectionu ise Callers Collectionudur ve bu collectiona ait her nesne AccountName, AuthenticationService, AuthenticationLevel, ImpersonationLevel propertylerini taşımaktadır.
 
Dcom Guvenlik Modeli Nedir
 
COM+ güvenlik modeli DCOM güvenlik modeli ve RPC temel alınarak geliştirilmiştir. Bu nedenle DCOM güvenlik modelini anlamak bize COM+ güvenlik modelini anlamakta yardımcı olacağından DCOM güvenlik modelini inceleyelim. Bu güvenlik modeli  4 temel öğeden oluşur. Bu 4 temel öğe;
 
Başlatma Kontrolü : Bu sayede DCOM server’ini başlatmaya kimlerin yetkili olduğunu belirlemek mümkündür. Client’ tan bir istek gelmesi durumunda COM SCM bu isteği kontrol ederek istekte bulunan client’in yetkilerini Windows Registry’sini kontrol ederek onaylar veya onaylamaz. Bu ayarlara ait değişiklikler yönetimsel araçtan yapılabilmektedir.
 
Tanımlama Kontrolü : Bir client server tarafından başlatma kontrolünü geçerse hangi Windows Hesabıyla ilişkili olup olmadığının kontrolü sayesinde kullanıcıyı ident edebilmek olacaktır.
 
Authentication : Kontrol için kullanılan kullanıcının ilişkilendirildiği windows hesabıdır. Ancak opsiyonel olarak kerberos güvenlik sistemide kullanılabilmektedir.
 
Erişim Kontrolü : Server’da bulunan farklı nesnelere erişimlerin kontrolleri için kullanılan bu metod genellikle bir authorization policy tarafından sarılmış durumdadır.
 
Varsayılan Yetkiler
 
COM+ bize başlatma kontrolü ve erişim kontrolü için bazı varsayılan değerler atayabilmenize olanak verir. Ve bir dcom uygulaması yapmış olduğumuz bu ayarları direkt kullanabilir. Bu ayarları yapabilmek için Component Services Administrative Tool kullanarak bu ayarları yapmak istediğiniz bilgisayara sağ tuşla tıkladıktan sonra açılan menüden Properties menüsünü seçmelisiniz. Açılan bu pencereden Default COM Security seçmesini seçer ve Edit default butonuna tıkladıktan sonra açılan bir başka pencereden kullanıcıları veya gurupları seçebilirsiniz.
 
Authentication Levelları
 
Bu kısmın başında bahsettiğimiz gibi authentication temelde bir kullanıcınn kimliğinin belirlenmesi olayıdır. ApplicationAccessControl attribute’inin Authentication property’sini kullanarak bazı authentication level ayarlarının yapılması mümkündür.
 
<Assembly: ApplicationAccessControl(Authentication:=AuthenticationOption.Call)>
 
Peki Bu Propertye atayabileceğimiz değerler nelerdir ve ne anlama gelmektedirler. Şimdi bunları inceleyelim.
 
AuthenticationOption.Default : Bilgisayar bazında konfigure edilmiş varsayılan authentication ayarlarını kullanır.
AuthenticationOption.None : Authentication kullanmaz.
AuthenticationOption.Connect : Sadece yeni bir bağlantı açıldığı zaman authentication mekanizması devreye girer.
AuthenticationOption.Call : Herbir çağrı yapılmadan yani istekte bulunulmadan önce authentication kontrolü yapılır.
AuthenticationOption.Packet : Her istek için gelen paketler tek tek authentication mekanizmasının kontrolünden geçirilir.
AuthenticationOption.Integrity : Alınan datanın bütünlüğünün kontrol edildiği bir authentication mekanizmasıdır.
AuthenticationOption.Privacy : Gönderici ve alıcı bilgilerinin kullanarak paketlerin şifrelendiği bir yöntemdir. Bu en tercih edilen authentication güvenlik mekanizmasıdır.
 
Bu yöntemi Component Services Administrative Tool kullanarak her bir uygulama için Properties menüsünün altındaki Security sekmesindende bulunan Authentication Level For Calls açılır kutusundan yapabilirsiniz.
 
Identity Ve Impersonation Levelları
 
Identity bir servera login olmanız durumunda belirttiğiniz kendinizi tanımlayan session bilgisi iken impersonation ise uygulamanızda kullandığınız bileşenlerin uygulamanıza aitidentity i nasıl kullanacağının belirlenmesidir.
 
Uygulamanızın identity’sini belirlemek için yönetim aracından seçmiş olduğunuz uygulamanın Properties penceresindeki Identity sekmesinde bulunan bir windows hesabını seçebilirsiniz.
 
Impersonation Level’ini düzenlemek içinse ApplicationAccessControl attrbiute’inin ImpersonationLevel property’sini kullanmanız gereklidir.
 
<Assembly: ApplicationAccessControl(ImpersonationLevel:=ImpersonationLevelOption.Delegate)>
 


oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com