Helpex - Trao đổi & giúp đỡ Đăng nhập

Hạn chế quyền truy cập vào dữ liệu máy chủ SQL của bạn bằng cơ sở dữ liệu mặt tiền

Đã bao nhiêu lần bạn cảm thấy cần phải cấp quyền truy cập hạn chế vào cơ sở dữ liệu máy chủ sql của mình cho người dùng bên ngoài và cảm thấy không an toàn khi làm điều đó? người dùng bên ngoài có thể là người tiêu dùng cuối cùng của dữ liệu của bạn hoặc một nhóm trong cùng một tổ chức cần quyền truy cập vào cơ sở dữ liệu của bạn để các ứng dụng / cơ sở dữ liệu của họ hoạt động. Điều gì sẽ xảy ra nếu người dùng bên ngoài cố gắng xâm nhập vào cơ sở dữ liệu của bạn và đọc dữ liệu mà họ không được phép, hoặc thậm chí tệ hơn là giành được quyền ghi vào cơ sở dữ liệu đó? điều gì sẽ xảy ra nếu chúng phá hủy / làm hỏng dữ liệu của bạn?

bài đăng này mô tả phương pháp tạo cơ sở dữ liệu mặt tiền để cung cấp quyền truy cập hạn chế vào các bảng cụ thể trong cơ sở dữ liệu của bạn cho người dùng cụ thể mà không cấp quyền truy cập trực tiếp vào bất kỳ bảng / cơ sở dữ liệu bên dưới nào. máy chủ sql cung cấp một tính năng được gọi là chuỗi sở hữu cơ sở dữ liệu chéo có thể giúp chúng tôi đạt được điều này. các ví dụ được cung cấp trong bài viết này đã được phát triển và thử nghiệm trên máy chủ sql server 2008 r2. tính năng này cũng được hỗ trợ trong các phiên bản cũ hơn của máy chủ sql, nhưng chúng tôi sẽ giới hạn cuộc thảo luận trong các phiên bản sau:

  • máy chủ sql 2005
  • máy chủ sql 2008
  • máy chủ sql 2008 r2
  • máy chủ sql 2012
  • máy chủ sql 2014

chuỗi quyền sở hữu

khi một tập lệnh truy cập tuần tự vào nhiều đối tượng cơ sở dữ liệu, trình tự được gọi là một chuỗi. mặc dù các chuỗi như vậy không tồn tại độc lập, khi máy chủ sql duyệt qua các liên kết trong một chuỗi, nó sẽ đánh giá các quyền trên các đối tượng cấu thành khác với nếu nó đang truy cập các đối tượng một cách riêng biệt. những khác biệt này có ý nghĩa quan trọng trong việc quản lý quyền truy cập và bảo mật.

khi một đối tượng được truy cập thông qua một chuỗi, máy chủ sql trước tiên sẽ so sánh chủ sở hữu của đối tượng với chủ sở hữu của đối tượng đang gọi. nếu cả hai đối tượng có cùng một chủ sở hữu, các quyền trên đối tượng được tham chiếu sẽ không được đánh giá.

chuỗi sở hữu cơ sở dữ liệu chéo

Máy chủ sql có thể được cấu hình để cho phép chuỗi quyền sở hữu giữa các cơ sở dữ liệu cụ thể hoặc trên tất cả các cơ sở dữ liệu bên trong một máy chủ duy nhất của máy chủ sql. Chuỗi sở hữu cơ sở dữ liệu chéo bị tắt theo mặc định và sẽ không được bật trừ khi được yêu cầu cụ thể. để làm cho chuỗi sở hữu cơ sở dữ liệu chéo hoạt động, các cơ sở dữ liệu liên quan phải có một chủ sở hữu chung.

cấp máy chủ so với cấp cơ sở dữ liệu

Chuỗi cơ sở dữ liệu chéo có thể được kích hoạt ở cấp máy chủ hoặc ở các cấp cơ sở dữ liệu riêng lẻ. cho phép nó ở cấp máy chủ làm cho chuỗi sở hữu cơ sở dữ liệu chéo hoạt động trên tất cả các cơ sở dữ liệu trên máy chủ, bất kể cài đặt riêng lẻ của cơ sở dữ liệu. nếu yêu cầu là chỉ bật nó cho một số cơ sở dữ liệu, thì bạn nên bật nó ở cấp cơ sở dữ liệu.

Chuỗi sở hữu cơ sở dữ liệu chéo cấp máy chủ

để kích hoạt chuỗi sở hữu cơ sở dữ liệu chéo cấp máy chủ, hãy sử dụng các câu lệnh t-sql sau đây.

execute sp_configure 'show advanced', 1
go
reconfigure
go

execute sp_configure 'cross db ownership chaining', 1
go
reconfigure
go


để kiểm tra xem nó đã được bật chưa, hãy sử dụng truy vấn sau:

