Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiểu chức năng bảo mật máy chủ SQL HAS_Permis_BY_Name và các trường hợp sử dụng của nó

Có nhiều trường hợp khi chúng tôi muốn kiểm tra quyền trên một tài khoản có thể bảo mật đối với một hiệu trưởng. Trước khi tiếp tục, hãy xem chính, bảo mật và quyền là gì.

Theo Tài liệu của Microsoft,

  1. Bảo mật trong ngữ cảnh SQL Server là các tài nguyên cụ thể mà hệ thống ủy quyền của SQL Server Database Engine kiểm soát quyền truy cập. Chúng được chia thành ba loại:Máy chủ, Cơ sở dữ liệu và Lược đồ. Nói chung, mọi đối tượng cơ sở dữ liệu hoặc SQL Server đều có thể được bảo mật.
  2. Quyền là các biện pháp kiểm soát sử dụng mà chúng tôi chỉ định cấp hoặc từ chối cấp độ truy cập nhất định đối với một thiết bị có thể bảo mật.
  3. Hiệu trưởng là một thực thể nhận được quyền đối với một bảo mật. Nguyên tắc phổ biến nhất là thông tin đăng nhập và người dùng cơ sở dữ liệu.

SQL Server có chức năng bảo mật tích hợp HAS_Permis_BY_Name điều đó sẽ giúp chúng tôi biết liệu một hiệu trưởng đã xác định có được phép cụ thể đối với một tài sản bảo đảm nhất định hay không. Hàm hệ thống này trả về 1 nếu quyền có hiệu lực được chỉ định cho chính đó trên một thiết bị bảo mật nhất định và nó trả về 0 nếu quyền hiệu quả không được chỉ định. Bạn sẽ nhận được giá trị NULL nếu quyền có hiệu lực hoặc lớp bảo mật không hợp lệ.

Hàm hệ thống HAS_Permis_BY_Name cũng rất hữu ích trong việc kiểm tra quyền đăng nhập của bạn. Tôi sẽ chỉ cho bạn quy trình từng bước để kiểm tra sự cho phép cụ thể trên một bảo mật cho hiệu trưởng của tôi và các hiệu trưởng khác trong bài viết này.

Cú pháp T-SQL của hàm hệ thống này như sau:

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

Ba tham số bắt buộc sẽ cần thiết để thực thi chức năng bảo mật SQL Server của hệ thống này.

  • Nhập tên của có thể bảo mật về cái mà bạn muốn kiểm tra quyền. Nếu một máy chủ có thể bảo mật là chính máy chủ, bạn nên sử dụng NULL.
  • Tham số thứ hai là securable_class đó là tên của lớp. Nếu không chắc chắn, bạn có thể sử dụng một hàm hệ thống khác sys.fn_builtin_permissions để nhận danh sách đầy đủ của lớp bảo mật và các quyền khả dụng của chúng.
  • Tham số thứ ba là quyền nơi bạn cần nhập quyền có hiệu lực mà bạn muốn kiểm tra trên thiết bị bảo mật được chỉ định.

Bây giờ, hãy để tôi chỉ cho bạn tất cả các lớp bảo mật có sẵn bằng cách chạy hàm hệ thống sys.fn_builtin_permissions. Tôi đã sử dụng DISTINCT để hiển thị các hàng trên mỗi lớp có thể bảo mật.

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

Tại đây, bạn có thể nhận được danh sách lớp bảo mật.

Nếu bạn muốn kiểm tra tất cả các quyền có thể cho bất kỳ lớp bảo mật nào, bạn cũng có thể sử dụng chức năng hệ thống này. Chạy câu lệnh T-SQL dưới đây:

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

Chúng ta có thể xem danh sách trong hình ảnh dưới đây. class_desc là một lớp có thể bảo mật và allow_name là một loại quyền. Nếu bạn không chắc chắn về lớp bảo mật và các quyền cần được kiểm tra cho bất kỳ lớp bảo mật nào, bạn có thể sử dụng chức năng hệ thống này.

HAS_Permis_BY_Tên các trường hợp sử dụng

