SQL CLR kullanarak güvenlik veya performans riskleri [kapalı]


11

SQL Server'da CLR kullanımında belirli bir güvenlik veya performans riski var mı?


Hayır, SQLCLR kodu bir veritabanında aynı güvenlik bağlamında çalışan eşdeğer bir T-SQL kod modülünden daha fazlasını yapamaz. CLR'yi cahil bir şekilde yasaklamak, daha az RDP hesabı, FileSystem yönetimi ve daha az hak gereksinimi, bakım planları içinde Yedek miras, TDE üzerinden Tam Paket Şifreleme yoluyla güvenliği önemli ölçüde artıran SSISDB dağıtımını da önler ve çevre bölümü aracılığıyla SSIS paketi dağıtımları ve bakım hakkında hiçbir şey söylemez ve SSIS'de CLR gerektiren birçok C # fonksiyonunun olmaması.
Bryan Swan

1
Bu soruyu yeniden açmaya oy verdim çünkü bunun toplumla bir ilgisi olduğuna inanıyorum. Durduğu soru geçerli bir sorudur, çünkü bir DBA'nın CLS güvenlik ayarlarına giriş seviyesi oldukça yüksektir. @SolomonRutzky'nin iyi yazılmış yanıtı, Microsoft tarafından bu basit düzeyde sağlanmayan CLR güvenlik ayarlarına iyi bir giriş sağlar.
John aka hot2use

Yanıtlar:


10

Remus'un da işaret ettiği gibi, cevap hangi işlevselliğin kullanılacağı ve nasıl kullanılacağı bağlamına bağlı olduğu için bir cevap alamayacak kadar geneldir.

"Güvenlik" ile ilgili:

İle işaretlenmiş bir montajda yapılabilecek herhangi bir şey soruyorsanız PERMISSION_SET = SAFE, bulabildiğim herhangi bir sorun yoktur. Ve SQLCLR kullanmaktan xp_cmdshellya da harika (iğneleyici) sp_OA*prokslardan (hatta Genişletilmiş Saklı Prosedürlerden daha "güvenlidir" ama umarım kimse bunlardan hiçbirini yaratmaz).

Pratik olarak "GÜVENLİ" ne anlama geldiğini görmek isterseniz, lütfen şu makaleye bakın: SQLCLR Merdiven Seviye 3: Güvenlik (Genel ve SAFE Meclisleri) (ücretsiz kayıt gereklidir).

İşaretli bir montajda yapılabilecek herhangi bir şey soruyorsanız PERMISSION_SET = EXTERNAL_ACCESS, hangi işlevin kullanıldığına bağlı olarak kesinlikle riskler vardır. Dizinleri ve dosya adlarını (yani salt okunur) okumak için bir rutin yazarsanız, bu sadece görülmesi ve görülmemesi gereken bir konudur. Bir dosyayı silmenize izin veren bir kod yazıyorsanız, risk artar. Ancak bu dış kaynaklarla neler yapılabilir :

  • Kimliğe Bürünme özelliğini kullanıp kullanmadığınız:
    • hiçbir Kimliğe Bürünme, dış kaynaklara erişimin SQL Server hizmetinin "Farklı oturum aç" hesabı aracılığıyla yapıldığı anlamına gelir. Bu hesabın erişimi ne olursa olsun, SQLCLR işleviniz bunu yapabilir.
    • Kimliğe Bürünme işlevinin kullanılması, SQL Server'da Oturum Açma işlevinin çalıştığı anlamına gelir; bu Oturum Açma bir Windows Oturum Açma'ya karşılık geliyorsa, belirli Windows Oturum Açma işleminin yapmasına izin verilen her şeyi yapabilir. SQL Server'da Oturum Açma işlemi bir SQL Server Oturum Açma İşlemi ise, Kimliğe Bürünme özelliğini kullanmaya çalışmak bir hata alır.
  • Harici kaynakta hangi izinler ayarlanır. Dosya sistemi erişimi için bu, NTFS sürücülerindeki ACL'ler aracılığıyla denetlenir.

İle işaretlenmiş bir montajda yapılabilecek herhangi bir şey soruyorsanız PERMISSION_SET = UNSAFE, bu oldukça açık uçlu. Güvenlik veya performanstan daha fazla istikrar ve / veya tutarlı davranış sorunları olduğundan, birçok işlevsellik yalnızca UNSAFE meclislerinde kullanılabilir olarak kabul edilir. Örneğin, UNSAFE montajında ​​yazılabilir bir statik değişken olması mümkündür. SQLCLR sınıfları tüm oturumlarda paylaşıldığından, bu genellikle iyi bir şey değildir. Amacınız verileri tüm oturumlarda bellekte paylaşmak ve yarış koşullarını (ve bol miktarda test yapmayı) planlamaksa, bu davranışı beklediğiniz için iyi olmalısınız. Ancak, yazılabilir bir statik değişkenin, belirli bir oturum için bir değeri tekrar aramak veya tekrar hesaplamak zorunda kalmaması için önbelleğe almasını istiyorsanız ve diğer oturumların bu değeri okuduğunu ve muhtemelen üzerine yazdığını bilmiyorsanız, bu bir sorun olurdu.

Ancak birisinin Kayıt Defterine yazmasından endişe ediyorsanız, ancak aslında Kayıt Defterine yazan herhangi bir kodunuz yoksa, muhtemelen bu ;-) için endişelenmenize gerek yoktur.

