Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memahami Fungsi Keamanan SQL Server HAS_Permis_BY_Name dan Kasus PENGGUNAANnya

Ada beberapa contoh ketika kami ingin memeriksa izin pada prinsipal yang dapat diamankan. Sebelum melanjutkan, mari kita lihat apa itu prinsipal, keamanan, dan izin.

Menurut Dokumentasi Microsoft,

  1. Dapat diamankan dalam konteks SQL Server adalah sumber daya tertentu yang sistem otorisasi SQL Server Database Engine mengontrol akses. Mereka dibagi menjadi tiga kategori:Server, Database dan Skema. Secara umum, SQL Server atau objek database apa pun dapat diamankan.
  2. Izin adalah kontrol yang kami gunakan untuk memberikan atau menolak tingkat akses tertentu ke keamanan.
  3. Kepala Sekolah adalah entitas yang menerima izin untuk dapat diamankan. Prinsip yang paling umum adalah login dan pengguna database.

SQL Server memiliki fungsi keamanan bawaan HAS_Permis_BY_Name yang akan membantu kita mengetahui apakah seorang pelaku yang teridentifikasi memiliki izin khusus pada keamanan yang diberikan atau tidak. Fungsi sistem ini mengembalikan 1 jika izin efektif ditetapkan ke prinsipal tersebut pada keamanan yang diberikan, dan mengembalikan 0 jika izin efektif tidak ditetapkan. Anda akan mendapatkan nilai NULL jika izin efektif atau kelas yang dapat diamankan tidak valid.

Fungsi sistem HAS_Permis_BY_Name juga sangat berguna dalam memeriksa izin untuk login Anda. Saya akan menunjukkan kepada Anda proses langkah-demi-langkah untuk memeriksa izin khusus yang dapat diamankan untuk prinsipal saya dan prinsipal lainnya di artikel ini.

Sintaks T-SQL dari fungsi sistem ini adalah sebagai berikut:

--T-SQL syntax
HAS_PERMS_BY_NAME (securable, securable_class, permission)
   

Tiga parameter wajib akan diperlukan untuk menjalankan fungsi keamanan SQL Server sistem ini.

  • Masukkan nama dapat diamankan tentang yang ingin Anda periksa izinnya. Jika yang dapat diamankan adalah server itu sendiri, Anda harus menggunakan NULL.
  • Parameter kedua adalah kelas_aman yang merupakan nama kelas. Jika Anda tidak yakin, Anda dapat menggunakan fungsi sistem lain sys.fn_builtin_permissions untuk mendapatkan daftar lengkap kelas yang dapat diamankan dan izin yang tersedia.
  • Parameter ketiga adalah izin di mana Anda perlu memasukkan izin efektif yang ingin Anda periksa pada keamanan yang ditentukan.

Sekarang, izinkan saya menunjukkan kepada Anda semua kelas yang dapat diamankan dengan menjalankan fungsi sistem sys.fn_builtin_permissions. Saya telah menggunakan DISTINCT untuk menampilkan baris per kelas yang dapat diamankan.

--Display all securable_class
SELECT distinct class_desc FROM sys.fn_builtin_permissions(default)

Di sini, Anda bisa mendapatkan daftar kelas yang dapat diamankan.

Jika Anda ingin memeriksa semua izin yang memungkinkan untuk kelas yang dapat diamankan, Anda juga dapat menggunakan fungsi sistem ini. Jalankan pernyataan T-SQL di bawah ini:

--Display each permission for all securable class
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default);

Daftarnya bisa kita lihat pada gambar di bawah ini. class_desc adalah kelas yang dapat diamankan dan permission_name adalah jenis izin. Jika Anda tidak yakin tentang kelas yang dapat diamankan dan izin yang akan diperiksa untuk semua yang dapat diamankan, Anda dapat menggunakan fungsi sistem ini.

HAS_Permis_BY_Name USE Case

