Jump to content

C# Ile Dizin Güvenliklerinin Belirlenmesi


wmismail

Recommended Posts

İşyerinde bir proje için, IIS (Internet Information Service) üzerinde siteleri oluşturacak ve oluşturulan yeni sitelere ait dizin güvenliklerini de belirleyebilecek bir programa ihtiyaç duydum. Belki IIS üzerinde yeni bir site tanımlamasının yapılması çok uzun bir süreç değil ama eğer benim ve işyerindeki arkadaşlarım gibi güvenlik konusunda çok tedbirli davranan birisi iseniz, bunun yanında oluşturmanız gereken site sayısı sunucu başına yaklaşık 40-50' yi buluyorsa işiniz sandığınızdan da uzun sürebilir. Benim en önemli avantajım oluşturmam gereken web sitelerinin hemen hemen tamamının dizin yapılarının (fiziksel ve sanal) aynı olmasıydı. örneğin, bahsettiğim proje sınırları içerisinde yeni bir web sitesini oluşturmak (IIS 6.0) için gerekli adımları aşağıdaki gibi sıralarsak,

  1. IIS üzerinde yeni bir web sitesi tanımı oluştur.
  2. Oluşturulan web sitesi için yeni bir "http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/67e39bd8-317e-4cf6-b675-6431d4425248.mspx uygulama havuzu" oluştur.
  3. Siteye anonim erişim için gerekli kullanıcıyı oluştur (ben genellikle IUSR_ öneki ile başlayan kullanıcı adları seçerim).
  4. Sitenin çalışacağı uygulama havuzuna ait worker process'lerin haklarını kullanarak uygulama havuzu içeriside çalışacağı kullanıcıyı oluştur (ben genellikle IWAM_ öneki ile başlayan kullanıcı adları seçerim).
  5. d şıkkında oluşturulan kullanıcıyı IIS_WPG kullanıcı gurubuna dahil et.
  6. Yeni bir kullanıcı grubu oluştur ve c ve d şıklarında oluşturulan kullanıcıları bu gruba ekle.
  7. Fiziksel ve sanal dizinlerin güvenlik ayarları ile ilgili düzenlemeleri yap.

kabaca yukarıdaki gibi bir liste çıkacaktır. Benim oluşturmam gereken sitelerin genel yapıları hemen hemen yukarıda sıraladığım gibiydi (kullanıcıların oluşturulması, şifrelerinin rastgele atanması, özelliklerinin belirlenmesi, anonim kullanıcıların seçilmesi, grupların oluşturulması, uygulama havuzu kimliklerinin belirlenmesi vs. gibi standart işlemleri sıralamadım)...

Her bir web sitesinin kabaca yukarıdaki adımların tekrarından oluştuğunu düşünürseniz ve sunucu başına düşen web sitesi sayısını da ortalama 50 olarak kabul ederseniz, harcamam gereken vakti siz düşünün artık :dribble:

Dolayısıyla bu işlemi otomatik olarak yapabilecek bir program, önemli ölçüde vakit tasarrufu sağlayacaktı benim için ve ben de ActiveIIS adlı bir program geliştirdim bunun için. Burada programa ait kodları yayınlamayacağım maalesef yalnızca size fikir verebileceğini düşündüğüm önemli bir kaç noktadan bahsedeceğim.