EXTERNAL_ACCESS ve UNSAFE'nin pratikte nasıl çalıştığına ve TRUSTWORTHY ONAsimetrik Anahtar veya Sertifika Tabanlı Giriş kullanma ile ayar (tercih edilmeyen) ile fark arasındaki farka bakmak isterseniz , lütfen bu makaleye bakın: SQLCLR Seviye 4 Merdivenleri: Güvenlik (HARİCİ ve UNSAFE Meclisleri) (ücretsiz kayıt gereklidir).

"Performans" ile ilgili:

Tüm bunlar ne yapmaya çalıştığınız ve bunu yapmaya nasıl devam ettiğinizle ilgilidir. Bazı şeyler vardır çok daha hızlı SQLCLR içinde ve yavaş bazı şeyler. Ancak T-SQL'de olduğu gibi, biraz basit ve / veya verimli bir görev almak ve işleri yanlış yaparak karmaşık ve / veya verimsiz hale getirmek mümkündür. Ancak SQL CLR'yi kullanmak doğası gereği daha yavaş değildir.


6

SQLCLR montajları güvenlik üç erişim seviyeleri ile monte edilebilir: SAFE | EXTERNAL_ACCESS | UNSAFE. Bu çok belgelenmiştir, MontajlaraCREATE ASSEMBLY ve Tasarımlara bakınız :

Derleme Güvenliğini Yönetme
Yönetilen kod çalıştırıldığında, bir derlemenin .NET Code Access Security tarafından korunan kaynaklara ne kadar erişebileceğini denetleyebilirsiniz. Bunu, bir derleme oluştururken veya değiştirirken üç izin kümesinden birini belirterek yaparsınız: SAFE, EXTERNAL_ACCESS veya UNSAFE.

SAFE
SAFE varsayılan izin kümesidir ve en kısıtlayıcıdır. SAFE izinlerine sahip bir derleme tarafından çalıştırılan kod, dosyalar, ağ, ortam değişkenleri veya kayıt defteri gibi harici sistem kaynaklarına erişemez. SAFE kodu yerel SQL Server veritabanlarındaki verilere erişebilir veya yerel veritabanları dışındaki kaynaklara erişmeyi içermeyen hesaplamalar ve iş mantığı gerçekleştirebilir.
Çoğu derleme, SQL Server dışındaki kaynaklara erişmek zorunda kalmadan hesaplama ve veri yönetimi görevlerini yerine getirir. Bu nedenle, montaj izin kümesi olarak SAFE'yi öneririz.

EXTERNAL_ACCESS
EXTERNAL_ACCESS, montajların dosyalar, ağlar, Web hizmetleri, çevresel değişkenler ve kayıt defteri gibi bazı harici sistem kaynaklarına erişmesine izin verir. Yalnızca EXTERNAL ACCESS izinlerine sahip SQL Server oturum açma işlemleri EXTERNAL_ACCESS derlemeleri oluşturabilir. SAFE ve EXTERNAL_ACCESS derlemeleri yalnızca doğrulanabilir tipte güvenli kod içerebilir. Bu, bu derlemelerin sınıflara yalnızca tür tanımı için geçerli olan iyi tanımlanmış giriş noktaları üzerinden erişebileceği anlamına gelir. Bu nedenle, koda ait olmayan bellek arabelleklerine rasgele erişemezler. Ayrıca, SQL Server işleminin sağlamlığı üzerinde olumsuz etkisi olabilecek işlemleri gerçekleştiremezler.

UNSAFE
UNSAFE, derlemelere SQL Server içindeki ve dışındaki kaynaklara sınırsız erişim sağlar. UNSAFE derlemesinden çalışan kod yönetilmeyen kodu çağırabilir. Ayrıca, UNSAFE belirtilmesi, derlemedeki kodun CLR doğrulayıcısı tarafından güvenli olmayan tip olarak kabul edilen işlemleri gerçekleştirmesine olanak tanır. Bu işlemler, SQL Server işlem alanındaki bellek arabelleklerine kontrolsüz bir şekilde erişebilir. UNSAFE derlemeleri, SQL Server'ın veya ortak dil çalışma zamanının güvenlik sistemini de bozabilir. UNSAFE izinleri yalnızca deneyimli geliştiriciler veya yöneticiler tarafından yüksek düzeyde güvenilen derlemelere verilmelidir. Yalnızca sysadmin sabit sunucu rolünün üyeleri UNSAFE derlemeleri oluşturabilir.

İzin verilen CLR öznitelikleri üzerinde daha fazla kısıtlama vardır ve yalnızca .Net Framework Meclislerinin bir alt kümesi desteklenir. Yine, bağlantılı belgelere bakın.

Performansa gelince, en önemli düşünce, SQL Server'ın CLR değil kooperatif çoklu görev ortamı olduğunu hatırlamaktır. SQLCLR kodu gerekir diyoruz Thread.BeginThreadAffinity()zaman o (engelleme dahil) süresi için domuz CPU. Adam Machanic'in bu konuda mükemmel bir sunumu var, Data, Faster'ı izleyin : SQLCLR ile Microsoft SQL Server Performans Teknikleri .

Konu çok geniş ve soru belirsiz. SQLCLR, başka hiçbir özelliğin eşleşemeyeceği bazı benzersiz görevleri gerçekleştirebilir. Ve SQLCLR, SQL Server cephaneliğindeki başka bir silahtır, performans veya güvenlikle kendinizi ayağınıza çekebilirsiniz. Dokümanları okuyun.


Bu Remus için teşekkürler. Sorunun belirsiz olduğunu biliyorum, ancak bununla ilgili herhangi bir güvenlik sorunu var mı? teşekkürler
SQLBen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.