Ostatnio używam EXECUTE AS LOGIN, aby sprawdzić, czy dana osoba może lub nie może użyć funkcji tabeli w jednej z naszych baz danych. Testy wykazały, że mógł, ale wielokrotnie zgłaszał niepowodzenie.
Osoba używa loginu „WEB”, aby połączyć się z bazą danych, i ma użytkownika „WEB” w tej bazie danych powiązanego z logowaniem „WEB”, więc wypróbowałem następujące skrypty:
-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
i
-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT
USER_NAME() AS 'user_name'
,SUSER_NAME() AS 'suser_name'
,SUSER_SNAME() AS 'suser_sname'
,SYSTEM_USER AS 'system_user'
GO
REVERT
GO
Pierwsza część była w porządku z wynikiem:
WEB | WEB | WEB | SIEĆ
Ale drugi wynik był nieco mylący:
dbo | WEB | WEB | SIEĆ
Jaka jest różnica między WYKONAJ JAKO UŻYTKOWNIK a WYKONAJ JAKO LOGOWANIE, co powoduje, że drugi się nie powiedzie? Poza tym, oczywiście, pierwszy to personifikacja na poziomie bazy danych, a drugi to personifikacja na poziomie serwera, o czym jestem świadomy i nie wyjaśnia tutaj sytuacji.
źródło
Odpowiedzi:
Członek
sysadmin
grupy jest zawsze mapowanydbo
, nawet jeśli ma jawnego użytkownika w bazie danych. Wygląda więc na to, że loginWEB
jest członkiemsysadmin
, dlatego w drugim przypadkuUSER_NAME()
poprawnie się zwracadbo
.źródło
sysadmin
członka, więc aplikacja raportująca jest de facto administratorem systemu. To znaczy. Możliwe jest także podniesienie uprawnień do ataku, może być użyte przez hakera lub, co bardziej prawdopodobne, przez personel.WEB
iWEB
została usunięta,sysadmin
drzwi są zamknięte. Warto jednak to sprawdzić.