Xác định lý do tại sao người dùng có thể bỏ cơ sở dữ liệu


8

Tôi có một người dùng máy chủ sql có khả năng bỏ bất kỳ cơ sở dữ liệu nào. Tôi đã chạy mã bên dưới để kiểm tra các quyền mà người dùng có trong SQL Server nhưng không thể xác định cách người dùng có khả năng bỏ cơ sở dữ liệu. Có một kịch bản sql có thể giúp tôi xác định làm thế nào người dùng này có thể thả dbs? Có một lệnh để từ chối họ bỏ bất kỳ cơ sở dữ liệu? (SSMS không hiển thị người dùng như một phần của vai trò dbcreator)

select USER_NAME(p.grantee_principal_id) AS principal_name,
    dp.type_desc AS principal_type_desc,
    p.class_desc,
    OBJECT_NAME(p.major_id) AS object_name,
    p.permission_name,
    p.state_desc AS permission_state_desc 
from    sys.database_permissions p
inner   JOIN sys.database_principals dp
on     p.grantee_principal_id = dp.principal_id
order by principal_name

Đầu ra của truy vấn trên cung cấp ba bản ghi sau cho người dùng nếu nó hữu ích

class_desc object_name allow_name allow_state_desc OBJECT_OR_COLUMN xp_cmdshell EXECUTE GRANT DATABASE NULL CONNECT GRANT
DATABASE NULL CREATE DATABASE GRANT


Là người dùng này bỏ cơ sở dữ liệu?
Zane

Tôi có thể bỏ cơ sở dữ liệu như người dùng đó. Đúng. Nếu bạn đang hỏi liệu có ai đã sử dụng tài khoản một cách vui vẻ thì tôi không muốn chờ xem.
sần

Mức độ cho phép chung của người dùng này là gì? Ngoài ra, nó chỉ là cơ sở dữ liệu nhất định hoặc máy chủ này rộng?
Zane

2
Hãy xem các quyền nào được yêu cầu ( msdn.microsoft.com/en-us/l Library / ms178613.aspx ) và thiết kế ngược lại.
Thomas Stringer

Câu trả lời:


4

Truy vấn bạn có ở đó sẽ chỉ liệt kê các quyền cho cơ sở dữ liệu mà bạn chạy nó. Một cách để có được quyền bỏ cơ sở dữ liệu là THAY ĐỔI BẤT CỨ dữ liệu nào, đó là quyền cấp máy chủ. Để kiểm tra chúng, hãy thử truy vấn này:

SELECT 
  [srvprin].[name] [server_principal],
  [srvprin].[type_desc] [principal_type],
  [srvperm].[permission_name],
  [srvperm].[state_desc] 
FROM [sys].[server_permissions] srvperm
  INNER JOIN [sys].[server_principals] srvprin
    ON [srvperm].[grantee_principal_id] = [srvprin].[principal_id]
WHERE [srvprin].[type] IN ('S', 'U', 'G')
ORDER BY [server_principal], [permission_name];

Nói cách khác, người dùng có thể được phép bỏ cơ sở dữ liệu ở cấp đăng nhập máy chủ thay vì cấp người dùng cơ sở dữ liệu.


1
Đó là sự thay đổi bất kỳ quyền cơ sở dữ liệu nào
Lumpy

Vâng, chắc chắn không phải là sự cho phép mà bạn muốn Joe trong Kế toán có.
KeithS

6

Tôi sẽ đề nghị chạy truy vấn này trên bản gốc

SELECT  
    [UserName] = CASE princ.[type] 
                    WHEN 'S' THEN princ.[name]
                    WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI
                 END,
    [UserType] = CASE princ.[type]
                    WHEN 'S' THEN 'SQL User'
                    WHEN 'U' THEN 'Windows User'
                 END,  
    [DatabaseUserName] = princ.[name],       
    [Role] = null,      
    [PermissionType] = perm.[permission_name],       
    [PermissionState] = perm.[state_desc],       
    [ObjectType] = obj.type_desc,--perm.[class_desc],       
    [ObjectName] = OBJECT_NAME(perm.major_id),
    [ColumnName] = col.[name]
FROM    
    --database user
    sys.database_principals princ  
LEFT JOIN
    --Login accounts
    sys.login_token ulogin on princ.[sid] = ulogin.[sid]
LEFT JOIN        
    --Permissions
    sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id]
LEFT JOIN
    --Table columns
    sys.columns col ON col.[object_id] = perm.major_id 
                    AND col.[column_id] = perm.[minor_id]
LEFT JOIN
    sys.objects obj ON perm.[major_id] = obj.[object_id]
WHERE 
    princ.[type] in ('S','U')
UNION
--List all access provisioned to a sql user or windows user/group through a database or application role
SELECT  
    [UserName] = CASE memberprinc.[type] 
                    WHEN 'S' THEN memberprinc.[name]
                    WHEN 'U' THEN ulogin.[name] COLLATE Latin1_General_CI_AI
                 END,
    [UserType] = CASE memberprinc.[type]
                    WHEN 'S' THEN 'SQL User'
                    WHEN 'U' THEN 'Windows User'
                 END, 
    [DatabaseUserName] = memberprinc.[name],   
    [Role] = roleprinc.[name],      
    [PermissionType] = perm.[permission_name],       
    [PermissionState] = perm.[state_desc],       
    [ObjectType] = obj.type_desc,--perm.[class_desc],   
    [ObjectName] = OBJECT_NAME(perm.major_id),
    [ColumnName] = col.[name]