Saya akan menunjukkan kepada Anda 5 kasus penggunaan untuk memeriksa berbagai izin untuk login saya sendiri ke instance SQL Server dan untuk login tambahan bernama manvendra .

  1. Periksa Izin tingkat Server atau Instance
  2. Periksa Izin tingkat Basis Data
  3. Periksa Izin Level Objek
  4. Periksa Izin Masuk
  5. Periksa Izin Lain seperti Katalog Teks Lengkap, Skema, dll.

Mari kita mulai dengan kasus penggunaan pertama untuk memeriksa izin tingkat instance.

KASUS PENGGUNAAN 1:Periksa SQL Server atau Izin Tingkat Instance

Kasus penggunaan ini akan menunjukkan cara memeriksa berbagai izin untuk server principal\login. Anda dapat menjalankan pernyataan T-SQL di atas menggunakan fungsi sistem sys.fn_builtin_permissions. Anda dapat menggunakan klausa WHERE dalam fungsi ini untuk mencantumkan hanya izin tingkat server. Di sini, saya akan menunjukkan izin untuk login saya yang terhubung.

  • Melihat Status Server
  • Buat Peran Server
  • Hubungkan Basis Data Apa Saja

Jika Anda mencari izin apa pun di tingkat server, Anda harus selalu memberikan NULL sebagai argumen yang dapat diamankan. Dalam contoh ini, NULL akan dapat diamankan sebagai tingkat servernya dan nama izin di atas akan memiliki argumen izin. Jalankan pernyataan T-SQL di bawah ini untuk memeriksa izin tingkat server.

--Display server level permission for your own login using which you have established the database connection
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

Outputnya ditunjukkan pada gambar di bawah ini. T-SQL telah mengembalikan 1 untuk semua izin untuk login saya. Itu berarti saya memiliki izin untuk ketiga operasi tersebut. Saya dapat melihat status server, saya dapat membuat peran server dan saya juga dapat terhubung ke database apa pun di server atau instance ini.

Mari saya tunjukkan apakah login bernama 'manvendra' memiliki izin untuk 3 operasi di atas. Kami akan menggunakan pernyataan T-SQL EXECUTE AS LOGIN untuk memeriksa tingkat akses. Pastikan Anda memiliki izin IMPERSONATE pada login yang izinnya Anda periksa. Jalankan pernyataan T-SQL yang sama seperti di atas setelah pernyataan EXECUTE AS LOGIN.

--Display server level permission for another login ‘manvendra’
EXECUTE AS LOGIN = ‘manvendra’
GO
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

Di sini, kita dapat melihat login 'manvendra' tidak memiliki akses ke salah satu dari 3 aktivitas ini di tingkat server karena outputnya telah mengembalikan 0.

KASUS PENGGUNAAN 2:Periksa Izin Tingkat Basis Data

Saya telah menjelaskan cara memeriksa berbagai izin untuk prinsip apa pun di tingkat server atau instans di bagian di atas. Sekarang, saya akan menunjukkan kepada Anda cara memeriksa berbagai izin untuk setiap prinsipal di tingkat basis data. Lihat pernyataan di bawah ini:

--Display each permission for securable class ‘DATABASE’
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc = ‘DATABASE’

Anda dapat melihat ada 82 izin yang tersedia di tingkat basis data pada tangkapan layar di bawah ini.

Saya telah memilih izin di bawah ini untuk memeriksa apakah login saya atau login tambahan 'manvendra' memiliki izin untuk melakukan aktivitas ini.

  • APA SAJA
  • BUAT Tabel
  • BUAT PROSEDUR
  • MASUKKAN
  • PILIH

Di sini, securable akan menjadi nama database yang ingin Anda periksa izinnya, kelas yang dapat diamankan adalah 'Database' dan izin akan menjadi nama izin di atas. Jalankan pernyataan T-SQL di bawah ini untuk memeriksa berbagai izin.

--Display few specific permissions for your own connected login on a DATABASE
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

Output mengembalikan 1 untuk setiap izin. Itu berarti saya memiliki izin untuk melakukan semua aktivitas di atas dalam konteks basis data saat ini.

Jalankan pernyataan T-SQL di bawah ini untuk memeriksa izin yang sama untuk login 'manvendra' dalam konteks database yang dipilih saat ini.

--Display few specific permissions for login ‘manvendra’ on current database
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

