Bảo mật cấp cột SQL Server


7

Tôi nghĩ rằng tôi cần một số gợi ý về bảo mật trong SQL Server. Tôi đang cố gắng hạn chế một số người dùng cuối của chúng tôi truy cập vào một số cột nhất định (ví dụ SSN) trên một bảng.

Tôi nghĩ rằng tôi chỉ có thể sử dụng bảo mật cấp cột để hạn chế quyền truy cập vào các cột. Điều đó đã ngăn người dùng truy cập trực tiếp vào bảng, nhưng tôi đã ngạc nhiên khi họ vẫn có thể truy cập vào các cột đó thông qua chế độ xem truy cập vào bảng đó.

Tôi đã làm theo các mẹo ở đây: http://www.mssqltips.com/sqlservertip/2124/filtering-sql-server-columns-USE-column-level-permissions/ Những điều đó rất hữu ích, nhưng khi tôi tạo ra một chế độ xem ở cuối , thực tập sinh có thể truy cập cột đó theo mặc định

Tôi đã đọc rằng các chế độ xem là cách tốt nhất để thực hiện điều này, nhưng tôi thực sự không muốn trải qua và thay đổi tất cả các chế độ xem và ứng dụng giao diện người dùng cũ. Tôi thà chỉ giới hạn nó một lần trên bàn và nếu một khung nhìn cố truy cập vào cột đó thì nó sẽ thất bại.

Điều đó có thể hay tôi đang hiểu sai về cách thức bảo mật hoạt động trong SQL Server?


1
Trường hợp sử dụng điển hình cho chế độ xem - xác định chế độ xem ở đầu bảng chứa chỉ những cột bạn muốn người dùng của bạn xem và sau đó cấp cho người dùng SELECTquyền đó trên chế độ xem, nhưng từ chối quyền của họ trên bảng bên dưới
marc_s

Tôi cung cấp một chế độ xem khác: có thể thiết kế trình kích hoạt DDL trên bảng để truyền bất kỳ khoản cấp / thu hồi nào cho các chế độ xem dựa trên nó. Những quan điểm đó sẽ được tìm thấy bằng cách kiểm tra siêu dữ liệu của các đối tượng. Tôi sẽ giải thích và, hy vọng, viết một giải pháp hoàn chỉnh.
Marcus Vinicius Pompeu

Câu trả lời:


4

Bảo mật cấp cột không hoạt động theo cách đó. Tôi biết rằng không có cơ chế từ chối toàn cầu quyền truy cập vào một cột nhất định cho một người dùng nhất định. GRANT / DENY chỉ hoạt động trên các câu lệnh cụ thể như CHỌN, CẬP NHẬT, v.v. kết hợp với một đối tượng nhất định.

Vì vậy, trong trường hợp của bạn, nếu bạn đã xóa quyền truy cập trên CHỌN cho cột X trên bảng Y, người dùng vẫn có thể vui vẻ thực hiện các chế độ xem "select *" trên bảng đó vì chế độ xem là một đối tượng khác và không bị ảnh hưởng bởi cài đặt bảo mật này!

Tin tốt là bạn cũng có thể sử dụng quyền truy cập cột trên lượt xem. Nó hoạt động giống như với các bảng, nhưng bạn phải đặt quyền trên mọi chế độ xem bao gồm cột SSN.


Thật không may. Vì vậy, điều tương tự có đúng ở cấp độ bảng? Vì vậy, nếu tôi hạn chế quyền truy cập vào toàn bộ bảng, chế độ xem vẫn có thể truy cập? Nếu vậy, tốt hơn hết là chỉ đặt các bảng đó vào một cơ sở dữ liệu khác, nơi tôi có thể giới hạn nó ở một số người dùng nhất định

@ user46372 Không, bạn không cần phải làm điều đó. Đọc điều này trên Chuỗi sở hữu để hiểu những gì đang xảy ra.
Martin Smith

Martin, cảm ơn vì liên kết. Vì vậy, về mặt lý thuyết, nếu các bảng tôi muốn khóa được sở hữu bởi một người dùng khác với tất cả các đối tượng / chế độ xem còn lại, điều đó có buộc SQL Server kiểm tra lại các quyền và ngăn truy cập không?

3
@ user46372 - Có. Điều đó nên chính xác. Nhưng FWIW Tôi đồng ý với câu hỏi của marc_s về câu hỏi rằng dễ nhất là từ chối truy cập trên bảng và quản lý điều này thông qua việc tạo chế độ xem với tập hợp các cột mong muốn.
Martin Smith

Có, tôi đã nghe tùy chọn lượt xem là tốt nhất, nhưng thật không may, chương trình đầu cuối kế thừa của chúng tôi là Dự án Dữ liệu Truy cập hiển thị tất cả các chế độ xem và bảng (ick). Vì chúng tôi đã có một loạt các chế độ xem được tạo nên tôi đoán chúng tôi sẽ phải đi qua từng lượt xem và truy cập DENY? Và chúng ta chỉ cần nhớ truy cập DENY trên mỗi chế độ xem mới mà chúng ta tạo ra, phải không? Điều đó sẽ dễ bị lỗi.

0

Lưu ý rằng trong SQL 2016+ có tính năng che giấu dữ liệu, có thể ẩn toàn bộ chi tiết của các cột cụ thể. Điều này có thể ngăn người dùng nhìn thấy các giá trị thực của các cột nhất định trừ khi họ có quyền "vạch mặt" cụ thể.

Lưu ý rằng người dùng vẫn có thể gián tiếp tìm dữ liệu qua các mệnh đề WHERE - ví dụ: ngay cả khi "Mức lương" bị che, bạn vẫn có thể truy vấn người dùng bằng Mức lương giữa X và Y.

Ví dụ:

ALTER COLUMN [Social Security Number] ADD MASKED WITH (FUNCTION = 'partial(0,"XXX-XX-",4)')

Tài liệu: https://docs.microsoft.com/en-us/sql/relational-database/security/dynamic-data-masking?view=sql-server-2016

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.