28 Ekim 2010 Perşembe

ASSEMBLY Yaratmak ve Permission Set

Diyelim CLR ile SQL Server da çalışmak için bir assembly yazdınız ve bu assembly yi  register ediyorsunuz.

CREATE ASSEMBLY MyCLRFunction
AUTHORIZATION [dbo]
FROM 'C:\MyCLRFunction.dll'
WITH PERMISSION_SET = SAFE;

Yukarıdaki örnekte göründüğü gibi, CREATE ASSEMBLY ile yazabildiğimiz parametrelerden  biri de PERMISSION_SET.

Permission Set, SQL Server'da oluşturduğumuz assembly için, hangi güvenlik kısıtılarının uygulanacanı belirlediğimiz yer.  Bu güvenlik kısıtları, tabii ki sadece bu assembly yi SQL Server da  kullanırken uygulanıyor olacak (Bir CLR fonksiyonun içinde örneğin)

 SQL Server 2008 de 3 farklı set var
  • SAFE
  • EXTERNAL_ACCESS
  • UNSAFE
SAFE: Safe en fazla kısıtlayıcı olan ve aynı zamanda CREATE ASSEMBLY ifadesinde permission set için bir şey yazılmazsa SQL Server'ın kabul ettiği varsayılan değer.
Bu şekilde ayarlanmış bir assembly, network, dosya veya windows registry gibi dış kaynaklara ulaşamaz.  Hesaplama işleri veya kullanıcı tanımlı veri tipi için yazılmış bir assembly için en uygun ayardır.

EXTERNAL_ACCESS
seçeneği ile kayıt edilmiş olan assembly ler, dosya sistemine ulaşıp, değiştirebilirler, event log'a, registry ye veya active directory ye ulaşabilirler, web veya smtp bağlantıları kurabilirler.
 Assembly şe dış kaynaklara ulaşırken, SQL Server service account u ile bu bağlantıyı kurarlar. Ayrıca unsafe olarak işaretlenmiş kodları da çalıştıramazlar.

UNSAFE : EXTERNAL_ACCESS ile izin verilern her şeyi yapabilir. Aralarındaki tek fark, UNSAFE, unsafe olarak işaretlenmiş ve unmanaged kod denilen kodları da çalıştırabiliyor olmasıdır.   Gerçekten gerekli olmadıkça, unmanaged bir kodu unsafe olarak sql server a tanıtmamak gerekir. Bu kodlar sql server'ın hem güvenliğine, hem de çalışmasına zarar verebilirler.

Assembly kodları, SQL Server servisi tarafından , SQL Server Service Account u ile çalıştırılırlar. Eğer SQL Server, Local System kullanıcısı gibi yetkileri kısıtlı bir kullanıcı ile çalıştırılıyorsa, network gibi yetkisi olmayan kaynaklara ulaşamaz.  Assembly kodu içerisinden, başka bir kullanıcı olarak çalıştırmaya izin vardır ancak burada da, windows un güvenlik kısıtları devreye girer.
CLR çağırırken, dışarıdaki bir kaynağa ulaşabilmek için, SQL Server'a windows kullanıcısı ile bağlanmak gerekir. Windows login'i ile giriş yapılmış olsa da, assembly tarafından giriş yapılan kullanıcının değil, sql server servisini çalıştıran kullanıcının yetkileri kullanılır.

 SQL Server 2008 veritabanlarının  TRUSTWORTHY özellikleri vardır. Bu özellik, veritabanı objelerinin (fonksiyonlar ve prosedürler gibi), dış kaynaklara ulaşıp ulaşamayacağını belirler. TRUSTWORTHY özelliği  ON ise CLR kullanan veritabanı nesneleri, sql server servis kullanıcısının yetkileri dahilinde dış kaynaklara ulaşabilir , eğer "OFF" ise, CLR nesneleri, dış bir kaynağa ulaşmaya çalışırsa, hata alırlar.

Hiç yorum yok: