Có gì khác biệt giữa EXECUTE AS USER và EXECUTE AS LOGIN khiến người thứ hai cư xử bất ngờ?


10

Gần đây tôi đã sử dụng EXECUTE AS LOGIN để kiểm tra xem một người nào đó có thể hoặc không thể sử dụng chức năng bảng trong một trong các cơ sở dữ liệu của chúng tôi. Các xét nghiệm cho thấy anh ta có thể nhưng anh ta liên tục báo cáo thất bại.

Người này sử dụng thông tin đăng nhập 'WEB' để kết nối với cơ sở dữ liệu và anh ta có người dùng 'WEB' trong cơ sở dữ liệu đó được liên kết với thông tin đăng nhập 'WEB', vì vậy tôi đã thử các tập lệnh sau:

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

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

Phần đầu tiên là tốt với kết quả của:

WEB | WEB | WEB | WEB

Nhưng kết quả thứ hai hơi khó hiểu:

dbo | WEB | WEB | WEB

Sự khác biệt giữa EXECUTE AS USER và EXECUTE AS LOGIN khiến cho cái thứ hai thất bại? Tất nhiên, bên cạnh đó, cái đầu tiên là cấp độ cơ sở dữ liệu và cái thứ hai là mạo danh cấp độ máy chủ, về những gì tôi biết và không giải thích tình huống ở đây.


Cái thứ hai không "thất bại", nó chỉ cho bạn biết rằng đăng nhập có vai trò máy chủ (sysadmin) được gán. Bạn đã kiểm tra lược đồ đang được người dùng yêu cầu chưa? Nếu trước đó, lược đồ mặc định dbo không phải là thứ mà các nhà phát triển đã mong đợi. Cố định tốt hơn trong mã bằng cách tham khảo đầy đủ bảng
Stuart Moore

Câu trả lời:


7

Một thành viên của sysadminnhóm luôn được ánh xạ tới dbo, ngay cả khi nó có người dùng rõ ràng trong cơ sở dữ liệu. Vì vậy, có vẻ như đăng nhập WEBlà thành viên của sysadmin, do đó USER_NAME()trả về chính xác dbotrong trường hợp thứ hai.


Đã kiểm tra và xác nhận. Đó là một thành viên của sysadmin thực sự. Hóa ra báo cáo này đã đến tay một trong những nhà phát triển khác và thay vì giải pháp chính xác, anh ta chỉ cần gán vai trò sysadmin đăng nhập. Tôi thậm chí sẽ không nghĩ về điều đó xảy ra, tôi thực sự thất vọng. Chúng ta sẽ có một cuộc nói chuyện nghiêm túc khi anh ấy trở lại. Đã học được một cái gì đó mới ngày hôm nay, cảm ơn.
gemisigo

Điều đó cũng có nghĩa là ứng dụng của bạn (báo cáo?) Có sự cho phép mạo danh thành viên sysadmin. Nhìn vào cách chính xác trong hệ thống phân cấp quyền này được cấp. Có khả năng ngay cả bây giờ báo cáo có thể, nếu nó muốn, mạo danh một sysadminthành viên khác , vì vậy ứng dụng báo cáo là một sysadmin thực tế. I E. ia có thể nâng cao các vectơ tấn công đặc quyền, nó có thể được sử dụng bởi một tin tặc hoặc, nhiều khả năng, bởi nhân viên của bạn.
Remus Rusanu

Nếu ứng dụng repor có sự cho phép TUYỆT VỜI WEBWEBđược gỡ bỏ sysadminthì cửa sẽ bị đóng. Nhưng đáng để kiểm tra không ít.
Remus Rusanu

Có, chúng tôi sẽ phải kiểm tra mọi thứ ảnh hưởng đến quyền một lần nữa để xem liệu có vấn đề nào khác được "khắc phục" theo cách này không. Không vui lắm ngay bây giờ :( Cảm ơn một lần nữa, Remus.
gemisigo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.