select [name], value  
from [sys].configurations 
where [name] = 'cross db ownership chaining';


giá trị của một cho biết rằng nó đã được kích hoạt.

Chuỗi sở hữu cơ sở dữ liệu chéo cấp cơ sở dữ liệu

để kích hoạt chuỗi sở hữu cơ sở dữ liệu chéo cấp cơ sở dữ liệu, hãy sử dụng các câu lệnh t-sql sau đây.

alter database mydatabase set db_chaining on
go


để kiểm tra xem nó đã được bật ở cấp cơ sở dữ liệu riêng lẻ chưa, hãy chạy:

select name, is_db_chaining_on from sys.databases
go


chuẩn bị db chính

hãy để tôi minh họa điều này bằng một ví dụ. tạo một cơ sở dữ liệu có tên là customerdb. sau đó, tạo một bảng có tên khách hàng và chèn một số dữ liệu thử nghiệm

create table [dbo].[customers](
    [customerid] [int] identity(1,1) not null,
    [customername] [varchar](50) not null,
    [address] [varchar](500) not null,
    [city] [varchar](50) not null,
    [country] [varchar](50) not null,
 constraint [pk_customers] primary key clustered 
(
    [customerid] asc
)with (pad_index  = off, statistics_norecompute  = off, ignore_dup_key = off, allow_row_locks  = on, allow_page_locks  = on) on [primary]
) on [primary]


insert into customers ([customerid], [customername], [address], [city], [country]) values (1, 'michael douglas', 'la home', 'los angeles', 'us')
insert into customers ([customerid], [customername], [address], [city], [country]) values (2, 'al pacino', 'ny home', 'new york', 'us')
insert into customers ([customerid], [customername], [address], [city], [country]) values (3, 'james cameroon', 'nj home', 'new jersey', 'us')



tạo mặt tiền db

tạo một cơ sở dữ liệu có tên là facadedb (hoặc bất kỳ tên nào khác cho vấn đề đó).

tạo chế độ xem

tạo dạng xem cho từng bảng trong db chính mà bạn muốn cấp quyền truy cập cho người dùng bị hạn chế.

create view [dbo].[customerview] as select * from customerdb.dbo.customers


Trình khám phá đối tượng của bạn bây giờ sẽ trông như thế này:
Hạn chế quyền truy cập vào dữ liệu máy chủ SQL của bạn bằng cơ sở dữ liệu mặt tiền

người khám phá đối tượng


tạo thông tin đăng nhập và người dùng để hợp lý hóa quyền truy cập

tạo thông tin đăng nhập của người dùng bị hạn chế và những người dùng được liên kết của nó trong cơ sở dữ liệu. người dùng phải được thêm vào cơ sở dữ liệu chính dưới dạng "công khai". nếu không, chuỗi quyền sở hữu sẽ không hoạt động. người dùng phải có ít nhất một vai trò "db_datareader" trên cơ sở dữ liệu mặt tiền.

create login [facadeuser] with password=n'facadeuser', default_database=[facadedb], 
            default_language=[us_english], check_expiration=off, check_policy=off
go

use [customerdb]
go
create user [facadeuser] for login [facadeuser] with default_schema=[dbo]
go

use [facadedb]
go
create user [facadeuser] for login [facadeuser] with default_schema=[dbo]
go
exec sp_addrolemember n'db_datareader', n'facadeuser'
go


bật chuỗi quyền sở hữu cơ sở dữ liệu trên cả hai cơ sở dữ liệu

alter database customerdb set db_chaining on
go
alter database facadedb set db_chaining on
go


thử nghiệm

đăng nhập vào máy chủ với tư cách là người dùng bị hạn chế (người dùng mặt tiền) và thực hiện các lệnh sau.

select * from customerview


bạn sẽ có thể thấy các hàng của bảng bên dưới.

Hạn chế quyền truy cập vào dữ liệu máy chủ SQL của bạn bằng cơ sở dữ liệu mặt tiền
đầu ra của người dùng bị hạn chế


bây giờ, hãy thử truy vấn trực tiếp bảng bên dưới.

select * from customerdb.dbo.customers


Hạn chế quyền truy cập vào dữ liệu máy chủ SQL của bạn bằng cơ sở dữ liệu mặt tiền
sự cho phép bị từ chối

bạn sẽ thấy lỗi này:

the select permission was denied on the object 'customers', database 'customerdb', schema 'dbo'.

phần kết luận

Nếu bạn đã làm theo các bước trên, bạn sẽ có một thiết lập hoạt động trong đó người dùng bị hạn chế có thể truy vấn facadedb và xem kết quả, nhưng họ không thể truy vấn các bảng bên dưới trong customerdb.

bài đăng này là một bản sao của bài viết gốc của tôi được đăng trên blog của tôi

13 hữu ích 0 bình luận 12k xem chia sẻ

Có thể bạn quan tâm

loading