Identifikasi mengapa pengguna dapat menjatuhkan basis data

8

Saya memiliki pengguna server sql yang memiliki kemampuan untuk menjatuhkan basis data apa pun. Saya telah menjalankan kode di bawah ini untuk memeriksa hak-hak yang dimiliki pengguna dalam SQL Server tetapi belum dapat mengidentifikasi bagaimana pengguna memiliki kemampuan untuk menjatuhkan basis data. Apakah ada skrip sql yang dapat membantu saya mengidentifikasi bagaimana pengguna ini dapat menjatuhkan dbs? Apakah ada perintah untuk menolak mereka menjatuhkan basis data? (SSMS tidak menunjukkan pengguna sebagai bagian dari peran 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

Output dari kueri di atas memberikan tiga catatan berikut untuk pengguna jika itu membantu

class_desc object_name permit_name permit_state_desc OBJECT_OR_COLUMN xp_cmdshell EXECUTE GRANT DATABASE NULL CONNECT GRANT
DATABASE NULL CREATE DATABASE GRANT

Kental
sumber
Apakah pengguna ini menjatuhkan basis data?
Zane
Saya dapat menghapus basis data sebagai pengguna itu. Iya. Jika Anda bertanya apakah ada yang menggunakan akun itu dengan penuh rasa, saya lebih baik tidak menunggu untuk melihatnya.
Lumpy
Apa tingkat umum izin yang dimiliki pengguna ini? Juga apakah hanya Database tertentu atau apakah server ini luas?
Zane
2
Lihatlah izin mana yang diperlukan ( msdn.microsoft.com/en-us/library/ms178613.aspx ) dan rekayasa ulang itu.
Thomas Stringer

Jawaban:

4

Kueri yang Anda punya di sana hanya akan mencantumkan izin untuk basis data tempat Anda menjalankannya. Salah satu cara untuk mendapatkan izin untuk menjatuhkan database adalah ALTER ANY DATABASE, yang merupakan izin tingkat server. Untuk memeriksanya, coba kueri ini:

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

Dengan kata lain, pengguna mungkin mendapatkan izin untuk menjatuhkan basis data di tingkat masuk server daripada tingkat pengguna basis data.

mdoyle
sumber
1
Itu adalah Alter izin Database apa pun
Lumpy
Ya, jelas bukan izin yang Anda inginkan Joe dalam bidang Akuntansi.
KeithS
6

Saya sarankan menjalankan kueri ini pada master

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] 

Ini akan memberi Anda ide yang cukup bagus tentang peran yang memiliki akses ke database master Anda dan melihat cuaca atau tidaknya pengguna memiliki peran tersebut. Anda juga dapat menjalankan ini terhadap database Anda yang lain untuk memeriksa izin pengguna pada basis data berdasarkan tingkat basis data. Ini harus menjadi alat penting untuk membantu melacak ini.

Zane
sumber
Skrip yang bagus ....
4

Apakah ada skrip sql yang dapat membantu saya mengidentifikasi bagaimana pengguna ini dapat menjatuhkan dbs?

Saya telah menggunakan ini beberapa kali dengan beberapa hasil yang baik, sumber kode di bawah ini dapat ditemukan di sini :


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

Apakah ada perintah untuk menolak mereka menjatuhkan basis data?

Pergi dokumentasi di sini , persyaratan keamanan bagi pengguna untuk menjatuhkan database dinyatakan sebagai:

Membutuhkan izin KONTROL pada basis data, atau MENGUBAH izin DATABASE, atau keanggotaan dalam peran basis data tetap db_owner

Anda dapat secara eksplisit menolak izin untuk yang disebutkan di atas, tetapi memahami bahwa tingkat penolakan Anda mungkin tidak mempengaruhi seperti yang Anda pikirkan. Saya ingat membaca kertas putih yang membahas bagaimana SQL Server tentang memvalidasi izin pengguna pada saat koneksi tetapi tidak dapat menemukannya sekarang. Jika saya ingat saya mungkin menolak koneksi mereka ke database tetapi kenyataannya pengguna adalah bagian dari sysadminperan yang diutamakan.

Saya akan melihat audit khusus untuk DROP DATABASEperintah agar aman.


sumber
itu adalah mengubah izin basis data apa pun. Terima kasih.
Lumpy