Utworzyłem widok w bazie danych 1 na podstawie tabel w bazie danych 2. Dałem SELECT
zgodę użytkownikowi, który ma dostęp tylko do bazy danych 1. Użytkownik nie może uruchomić tego widoku, ponieważ nie ma konta w bazie danych2. Jak mogę rozwiązać ten problem? Nie chcę tworzyć konta w bazie danych2.
11
TRUSTWORTHY ON
lub logowaniu aplikacji jakosa
. Łańcuchy własnościowe DB iTRUSTWORTHY
istnieją głównie dlatego, że w tamtym czasie były jedynym rozwiązaniem. Ale teraz, nawet jeśli nie jest to duże ryzyko, Łańcuch DB jest z pewnością niepotrzebnym ryzykiem, ponieważ podpisywanie modułów nie jest takie trudne. A jeśli ktoś polega na tworzeniu łańcuchów DB, a następnie korzysta z Dynamicznego SQL, to jest większe prawdopodobieństwoTRUSTWORTHY ON
, że to naprawi, podczas gdy przy podpisywaniu modułów nie złamie się.DB_CHAINING
nie jest to bardziej ryzykowne niż tworzenie łańcuchów własności w obrębie bazy danych, gdy obiekty i tak powinny znajdować się w tej samej bazie danych.DB_CHAINING
jest tak ryzykowne.Odpowiedzi:
Jest to łatwe do osiągnięcia w bardzo bezpieczny sposób przy użyciu podpisywania modułów. Będzie to podobne do poniższych dwóch moich odpowiedzi, również tutaj na DBA.StackExchange, które podają przykłady wykonania tego:
Zabezpieczenia procedur przechowywanych z wykonywaniem jako, zapytania do wielu baz danych i podpisywanie modułów
Uprawnienia w wyzwalaczach podczas korzystania z certyfikatów między bazami danych
Różnica w tym konkretnym pytaniu polega na tym, że dotyczy ono Widoku i Widoku nie można podpisać. Musisz więc zmienić widok na wielowątkową funkcję tabelową (TVF), ponieważ można je podpisać i uzyskać do nich dostęp podobnie jak widok (cóż,
SELECT
dostęp).Poniższy przykładowy kod pokazuje robienie dokładnie tego, co jest wymagane w pytaniu, ponieważ Login / Użytkownik „RestrictedUser” ma dostęp tylko do „DatabaseA” i jest w stanie uzyskać dane z „DatabaseB”. Działa to tylko poprzez wybranie z tego jednego TVF i tylko z powodu jego podpisania.
Realizacji tego typu dostępu cross-bazy danych, jednocześnie korzystając z widoku, a nie dając użytkownikowi żadnych dodatkowych uprawnień, wymagałoby umożliwiając Cross-bazy danych własności łańcuchowym. Jest to o wiele mniej bezpieczne, ponieważ jest całkowicie otwarte dla wszystkich obiektów między obiema bazami danych (nie można go ograniczyć do niektórych obiektów i / lub użytkowników). Podpisywanie modułów pozwala tylko temu jednemu TVF na
SELECT
dostęp między bazami danych (użytkownik nie ma pozwolenia, TVF ma), a użytkownicy, którzy nie mogą z TVF, nie mają w ogóle dostępu do „Bazy danychB”.Wszystkie powyższe kroki odtwarzają bieżącą sytuację: użytkownik ma dostęp do bazy danych A, ma uprawnienia do interakcji z obiektem w bazie danych A, ale dostaje błąd z powodu tego, że obiekt w bazie danych uzyskuje dostęp do czegoś w bazie danych b, do którego użytkownik nie ma dostępu.
Poniższe kroki konfigurują śpiewanie modułów. Wykonuje następujące czynności:
SELECT
uprawnienia do tabeli w bazie danych B użytkownikowi opartemu na certyfikatachKonfiguracja podpisywania modułów:
JEŚLI DOSTĘP POTRZEBUJE PRZEZ WIDOK, z jakiegokolwiek powodu, możesz po prostu utworzyć Widok, który wybierze z TVF pokazanego powyżej. W tej sytuacji
SELECT
dostęp nie musi być przyznany TVF, a jedynie widokowi, jak pokazano poniżej:A teraz, aby to przetestować:
Aby uzyskać więcej informacji na temat podpisywania modułów, odwiedź: https://ModuleSigning.Info/
źródło
ALTER CERTIFICATE ... DROP PRIVATE KEY
klucz prywatny zniknie, jeśli nie utworzysz go najpierw do pliku przy użyciu CERTYFIKATU BACKUP . Ale klucz publiczny jest nadal włączonysys.certificates
. A klucz publiczny nie potrzebuje hasła. Tylko użycie klucza prywatnego do podpisania modułu wymaga hasła (które jest takie samo na wszystkich serwerach, w przeciwieństwie do ochrony za pomocą klucza głównego).