Tôi sẽ chỉ cho bạn 5 trường hợp sử dụng để kiểm tra các quyền khác nhau đối với đăng nhập của riêng tôi vào phiên bản SQL Server và để đăng nhập bổ sung có tên manvendra .

  1. Kiểm tra quyền của máy chủ hoặc cấp phiên bản
  2. Kiểm tra Quyền ở cấp Cơ sở dữ liệu
  3. Kiểm tra quyền ở cấp độ đối tượng
  4. Kiểm tra quyền đăng nhập
  5. Kiểm tra các quyền khác như Danh mục văn bản đầy đủ, Lược đồ, v.v.

Hãy bắt đầu với ca sử dụng đầu tiên để kiểm tra các quyền ở cấp bản sao.

SỬ DỤNG TRƯỜNG HỢP 1:Kiểm tra SQL Server hoặc Quyền ở mức phiên bản

Trường hợp sử dụng này sẽ chỉ ra cách kiểm tra các quyền khác nhau đối với đăng nhập chính của máy chủ. Bạn có thể chạy câu lệnh T-SQL ở trên bằng cách sử dụng hàm hệ thống sys.fn_builtin_permissions. Bạn có thể sử dụng mệnh đề WHERE trong hàm này để chỉ liệt kê các quyền cấp máy chủ. Tại đây, tôi sẽ hiển thị cho bạn các quyền đối với thông tin đăng nhập được kết nối của riêng tôi.

  • Xem trạng thái máy chủ
  • Tạo vai trò máy chủ
  • Kết nối bất kỳ cơ sở dữ liệu nào

Nếu bạn đang tìm kiếm bất kỳ quyền nào ở cấp máy chủ, bạn phải luôn chuyển NULL làm đối số bảo mật. Trong ví dụ này, NULL sẽ được bảo mật ở cấp độ máy chủ của nó và các tên quyền ở trên sẽ có đối số quyền. Chạy câu lệnh T-SQL dưới đây để kiểm tra quyền cấp máy chủ.

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

Kết quả được hiển thị trong hình ảnh dưới đây. T-SQL đã trả về 1 cho tất cả các quyền đối với đăng nhập của tôi. Nó có nghĩa là tôi có quyền cho cả ba hoạt động. Tôi có thể xem trạng thái máy chủ, tôi có thể tạo vai trò máy chủ và tôi cũng có thể kết nối với bất kỳ cơ sở dữ liệu nào trên máy chủ hoặc phiên bản này.

Để tôi cho bạn biết liệu thông tin đăng nhập có tên ‘manvendra’ có quyền cho 3 thao tác trên hay không. Chúng tôi sẽ sử dụng câu lệnh EXECUTE AS LOGIN T-SQL để kiểm tra mức độ truy cập. Đảm bảo rằng bạn có quyền IMPERSONATE đối với thông tin đăng nhập mà bạn đang kiểm tra quyền. Chạy câu lệnh T-SQL tương tự như trên sau câu lệnh 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]

Tại đây, chúng ta có thể thấy đăng nhập ‘manvendra’ không có quyền truy cập vào bất kỳ hoạt động nào trong 3 hoạt động này ở cấp máy chủ vì đầu ra của chúng đã trả về 0.

SỬ DỤNG TRƯỜNG HỢP 2:Kiểm tra quyền ở cấp cơ sở dữ liệu

Tôi đã giải thích cách kiểm tra các quyền khác nhau cho bất kỳ quyền nào ở cấp máy chủ hoặc phiên bản trong phần trên. Bây giờ, tôi sẽ chỉ cho bạn cách kiểm tra các quyền khác nhau cho bất kỳ hiệu trưởng nào ở cấp cơ sở dữ liệu. Xem tuyên bố dưới đây:

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

Bạn có thể thấy có 82 quyền có sẵn ở cấp cơ sở dữ liệu trong ảnh chụp màn hình bên dưới.

Tôi đã chọn các quyền bên dưới để kiểm tra xem thông tin đăng nhập của tôi hoặc thông tin đăng nhập bổ sung ‘manvendra’ có được phép thực hiện các hoạt động này hay không.

  • BẤT KỲ
  • TẠO Bảng
  • TẠO THỦ TỤC
  • CHÈN
  • CHỌN

Ở đây, securable sẽ là tên cơ sở dữ liệu mà bạn muốn kiểm tra quyền, lớp bảo mật sẽ là ‘Database’ và quyền sẽ là các tên quyền ở trên. Chạy câu lệnh T-SQL dưới đây để kiểm tra các quyền khác nhau.

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

