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

SQL Server:Làm thế nào để cho phép các lược đồ?

Tôi e rằng mô tả của bạn hoặc quan niệm của bạn về Chuỗi sở hữu là không rõ ràng, vì vậy hãy để tôi bắt đầu với điều đó:

"Chuỗi quyền sở hữu" chỉ đơn giản là đề cập đến thực tế là khi thực thi Thủ tục được lưu trữ (hoặc Chế độ xem) trên SQL Server, lô hiện đang thực thi tạm thời có được quyền / quyền của Chủ sở hữu sProc (hoặc Chủ sở hữu giản đồ của sProc) trong khi thực thi mã SQL đó. Vì vậy, trong trường hợp của một sProc, Người dùng không thể sử dụng các priv đó để làm bất cứ điều gì mà mã sProc không triển khai cho họ. Đặc biệt lưu ý rằng nó không bao giờ có được Danh tính của Chủ sở hữu, chỉ đó là quyền, tạm thời (tuy nhiên, EXECUTE AS ... thực hiện điều này).

Vì vậy, cách tiếp cận điển hình để tận dụng điều này để bảo mật là:

  1. Đặt tất cả các Bảng dữ liệu (và tất cả các Chế độ xem không bảo mật) vào Lược đồ của riêng chúng, chúng ta hãy gọi nó là [dữ liệu] (mặc dù [dbo] thường được sử dụng vì nó đã ở đó và quá đặc quyền đối với lược đồ của Người dùng). Đảm bảo rằng không có Người dùng, Lược đồ hoặc Chủ sở hữu hiện tại nào có quyền truy cập vào lược đồ [dữ liệu] này.

  2. Tạo một lược đồ được gọi là [execute] cho tất cả các sProcs (và / hoặc có thể là bất kỳ Chế độ xem bảo mật nào). Đảm bảo rằng chủ sở hữu của lược đồ này có quyền truy cập vào lược đồ [data] (điều này rất dễ dàng nếu bạn đặt dbo làm chủ sở hữu của lược đồ này).

  3. Tạo một db-Role mới có tên "Người dùng" và cấp cho nó THỰC HIỆN quyền truy cập vào lược đồ [execute]. Bây giờ hãy thêm tất cả người dùng vào vai trò này. Đảm bảo rằng người dùng của bạn chỉ có quyền Connect và không có quyền truy cập được cấp vào bất kỳ lược đồ nào khác, bao gồm cả [dbo].

Giờ đây, người dùng của bạn chỉ có thể truy cập dữ liệu bằng cách thực thi các sProcs trong [execute]. Họ không thể truy cập bất kỳ dữ liệu nào khác hoặc thực thi bất kỳ đối tượng nào khác.

Tôi không chắc liệu điều này có trả lời câu hỏi của bạn hay không (vì tôi không chắc câu hỏi chính xác là gì), vì vậy hãy chuyển hướng cho tôi.

Đối với bảo mật cấp hàng, đây là cách tôi luôn thực hiện với sơ đồ bảo mật ở trên:

  1. Tôi luôn triển khai bảo mật cấp hàng dưới dạng một chuỗi Chế độ xem bao bọc mọi bảng và so sánh danh tính của Người dùng (thường với Suser_Sname () hoặc một trong những người khác) với danh sách bảo mật được khóa từ mã bảo mật trong chính hàng đó. Đây là các Chế độ xem Bảo mật.

  2. Tạo một lược đồ mới được gọi là [hàng], cấp cho chủ sở hữu của nó quyền truy cập vào lược đồ [dữ liệu] và không có gì khác. Đặt tất cả Chế độ xem Bảo mật trong lược đồ này.

  3. Thu hồi quyền truy cập của chủ sở hữu [executive] vào giản đồ [data] và thay vào đó cấp cho nó quyền truy cập dữ liệu vào giản đồ [row].

Xong. Giờ đây, bảo mật cấp độ hàng đã được triển khai bằng cách trượt nó một cách minh bạch giữa các sProcs và các bảng.

Cuối cùng, đây là một mua sắm được lưu trữ mà tôi sử dụng để giúp tôi nhớ mức độ hoạt động và tương tác của nội dung bảo mật khó hiểu này với chính nó ( rất tiếc, phiên bản mã đã sửa chữa ):

CREATE proc [TestCnxOnly].[spShowProc_Security_NoEX]  as
--no "With Execute as Owner" for this version
--create User [UserNoLogin] without login
--Grant connect on database :: TestSecurity to Guest
--alter database TestSecurity set trustworthy on

--Show current user context:
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (sproc)]
, suser_sname() as sname
, system_user as system_


--Execute As Login = 'UserNoLogin'
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (after exec as)]
, suser_sname() as sname
, system_user as system_

EXEC('select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in Exec(sql))]
, suser_sname() as sname
, system_user as system_')

EXEC sp_ExecuteSQL N'select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in sp_Executesql)]
, suser_sname() as sname
, system_user as system_'

--Revert
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (aftr revert)]
, suser_sname() as sname
, system_user as system_

[EDIT:phiên bản đã sửa của mã)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm mối liên hệ giữa tài khoản thư cơ sở dữ liệu và nguyên tắc cơ sở dữ liệu trong SQL Server (T-SQL)

  2. Msg 8672, Mức 16, Trạng thái 1, Dòng 1 Câu lệnh MERGE đã cố CẬP NHẬT hoặc XÓA cùng một hàng nhiều hơn một lần

  3. so sánh một cột với một danh sách các giá trị trong t-sql

  4. Giới thiệu về SQL Server 2017

  5. Làm cách nào để liệt kê tất cả các cột trong một bảng?