FROM    
    --Role/member associations
    sys.database_role_members members
JOIN
    --Roles
    sys.database_principals roleprinc ON roleprinc.[principal_id] = members.[role_principal_id]
JOIN
    --Role members (database users)
    sys.database_principals memberprinc ON memberprinc.[principal_id] = members.[member_principal_id]
LEFT JOIN
    --Login accounts
    sys.login_token ulogin on memberprinc.[sid] = ulogin.[sid]
LEFT JOIN        
    --Permissions
    sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id]
LEFT JOIN
    --Table columns
    sys.columns col on col.[object_id] = perm.major_id 
                    AND col.[column_id] = perm.[minor_id]
LEFT JOIN
    sys.objects obj ON perm.[major_id] = obj.[object_id]
UNION
--List all access provisioned to the public role, which everyone gets by default
SELECT  
    [UserName] = '{All Users}',
    [UserType] = '{All Users}', 
    [DatabaseUserName] = '{All Users}',       
    [Role] = roleprinc.[name],      
    [PermissionType] = perm.[permission_name],       
    [PermissionState] = perm.[state_desc],       
    [ObjectType] = obj.type_desc,--perm.[class_desc],  
    [ObjectName] = OBJECT_NAME(perm.major_id),
    [ColumnName] = col.[name]
FROM    
    --Roles
    sys.database_principals roleprinc
LEFT JOIN        
    --Role permissions
    sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id]
LEFT JOIN
    --Table columns
    sys.columns col on col.[object_id] = perm.major_id 
                    AND col.[column_id] = perm.[minor_id]                   
JOIN 
    --All objects   
    sys.objects obj ON obj.[object_id] = perm.[major_id]
WHERE
    --Only roles
    roleprinc.[type] = 'R' AND
    --Only public role
    roleprinc.[name] = 'public' AND
    --Only objects of ours, not the MS objects
    obj.is_ms_shipped = 0
ORDER BY
    princ.[Name],
    OBJECT_NAME(perm.major_id),
    col.[name],
    perm.[permission_name],
    perm.[state_desc],
    obj.type_desc--perm.[class_desc] 

Điều này sẽ cung cấp cho bạn một ý tưởng khá tốt về các vai trò có quyền truy cập vào cơ sở dữ liệu chính của bạn và xem thời tiết hay không người dùng có bất kỳ vai trò nào trong số đó. Bạn cũng có thể chạy nó với bất kỳ cơ sở dữ liệu nào khác để kiểm tra quyền của người dùng trên cơ sở dữ liệu theo cấp độ cơ sở dữ liệu. Đây phải là một công cụ quan trọng để giúp theo dõi điều này.


Kịch bản hay ....

4

Có một kịch bản sql có thể giúp tôi xác định làm thế nào người dùng này có thể thả dbs?

Tôi đã sử dụng điều này một vài lần với một số kết quả tốt, nguồn mã dưới đây có thể được tìm thấy ở đây :


SELECT SP1.[name] AS 'Login', 'Role: ' + SP2.[name] COLLATE DATABASE_DEFAULT AS 'ServerPermission'  
FROM sys.server_principals SP1 
  JOIN sys.server_role_members SRM 
    ON SP1.principal_id = SRM.member_principal_id 
  JOIN sys.server_principals SP2 
    ON SRM.role_principal_id = SP2.principal_id 
UNION ALL 
SELECT SP.[name] AS 'Login' , SPerm.state_desc + ' ' + SPerm.permission_name COLLATE DATABASE_DEFAULT AS 'ServerPermission'  FROM sys.server_principals SP  
  JOIN sys.server_permissions SPerm  
    ON SP.principal_id = SPerm.grantee_principal_id  
ORDER BY [Login], [ServerPermission];

Có một lệnh để từ chối họ bỏ bất kỳ cơ sở dữ liệu?

Tiếp tục với tài liệu ở đây , các yêu cầu bảo mật cho người dùng bỏ cơ sở dữ liệu được nêu là:

Yêu cầu quyền KIỂM SOÁT trên cơ sở dữ liệu hoặc THAY ĐỔI BẤT K DAT quyền truy cập hoặc tư cách thành viên trong vai trò cơ sở dữ liệu cố định db_owner

Bạn có thể từ chối một cách rõ ràng sự cho phép đối với một người được đề cập ở trên nhưng hiểu rằng mức độ bạn từ chối nó có thể không ảnh hưởng như bạn nghĩ. Tôi nhớ lại việc đọc một tờ giấy trắng hướng dẫn cách SQL Server xác thực các quyền của người dùng khi kết nối nhưng không thể xác định vị trí của nó ngay bây giờ. Nếu tôi nhớ lại, tôi có thể từ chối họ kết nối với cơ sở dữ liệu nhưng thực tế người dùng là một phần của sysadminvai trò được ưu tiên.

Tôi sẽ xem xét kiểm toán cụ thể để DROP DATABASElệnh được an toàn.


đó là sự thay đổi bất kỳ sự cho phép cơ sở dữ liệu. Cảm ơn bạn.
sần
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.