Saya ingin menulis kueri pada sql 2008 yang akan melaporkan semua pengguna yang memiliki akses ke database tertentu, atau objek dalam database seperti tabel, tampilan, dan prosedur tersimpan, baik secara langsung atau karena peran, dll. Ini laporan akan digunakan untuk keperluan audit keamanan. Tidak yakin apakah ada yang memiliki kueri yang sepenuhnya sesuai dengan kebutuhan saya, tapi semoga sesuatu yang akan memberi saya awal yang baik. Baik sql 2008, 2005 atau 2000 akan dilakukan, saya mungkin dapat mengonversi sesuai kebutuhan.
192
Jawaban:
Ini adalah celah pertama saya di sebuah kueri, berdasarkan saran Andomar. Kueri ini dimaksudkan untuk memberikan daftar izin yang telah diterapkan pengguna secara langsung ke akun pengguna, atau melalui peran yang dimiliki pengguna.
sumber
login_token
diubah menjadiuser_token
Berikut ini adalah versi lengkap dari permintaan Jeremy pada Agustus 2011 dengan perubahan yang disarankan oleh Brad (Okt 2011) dan iw.kuchin (Mei 2012) dimasukkan:
[ObjectType]
dan[ObjectName]
untuk skema.[ObjectType]
itu lebih baik menggunakanobj.type_desc
hanya untukOBJECT_OR_COLUMN
kelas izin. Untuk semua kasus lain gunakanperm.[class_desc]
.IMPERSONATE
izin.sys.login_token
dengansys.server_principals
karena akan menampilkan juga SQL Login, tidak hanya yang Windows.sys
dan INFORMATION_SCHEMA.Semoga ini menyelamatkan orang lain satu atau dua jam dari kehidupan mereka.
:)
sumber
sys.login_token
jugasys.server_principals
tidak didukung dan perlu diganti dengansys.user_token
Dari SQL Server 2005 dan seterusnya, Anda dapat menggunakan tampilan sistem untuk itu. Misalnya, kueri ini mencantumkan semua pengguna dalam database, dengan haknya:
Sadarilah bahwa pengguna juga dapat memiliki hak melalui peran. Misalnya,
db_data_reader
peran tersebut memberikanselect
hak pada sebagian besar objek.sumber
select * from sys.database_principals where type_desc = 'EXTERNAL_GROUP'
), sedangkan jawaban yang diterima tidak, bahkan setelah diperbaikisys.user_token
.SELECT PrincipalName = p.[name], p.[type_desc], dp.[permission_name], dp.[state_desc], CASE dp.class_desc WHEN 'DATABASE' THEN DB_NAME(dp.major_id) WHEN 'SCHEMA' THEN SCHEMA_NAME(dp.major_id) WHEN 'OBJECT_OR_COLUMN' THEN CONCAT_WS('.', OBJECT_SCHEMA_NAME(dp.major_id), OBJECT_NAME(dp.major_id), c.[name]) END FROM sys.database_principals AS p LEFT OUTER JOIN sys.database_permissions AS dp ON p.principal_id = dp.grantee_principal_id LEFT OUTER JOIN sys.columns AS c ON dp.major_id = c.[object_id] AND dp.minor_id = c.column_id
Tidak dapat mengomentari jawaban yang diterima sehingga saya akan menambahkan beberapa komentar di sini:
sys.objects
tabel referensi MS hanya berisi objek skop. Jadi untuk mendapatkan info tentang objek "tingkat lebih tinggi" (yaitu skema dalam kasus kami), Anda perlu menggunakansys.schemas
tabel.[ObjectType]
itu lebih baik menggunakanobj.type_desc
hanya untukOBJECT_OR_COLUMN
kelas izin. Untuk semua kasus lain gunakanperm.[class_desc]
IMPERSONATE
. Untuk mendapatkan info tentang menirukan satu harusLEFT JOIN
dengansys.database_principals
diperm.major_id = imp.principal_id
sys.login_token
dengansys.server_principals
karena akan menunjukkan juga SQL Login, tidak hanya yang Windows'G'
jenis-jenis utama yang diizinkan untuk mengizinkan grup-grup Windowssys
danINFORMATION_SCHEMA
dari tabel yang dihasilkan, karena pengguna ini hanya digunakan untuk layananSaya akan memposting skrip pertama dengan semua perbaikan yang diusulkan, bagian lain juga harus diubah:
sumber
sysadmin
+securityadmin
dipetakan sepertidbo
untuk setiap DB di server + ada izin serverCONTROL SERVER
yang dapat diberikan kepada pengguna. Izin ini memberikan hak yang hampir sama dengan hak ciptasysadmin
.Script yang luar biasa Jeremy dan kontributor! Terima kasih!
Saya memiliki banyak pengguna, jadi menjalankan ini untuk semua pengguna adalah mimpi buruk. Saya tidak bisa menambahkan komentar, jadi saya memposting keseluruhan skrip dengan perubahan. Saya menambahkan variabel + di mana klausa sehingga saya dapat mencari apa pun yang cocok dengan hingga 5 karakter dalam nama pengguna (atau semua pengguna bila dibiarkan kosong). Tidak ada yang istimewa, tapi saya pikir ini akan sangat membantu dalam beberapa kasus penggunaan.
sumber
Jawaban lain yang saya lihat melewatkan beberapa izin yang mungkin ada dalam database. Kueri pertama dalam kode di bawah ini akan mendapatkan izin tingkat basis data untuk semua yang bukan objek sistem. Ini menghasilkan pernyataan GRANT yang sesuai juga. Kueri kedua mendapatkan semua peran peran.
Ini harus dijalankan untuk setiap database, tetapi terlalu lama untuk digunakan dengan sp_MSforeachdb. Jika Anda ingin melakukan itu, Anda harus menambahkannya ke database master sebagai prosedur tersimpan sistem.
Untuk mencakup semua kemungkinan Anda juga harus memiliki skrip yang memeriksa izin tingkat server.
UPDATE: Pertanyaan berikut akan mengambil izin tingkat server dan keanggotaan.
sumber
Ini versi saya, diadaptasi dari yang lain. Saya menghabiskan 30 menit barusan mencoba mengingat bagaimana saya menemukan ini, dan jawaban @Jeremy tampaknya menjadi inspirasi utama. Saya tidak ingin memperbarui jawaban Jeremy, kalau-kalau saya memperkenalkan bug, jadi saya memposting versi saya di sini.
Saya menyarankan memasangkan skrip lengkap dengan beberapa inspirasi yang diambil dari Kenneth Fisher's T-SQL Tuesday: Apa Izin yang Dimiliki Pengguna Tertentu? : Ini memungkinkan Anda untuk menjawab pertanyaan kepatuhan / audit dari bawah ke atas, bukan dari atas ke bawah.
Untuk memahami apa yang tercakup di sini, pertimbangkan
Contoso\DB_AdventureWorks_Accounting
Windows AD Group dengan anggotaContoso\John.Doe
. John.Doe mengautentikasi ke AdventureWorks melalui server_principalContoso\DB_AdventureWorks_Logins
Windows AD Group. Jika seseorang bertanya kepada Anda, "Izin apa yang dimiliki John.Doe?", Anda tidak dapat menjawab pertanyaan itu hanya dengan skrip di bawah ini. Anda harus mengulangi setiap baris yang dikembalikan oleh skrip di bawah ini dan bergabung dengan skrip di atas. (Anda mungkin perlu menormalkanname
nilai basi melalui mencari SID di penyedia Direktori Aktif Anda.)Ini skripnya, tanpa memasukkan logika pencarian terbalik.
sumber
sumber
Prosedur yang disimpan GetPermissions di atas adalah baik tetapi menggunakan Sp_msforeachdb yang berarti bahwa itu akan rusak jika SQL Instance Anda memiliki nama database yang menyertakan spasi atau tanda hubung dan karakter praktik tidak terbaik lainnya. Saya telah membuat versi yang menghindari penggunaan Sp_msforeachdb dan juga menyertakan dua kolom yang menunjukkan 1 - jika Login adalah login sysadmin (IsSysAdminLogin) dan 2 - jika login adalah pengguna anak yatim (IsEmptyRow).
sumber
you can use [] to resolve it. sp_msforeachdb ' use [?] select db_name()'
saya berasumsi bahwa jawabannya dimaksudkan sebagai komentar tetapi karena akunnya tidak memenuhi min-reputasi, ia malah mengirim jawaban.Saya mencoba hampir semua ini tetapi saya segera menyadari bahwa ada beberapa yang hilang, terutama pengguna sysadmin. Memiliki lubang seperti itu tidak akan terlihat bagus dalam audit kami yang akan datang, jadi inilah yang saya hasilkan
sumber
Karena rep rendah tidak dapat menjawab dengan ini kepada orang-orang yang meminta untuk menjalankan ini pada banyak database / SQL Server.
Buat grup server terdaftar dan kueri di antara mereka semua sebagai berikut dan kursor saja melalui basis data:
Utas ini sangat membantu saya, terima kasih semuanya!
sumber
DB_NAME()
dan menyimpan keluaran dalam tabel temp untuk menghindari berakhir dengan beberapa set hasil. Terima kasih!Terima kasih banyak untuk skrip audit yang luar biasa.
Saya sangat merekomendasikan untuk pengguna audit menggunakan Kenneth Fisher ( b | t prosedur tersimpan ) yang :
sumber
Permintaan sederhana yang hanya menunjukkan apakah Anda seorang SysAdmin atau tidak:
sumber
Sayangnya saya tidak dapat mengomentari pos Sean Rose karena reputasi yang tidak mencukupi, namun saya harus mengubah bagian peran "publik" dari skrip karena tidak menunjukkan izin ruang lingkup SCHEMA karena (INNER) BERGABUNG melawan sys. benda. Setelah itu diubah menjadi LEFT JOIN, saya harus mengubah logika WHERE-clause untuk menghilangkan objek sistem. Permintaan saya yang diubah untuk izin publik ada di bawah.
sumber
Jika Anda ingin memeriksa akses ke database untuk login tertentu, gunakan skrip sederhana ini seperti di bawah ini:
sys.sp_helplogins @LoginNamePattern = 'Domain \ login' - sysname
sumber
--ok giliranku untuk berkontribusi kembali, selamat menikmati
Header laporan ini secara dinamis mengambil nama SQL Instance, tanggal \ waktu, dan nama akun yang dijalankan oleh laporan, semua hal yang ingin diketahui oleh auditor yang baik. :)
Catatan - jika Anda memiliki properti diperluas yang disebut 'lingkungan' pada database Master, nilai (apa pun yang Anda gunakan: PreProd, Pengembangan, Produksi, DR, dll.) Akan dimasukkan dalam header laporan.
AKHIR
--Great to save sebagai proc yang disimpan
sumber