Kết quả trả về 1 cho mỗi quyền. Điều đó có nghĩa là tôi có quyền thực hiện tất cả các hoạt động trên trong bối cảnh cơ sở dữ liệu hiện tại.

Chạy câu lệnh T-SQL bên dưới để kiểm tra các quyền tương tự để đăng nhập ‘manvendra’ trong ngữ cảnh cơ sở dữ liệu hiện được chọn.

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

Kết quả cho thấy đăng nhập ‘manvendra’ có quyền rất hạn chế trên cơ sở dữ liệu này. Thông tin đăng nhập này chỉ có thể kết nối với cơ sở dữ liệu và các quyền còn lại không được phép.

Ở đây, tôi đã thay đổi ngữ cảnh cơ sở dữ liệu và chọn cơ sở dữ liệu ‘AdventureWorksDW2019-TSQL’ làm đối số bảo mật và thực thi câu lệnh dưới đây để đăng nhập ‘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]

Cùng một thông tin đăng nhập ‘manvendra’ có quyền CHÈN và CHỌN hoạt động trên cơ sở dữ liệu này ‘AdventureWorks2019-TSQL’

Tương tự, chúng ta có thể chạy câu lệnh T-SQL ở trên để kiểm tra quyền cho các cơ sở dữ liệu riêng biệt cho đăng nhập của chúng ta. Kết quả cho thấy rằng tôi có quyền truy cập vào tất cả các quyền.

Bạn có thể tiếp tục và kiểm tra quyền cấp cơ sở dữ liệu khác cho bất kỳ tác nhân chính nào bằng cách sử dụng chức năng bảo mật SQL Server của hệ thống ở trên.

SỬ DỤNG TRƯỜNG HỢP 3:Kiểm tra quyền ở cấp độ đối tượng

Trường hợp sử dụng này minh họa việc sử dụng quyền cấp đối tượng trong cơ sở dữ liệu. Một lần nữa, bạn có thể chạy câu lệnh T-SQL dưới đây để liệt kê tất cả các quyền có sẵn cho lớp bảo mật ‘OBJECT’. Tôi đã sử dụng mệnh đề WHERE trong hàm hệ thống sys.fn_builtin_permissions để hiển thị danh sách quyền cấp đối tượng.

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

Đây là danh sách các quyền cho Đối tượng lớp bảo mật.

Bây giờ, tôi sẽ kiểm tra các quyền bên dưới trên một đối tượng cụ thể cho bất kỳ tài khoản đăng nhập nào và xem liệu tài khoản đó có quyền truy cập để thực hiện các thao tác bên dưới hay không.

  • CHÈN
  • CHỌN
  • XÓA
  • XEM ĐỊNH NGHĨA

Tôi đã sử dụng đối tượng cơ sở dữ liệu ‘dbo.dimAccount’ làm lớp bảo mật, OBJECT làm lớp bảo mật và các quyền ở trên làm đối số quyền. Chạy các câu lệnh dưới đây để hiển thị chi tiết quyền.

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

Vì tôi là sysadmin trong trường hợp này, tài khoản của tôi đang trả về 1 cho bất kỳ quyền nào mà tôi đang kiểm tra ở bất kỳ cấp nào. Điều đó có nghĩa là tôi có đầy đủ quyền và điều này cũng có thể được xác minh bằng cách chạy các câu lệnh bên dưới.

Chạy câu lệnh dưới đây để kiểm tra quyền đăng nhập ‘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]

Chúng ta có thể thấy thông tin đăng nhập ‘manvendra’ có quyền truy cập vào các quyền CHÈN, CHỌN và XÓA nhưng tài khoản này không có quyền XEM ĐỊNH NGHĨA của đối tượng này trong cơ sở dữ liệu ‘AdventureWorksDW2019-TSQL’.

Hãy để tôi áp dụng quyền truy cập DENY vào thao tác DELETE cho tài khoản ‘manvendra’ này trên đối tượng ‘DimAccount’ trong cơ sở dữ liệu AdventureWorksDW2019-TSQL. Bạn có thể thấy điều này trong hình ảnh bên dưới.

Chúng ta có thể thấy rằng đầu ra chỉ ra rằng đăng nhập ‘manvendra’ chỉ có quyền truy cập vào các câu lệnh INSERT và SELECT và không có quyền đối với câu lệnh DELETE.