Output menunjukkan bahwa login 'manvendra' memiliki izin yang sangat terbatas pada database ini. Login ini hanya dapat terhubung ke database dan izin lainnya tidak diizinkan.

Di sini, saya telah mengubah konteks database dan memilih database 'AdventureWorksDW2019-TSQL' sebagai argumen yang dapat diamankan dan mengeksekusi pernyataan di bawah ini untuk login 'manvendra'.

--Display few specific permissions for login ‘manvendra’ on database ‘AdventureWorksDW2019-TSQL’
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'SELECT') AS [SELECT Access]

Login yang sama 'manvendra' memiliki izin untuk operasi INSERT dan SELECT pada database ini 'AdventureWorks2019-TSQL'

Demikian pula, kita dapat menjalankan pernyataan T-SQL di atas untuk memeriksa izin untuk database yang berbeda untuk login kita. Outputnya menunjukkan bahwa saya memiliki akses ke semua izin.

Anda dapat melanjutkan dan memeriksa izin tingkat basis data lainnya untuk prinsip apa pun dengan menggunakan fungsi keamanan SQL Server sistem di atas.

USE CASE 3:Periksa Izin OBJECT-LEVEL

Kasus penggunaan ini mengilustrasikan penggunaan izin tingkat objek dalam database. Sekali lagi, Anda dapat menjalankan pernyataan T-SQL di bawah ini untuk mendaftar semua izin yang tersedia untuk kelas 'OBJECT' yang dapat diamankan. Saya telah menggunakan klausa WHERE dalam fungsi sistem sys.fn_builtin_permissions untuk menampilkan daftar izin tingkat objek.

--Check all object level permissions
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='OBJECT'

Berikut adalah daftar izin untuk Object kelas yang dapat diamankan.

Sekarang, saya akan memeriksa izin di bawah ini pada objek tertentu untuk akun login apa pun dan melihat apakah akun tersebut memiliki akses untuk melakukan operasi di bawah ini.

  • MASUKKAN
  • PILIH
  • HAPUS
  • LIHAT DEFINISI

Saya telah menggunakan objek database 'dbo.dimAccount' sebagai yang dapat diamankan, OBYEK sebagai kelas yang dapat diamankan, dan izin di atas sebagai argumen izin. Jalankan pernyataan di bawah ini untuk menampilkan detail izin.

--Check some specific object level permissions for your own login
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]

Karena saya seorang sysadmin dalam hal ini, akun saya mengembalikan 1 untuk izin apa pun yang saya periksa di level mana pun. Itu berarti saya memiliki izin penuh, dan ini dapat diverifikasi dengan menjalankan pernyataan di bawah ini juga.

Jalankan pernyataan di bawah ini untuk memeriksa izin untuk login 'manvendra'.

--Check some specific object level permissions for another login ‘manvendra’
EXECUTE AS USER ='manvendra'
GO
USE [AdventureWorksDW2019-TSQL]
GO
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]

Kita dapat melihat login 'manvendra' memiliki akses ke INSERT, SELECT dan DELETE izin tetapi akun ini tidak memiliki izin untuk MELIHAT DEFINISI objek ini di database 'AdventureWorksDW2019-TSQL'.

Izinkan saya menerapkan akses DENY ke operasi DELETE untuk akun ini 'manvendra' pada objek 'DimAccount' di database AdventureWorksDW2019-TSQL. Anda dapat melihat ini pada gambar di bawah ini.

Kita dapat melihat bahwa output menunjukkan bahwa login 'manvendra' hanya memiliki akses ke pernyataan INSERT dan SELECT dan tidak memiliki izin untuk pernyataan DELETE.

Periksa berbagai tingkat akses untuk setiap login pada objek database apa pun dengan menggunakan fungsi sistem di atas.

GUNAKAN KASUS 4:Periksa Izin Masuk

Kasus penggunaan ini akan membantu Anda memahami cara memeriksa berbagai izin untuk login. Anda bisa mendapatkan semua jenis detail ini menggunakan fungsi keamanan SQL Server sistem ini HAS_PERMS_BY_NAME.

