Jaka jest różnica między EXECUTE AS USER a EXECUTE AS LOGIN, która powoduje, że drugi zachowuje się nieoczekiwanie?

10

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.

gemisigo
źródło
Drugi nie „zawiedzie”, po prostu mówi ci, że login ma przypisaną rolę serwera (sysadmin). Czy sprawdziłeś schematy, o które prosi użytkownik? Miałem to wcześniej, gdzie domyślny schemat dbo nie jest tym, którego twórcy się spodziewali. Lepiej naprawione w kodzie poprzez pełne odwołanie do tabeli
Stuart Moore,

Odpowiedzi:

7

Członek sysadmingrupy jest zawsze mapowany dbo, nawet jeśli ma jawnego użytkownika w bazie danych. Wygląda więc na to, że login WEBjest członkiem sysadmin, dlatego w drugim przypadku USER_NAME()poprawnie się zwraca dbo.

Remus Rusanu
źródło
Sprawdzone i potwierdzone. Rzeczywiście był członkiem sysadmin. Okazało się, że ten raport dotarł do jednego z innych programistów i zamiast prawidłowego rozwiązania po prostu przypisał rolę loginu sysadmin. Nawet nie pomyślałbym o tym, jestem naprawdę rozczarowany. Będziemy mieli poważną rozmowę, kiedy wróci. Nauczyłem się dzisiaj czegoś nowego, dzięki.
gemisigo,
Oznacza to również, że twoja aplikacja (raport?) Ma personifikację uprawnień członka sysadmin. Sprawdź, jak dokładnie w hierarchii uprawnień jest to przyznawane. Jest prawdopodobne, że nawet teraz raport może, jeśli chce, podszyć się pod innego sysadminczł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.
Remus Rusanu
Jeśli aplikacja repor ma uprawnienie IMPERSONATE WEBi WEBzostała usunięta, sysadmindrzwi są zamknięte. Warto jednak to sprawdzić.
Remus Rusanu
Tak, będziemy musieli jeszcze raz sprawdzić wszystko, co ma wpływ na prawa, aby sprawdzić, czy w ten sposób zostały rozwiązane inne problemy. W tej chwili niezbyt szczęśliwy :(
Jeszcze