Erişim kontrol listeleri (http://en.wikipedia.org/wiki/Access_control_listACL - Access control list) nedir ?

Erişim kontrol listeleri kabaca bilgisayar üzerinde kullanılan işletim sistemine, bir nesne (bu bir dosya ya da klasör olabilir) üzerindeki kullanıcıların ya da grupların sahip oldukları yetkilerin neler olduğunu söyler. Daha somut anlamda ifade etmek istersek, herbir satırında ait olduğu nesneye ait kullanıcı yetkilerini barındıran bir tablodur. Bu yetkiler hepimizin bildiği okuma, yazma, düzenleme vs. gibi yetkilerdir.

Bu tablonun herbir satırında yer alan yetki bilgilerini barındıran girdiler ise erişim kontrol girdileridir (http://msdn2.microsoft.com/en-us/aa374868.aspxACEs - Access control entries) . Dolayısıyla herhangi bir klasör yada dosya üzerindeki güvenlik tanımlamarını değiştirmek için o nesneye ait EKL (Erişim kontrol listesi) üzerinde değişiklik yapmak yeterli olacaktır. Bu konuda ise .NET Framework 1.1/2.0 bize olağanüstü imkanlar sunuyor...

Erişim kontrol listelerine erişim ve yeni erişim kontrol girdileri ekleme/silme

.NET Framework 2.0 kullanarak bir nesneye ait erişim kontrol listesi üzerinde ekleme ya da silme yapmak oldukça kolaydır. Bunun için öncelikle aşağıdaki http://msdn2.microsoft.com/en-us/z2kcy19k.aspxisim alanlarını referans olarak belirtmeniz gerekli...

using System.Security.AccessControl;

using System.Security.Principal;Bu referansları ekledikten sonra aşağıdaki fonksiyonları bir dosya ya da dizin üzerinde yeni güvenlik tanımları yapmak ya da mevcut olanları silme için kullanabilirsiniz (dosyalar için kodu birazcık düzenlemeniz gerekecek elbette)...

Yeni bir EKG (Erişim kontrol girdisi) eklemek için,

// Belirtilen klasöre ait EKL'ye (erişim kontrol listesi) belirtilen

// kullanıcıya ait yeni bir EKG (erişim kontrol girdisi) ekler.

public static void AddDirectorySecurity(string FileName, NTAccount Account,

FileSystemRights Rights, InheritanceFlags InFlags, PropagationFlags PrFlags,

AccessControlType ControlType)

{

// Yeni bir klasör nesnesi oluştur.

DirectoryInfo dInfo = new DirectoryInfo(FileName);

// Yeni oluşturulan klasöre ait DirectorySecuritynesnesini al.

DirectorySecurity dSecurity = dInfo.GetAccessControl();

// Güvenlik nesnesi yoluyla yeni bir erişim tanımı ekle.

dSecurity.AddAccessRule(new FileSystemAccessRule(Account,

Rights,

InFlags,

PrFlags,

ControlType));

// Klasörün üst seviyelerden güvenlik tanımlarını miras almasını engelle ve

// varsa mevcut miras alınmış EKG'leri (erişim kontrol girdisi) sil.

dSecurity.SetAccessRuleProtection(true, false);

// EKL'yi kaydet.

dInfo.SetAccessControl(dSecurity);

}Mevcut bir EKG (Erişim kontrol girdisi) tanımını silmek için,

// Belirtilen klasöre ait EKL'nin (erişim kontrol listesi) üzerindeki

// belirtilen kullanıcıya ait mevcut bir EKG'yi (erişim kontrol girdisi) siler.

public static void RemoveDirectorySecurity(string FileName, NTAccount Account,

FileSystemRights Rights, InheritanceFlags InFlags, PropagationFlags PrFlags,

AccessControlType ControlType)

{

// Yeni bir klasör nesnesi oluştur.

DirectoryInfo dInfo = new DirectoryInfo(FileName);

// Yeni oluşturulan klasöre ait DirectorySecuritynesnesini al.

DirectorySecurity dSecurity = dInfo.GetAccessControl();

// Güvenlik nesnesi yoluyla erişim tanımı sil.

dSecurity.RemoveAccessRule(new FileSystemAccessRule(Account,

Rights,

InFlags,

PrFlags,

ControlType));

// EKL'yi kaydet.

dInfo.SetAccessControl(dSecurity);

}İşte bu kadar basit, bu kısımdan sonra yapmanız gereken tek şey, bu fonksiyonları aşağıdaki gibi kullanmak... Bu fonksiyonlar ile mevcut bir klasör ya da yeni bir klasör üzerinde güvenlik tanımları oluşturabilir ve silebilirsiniz.

AddDirectorySecurity("C:\Ahmet", new NTAccount(Environment.MachineName,

"Ahmet"),FileSystemRights.Modify, InheritanceFlags.None,

PropagationFlags.None, AccessControlType.Allow);ya da,

SecurityIdentifier sidAdm = new SecurityIdentifier(

WellKnownSidType.BuiltinAdministratorsSid, null);

NTAccount ntAdmins = (NTAccount)sidAdm.Translate(typeof(NTAccount));

AddDirectorySecurity("C:\Ahmet", ntAdmins, FileSystemRights.FullControl,

InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow);Bu seferlik burada makalemize ara verelim. Bir sonraki makalemde de IIS üzerinden yukarıdaki adımlarda bahsettiğim değişikliklerin (yeni bir web sitesi tanımlama, web sitelerine ait klasör güvenliklerini belirleme vs.) C# ile nasıl yapılabileceğini göstereceğim sizlere...

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...