Apa perbedaan antara EXECUTE AS USER dan EXECUTE AS LOGIN yang membuat yang kedua berperilaku tidak terduga?


10

Baru-baru ini saya telah menggunakan EXECUTE AS LOGIN untuk memeriksa apakah orang tertentu bisa atau tidak bisa menggunakan fungsi tabel di salah satu database kami. Tes menunjukkan bahwa dia bisa tetapi dia berulang kali melaporkan kegagalan.

Orang tersebut menggunakan login 'WEB' untuk terhubung ke database dan dia memiliki pengguna 'WEB' dalam database yang terkait dengan login 'WEB' jadi saya mencoba skrip berikut:

-- 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

dan

-- 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

Bagian pertama baik-baik saja dengan hasil:

WEB | WEB | WEB | WEB

Tetapi hasil kedua agak membingungkan:

dbo | WEB | WEB | WEB

Apa perbedaan antara EXECUTE AS USER dan EXECUTE AS LOGIN yang membuat yang kedua gagal? Selain itu, tentu saja, yang pertama adalah tingkat basis data dan yang kedua adalah peniruan tingkat server, dari apa yang saya ketahui dan tidak menjelaskan situasi di sini.


Yang ke-2 tidak "gagal", itu hanya memberitahu Anda bahwa login memiliki peran server (sysadmin) yang ditugaskan. Sudahkah Anda memeriksa skema yang diminta oleh pengguna? Pernahkah sebelumnya di mana skema default dbo bukan yang devs harapkan. Lebih baik diperbaiki dalam kode dengan merujuk sepenuhnya tabel
Stuart Moore

Jawaban:


7

Seorang anggota sysadmingrup selalu dipetakan ke dbo, bahkan jika ia memiliki pengguna eksplisit dalam database. Jadi sepertinya login WEBadalah anggota sysadmin, maka USER_NAME()dengan benar kembali dbodalam kasus kedua.


Diperiksa dan dikonfirmasi. Itu memang anggota sysadmin. Ternyata laporan ini telah mencapai salah satu pengembang lain dan alih-alih solusi yang benar, ia hanya menetapkan peran sysadmin masuk. Aku bahkan tidak akan memikirkan hal itu terjadi, aku benar-benar kecewa. Kita akan bicara serius ketika dia kembali. Belajar sesuatu yang baru hari ini, terima kasih.
gemisigo

Ini juga berarti bahwa aplikasi Anda (laporan?) Memiliki izin palsu pada anggota sysadmin. Lihatlah bagaimana tepatnya dalam hierarki izin ini diberikan. Kemungkinan bahwa bahkan sekarang laporan dapat, jika diinginkan, menyamar sebagai sysadminanggota lain , sehingga aplikasi pelaporan adalah sysadmin de-facto. Yaitu. Ia mungkin meningkatkan vektor serangan hak istimewa, dapat digunakan oleh peretas atau, lebih mungkin, oleh staf Anda.
Remus Rusanu

Jika aplikasi repor memiliki izin IMPERSONATE WEBdan WEBdihapus dari sysadminpintu itu ditutup. Tapi ada baiknya memeriksa tidak kurang.
Remus Rusanu

Ya, kami harus memeriksa semua yang mempengaruhi hak sekali lagi untuk melihat apakah ada masalah lain yang "diperbaiki" dengan cara ini. Tidak terlalu senang sekarang :( Terima kasih lagi, Remus.
gemisigo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.