Kiểm tra các cấp độ truy cập khác nhau cho bất kỳ thông tin đăng nhập nào trên bất kỳ đối tượng cơ sở dữ liệu nào bằng cách sử dụng chức năng hệ thống ở trên.

SỬ DỤNG TRƯỜNG HỢP 4:Kiểm tra Quyền đăng nhập

Trường hợp sử dụng này sẽ giúp bạn hiểu cách kiểm tra các quyền khác nhau đối với thông tin đăng nhập. Bạn có thể nhận được tất cả các loại chi tiết này bằng cách sử dụng chức năng bảo mật của SQL Server hệ thống này HAS_PERMS_BY_NAME.

Chúng tôi có thể liệt kê tất cả các quyền có sẵn cho một đăng nhập cụ thể bằng cách chạy câu lệnh T-SQL bên dưới.

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

Dưới đây là danh sách các tên quyền cho lớp bảo mật ‘LOGIN’.

Tôi sẽ kiểm tra xem mình có quyền ALTER hoặc VIEW DEFINITION khi đăng nhập sa hay không bằng cách chạy các câu lệnh T-SQL bên dưới. Tôi đã sử dụng login sa làm đối số bảo mật, LOGIN làm đối số lớp bảo mật và ALTER &VIEW DEFINITION làm đối số quyền trong hàm hệ thống này.

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

Là một sysadmin, tôi sẽ có các cấp độ truy cập này và kết quả đầu ra cũng được xác nhận bằng cách trả về giá trị của chúng là 1.

Hãy kiểm tra xem thông tin đăng nhập ‘manvendra’ có quyền ALTER hoặc XEM định nghĩa của thông tin đăng nhập 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')

Kết quả trả về là không (0), có nghĩa là đăng nhập ‘manvendra’ không có quyền ALTER hoặc XEM thông tin đăng nhập DEFINITION sa.

Sử dụng chức năng hệ thống này để kiểm tra và hiểu các cấp độ truy cập cho các thông tin đăng nhập khác nhau.

SỬ DỤNG TRƯỜNG HỢP 5:Kiểm tra các quyền khác

Ở đây, tôi sẽ đề cập đến một số lớp bảo mật khác như SCHEMA và FULLTEXT CATALOG, ENDPOINT, AVAILABILITY GROUP, v.v.

Đầu tiên, hãy liệt kê tất cả các quyền có sẵn cho lớp bảo mật SCHEMA và FULLTEXT CATALOG bằng cách chạy câu lệnh dưới đây:

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

Bước tiếp theo là xác định quyền mà chúng tôi đang tìm kiếm để kiểm tra hiệu trưởng của chúng tôi. Tôi sẽ kiểm tra các quyền DELETE và ALTER đối với SCHEMA lớp bảo mật và quyền ALTER và VIEW DEFINITION trên FULLTEXT CATALOG CAT của lớp an toàn.

Chúng ta cần chuyển các bảo mật tương ứng của chúng như tôi đã chuyển dbo cho lớp bảo mật SCHEMA và FTCatalog cho lớp bảo mật FULLTEXT CATALOG trong câu lệnh dưới đây.

Chạy câu lệnh T-SQL dưới đây để nhận quyền đăng nhập của bạn.

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

Kết quả bên dưới cho thấy đăng nhập ‘manvendra’ chỉ có quyền truy cập để xóa SCHEMA và các quyền truy cập còn lại đã bị từ chối hoặc thu hồi.

Kết luận

Tôi đã giải thích quy trình từng bước để kiểm tra các quyền khác nhau cho nhiều lớp bảo mật cho bất kỳ hiệu trưởng nào trong bài viết này. Bạn cũng có thể và sử dụng chức năng bảo mật SQL Server của hệ thống này để đáp ứng các yêu cầu kiểm tra quyền của bạn. Hãy chia sẻ bài viết này và đóng góp ý kiến ​​của bạn trong phần bình luận để chúng tôi hoàn thiện hơn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách T-SQL hiệu quả nhất để đệm một varchar ở bên trái đến một độ dài nhất định?

  2. Chuyển đổi ‘datetime’ thành ‘datetimeoffset’ trong SQL Server (Ví dụ T-SQL)

  3. Tạo tài khoản thư cơ sở dữ liệu (SSMS)

  4. Tìm cột phân vùng cho một bảng phân vùng trong SQL Server (T-SQL)

  5. Cách cài đặt SQL Server trên SUSE 12