Kami dapat membuat daftar semua izin yang tersedia untuk login tertentu dengan menjalankan pernyataan T-SQL di bawah ini.

--List all available permission for securable class ‘LOGIN’
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='LOGIN'

Di bawah ini adalah daftar nama izin untuk kelas 'LOGIN' yang dapat diamankan.

Saya akan memeriksa apakah saya memiliki izin ALTER atau VIEW DEFINITION saat login dengan menjalankan pernyataan T-SQL di bawah ini. Saya telah menggunakan login sa sebagai argumen yang dapat diamankan, LOGIN sebagai argumen kelas yang dapat diamankan, dan ALTER &VIEW DEFINITION sebagai argumen izin dalam fungsi sistem ini.

--Check ALTER & VIEW DEFINITION permission on securable sa
SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

Sebagai sysadmin, saya akan memiliki tingkat akses ini, dan outputnya juga divalidasi dengan mengembalikan nilainya sebagai 1.

Mari kita periksa apakah login 'manvendra' memiliki izin untuk MENGUBAH atau MELIHAT definisi login sa.

--Check ALTER & VIEW DEFINITION permission on securable sa for principal ‘manvendra’
EXECUTE AS USER ='manvendra'
GO

SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

Output dikembalikan sebagai nol (0), yang berarti login 'manvendra' tidak memiliki izin untuk MENGUBAH atau MELIHAT DEFINISI login sa.

Gunakan fungsi sistem ini untuk memeriksa dan memahami tingkat akses untuk berbagai login.

USE CASE 5:Periksa Izin Lainnya

Di sini, saya akan membahas beberapa kelas lain yang aman seperti SCHEMA dan FULLTEXT CATALOG, ENDPOINT, AVAILABILITY GROUP, dll.

Mari daftar semua izin yang tersedia untuk kelas aman SCHEMA dan FULLTEXT CATALOG dengan menjalankan pernyataan di bawah ini:

--List all available permission for securable class ‘SCHEMA’ & ‘FTCatalog’. FTCatalog is full text catalog.
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc='SCHEMA' OR
class_desc= 'FULLTEXT CATALOG'

Langkah selanjutnya adalah mengidentifikasi izin mana yang kami cari untuk memeriksa prinsipal kami. Saya akan memeriksa izin DELETE dan ALTER untuk SCHEMA kelas yang dapat diamankan dan izin ALTER dan VIEW DEFINITION pada KATALOG FULLTEXT kelas yang dapat diamankan.

Kita harus melewati securables masing-masing seperti saya telah melewati dbo untuk kelas yang dapat diamankan SCHEMA dan FTCatalog untuk kelas yang dapat diamankan FULLTEXT CATALOG dalam pernyataan di bawah ini.

Jalankan pernyataan T-SQL di bawah ini untuk mendapatkan izin login Anda.

--List below permissions for securable class ‘SCHEMA’ & ‘FTCatalog’. 
SELECT HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'DELETE') AS [Schema Deletion Access],
HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'ALTER') AS [Schema Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'ALTER') AS [FTC Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'VIEW DEFINITION') AS [VIEW DEFINITION]

Output di bawah ini menunjukkan bahwa login 'manvendra' hanya memiliki akses ke penghapusan SCHEMA dan akses lainnya telah ditolak atau dicabut.

Kesimpulan

Saya telah menjelaskan proses langkah demi langkah untuk memeriksa berbagai izin untuk beberapa kelas yang dapat diamankan untuk setiap kepala sekolah dalam artikel ini. Anda juga dapat dan menggunakan fungsi keamanan SQL Server sistem ini untuk memenuhi persyaratan pemeriksaan izin Anda. Silakan bagikan artikel ini dan berikan tanggapan Anda di bagian komentar agar kami dapat meningkatkannya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana SQLParameter mencegah SQL Injection?

  2. Contoh Konversi 'tanggal' ke 'waktu kecil' di SQL Server (T-SQL)

  3. Temukan baris terakhir dalam grup berdasarkan kueri-SQL Server

  4. PILIH kueri dengan kondisi CASE dan SUM()

  5. Pemotongan SQL Server dan batasan 8192