2014-11-18 10 views
5

otrzymuję następujące błędy w mojej bazy danych rozwój:Zagrożenia bezpieczeństwa ustalania wiarygodne = na serwer sql 2012

A .NET Framework error occurred during execution of user-defined routine or aggregate "SpCreateTable": 
System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host. 

The protected resources (only available with full trust) were: All 
The demanded resources were: Synchronization, ExternalThreading 

Czy poprawne rozwiązanie, aby ustawić wiarygodne = o? Jakie są obawy związane z bezpieczeństwem?

Odpowiedz

8

Właściwość bazy danych (po ustawieniu na ON) zasadniczo deklaruje programowi SQL Server, że kod zawarty w tej bazie danych i wykonujący w podszytym kontekście, powinien mieć możliwość dotarcia poza tę bazę danych, przy jednoczesnym zachowaniu tego podszytego kontekstu bezpieczeństwa . Zezwala również na konfigurowanie zespołów SQLCLR w tej bazie danych na i UNSAFE, niezależnie od tego, czy ten kod sięga poza serwer (poza tym: dostęp do sieci, dostęp do systemu plików, dostęp do rejestru, dostęp do środowiska itp.).

Jest to raczej rodzajowy sposób na to, ponieważ obejmuje cały kod w bazie danych. Używanie certyfikatów i/lub kluczy asymetrycznych do podpisywania modułów - proc i/lub złożeń - pozwala na bardziej szczegółową kontrolę nad tym, jaki kod ma odpowiednie uprawnienia.

Ustawienie bazy danych na TRUSTWORTHY pozwala również na rozpoczęcie procesu w tej bazie danych na poziomie serwera i/lub na inne bazy danych. Zwykle proces jest zamknięty/poddany kwarantannie w bazie danych, w której został uruchomiony. Jeśli baza danych jest własnością logowania "sa", wówczas każdy proces zainicjowany w tej bazie danych i uruchomiony jako "dbo" będzie miał faktycznie uprawnienia "sa" (yikes!).

Zamiast próbować tutaj opisać, w wysokości szczegółowości wymaganym do pełni komunikować specyfiki o personifikacji, wydłużanie tego personifikacji, podpisywanie modułów itp, polecam uważne następujące zasoby na ten temat:

Należy unikać ustawiania bazy danych na TRUSTWORTHY tak bardzo, jak to możliwe. Jeśli naprawdę musisz mieć wielowątkowość/asynchroniczne wywołania I jeśli masz kod źródłowy i kompilujesz złożenie, to nie mogę wymyślić powodu, aby użyć opcji SET TRUSTWORTHY ON. Zamiast tego, należy podpisać zespół hasłem i użyć następujących poleceń ustawić preferowaną metodą pozwalając EXTERNAL_ACCESS i UNSAFE zespoły:

USE [master]; 
    CREATE ASYMMETRIC KEY [ClrPermissionsKey] 
    AUTHORIZATION [dbo] 
    FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll'; 

CREATE LOGIN [ClrPermissionsLogin] 
    FROM ASYMMETRIC KEY [ClrPermissionsKey]; 

GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin]; 

Raz, że jest na swoim miejscu, można przejść do bazy danych, gdzie Twój zespół został załadowany i uruchom:

ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE; 

Albo mogłeś zawarte WITH PERMISSION_SET = UNSAFE na końcu komendy CREATE ASSEMBLY.

+0

Są one faktycznie podpisane za pomocą klucza asymetrycznego i ustawione na niebezpieczne, ale nadal otrzymują ten błąd. nie wiesz, dlaczego – cdub

+2

+1 za oferowanie rozwiązania zastępczego, ale tak naprawdę nie rozwiązałeś prawdziwego pytania (konkretne i jednoznaczne ryzyko dotyczące TRUSTWORTHY w ogóle). –

+0

@chris Czy na pewno zestaw jest ustawiony na UNSAFE? Wystąpił błąd, który pojawia się, gdy zestaw nie jest ustawiony jako niebezpieczny. Lub, gdy został ustawiony na UNSAFE, ale potem Login został usunięty lub przynajmniej usunięto uprawnienie "UNSAFE ASSEMBLY". Jeśli tak nie jest, to jakie metody ramowe wywołujesz w swojej procedurze proc? –

0

Ustawienie TRUSTWORTHY ON otwiera potencjalne naruszenie bezpieczeństwa, umożliwiając każdemu kodowi osiągnięcie zasobów zewnętrznych w kontekście personifikacji bazy danych. Jest całkowicie w porządku, aby zezwolić twojemu DB na dostęp do chronionych udziałów sieciowych za pomocą kodu, nad którym masz kontrolę, jednak może to nie być mądre, aby zezwolić na to samo dla dowolnego kodu.

Ustawienie tej flagi powoduje otwarcie drzwi dla każdego, kto uzyska uprawnienia dbo dla konkretnej bazy danych, ponieważ może zarejestrować dowolny zestaw i będzie miał kontekst personifikacji DB według własnego uznania.