Kiểm soát truy cập cho người dùng và vai trò trong SQL

An ninh là tối quan trọng đối với các quản trị viên cơ sở dữ liệu tìm cách bảo vệ dữ liệu kinh doanh quan trọng của họ từ những con mắt tò mò của những người bên ngoài trái phép và những người trong cuộc đang cố gắng vượt thẩm quyền của họ. Tất cả các hệ thống quản lý cơ sở dữ liệu quan hệ cung cấp một số loại cơ chế bảo mật nội tại được thiết kế để giảm thiểu các mối đe dọa này. Chúng nằm trong phạm vi bảo vệ mật khẩu đơn giản do Microsoft Access cung cấp cho cấu trúc người dùng / vai trò phức tạp được hỗ trợ bởi các cơ sở dữ liệu quan hệ nâng cao như Oracle và Microsoft SQL Server. Bài viết này tập trung vào các cơ chế bảo mật chung cho tất cả các cơ sở dữ liệu thực hiện Ngôn ngữ truy vấn có cấu trúc (hoặc SQL ). Cùng nhau, chúng tôi sẽ đi qua quá trình tăng cường kiểm soát truy cập dữ liệu và đảm bảo sự an toàn cho dữ liệu của bạn.

Người dùng

Các cơ sở dữ liệu dựa trên máy chủ đều hỗ trợ khái niệm người dùng tương tự như khái niệm được sử dụng trong các hệ điều hành máy tính. Nếu bạn đã quen thuộc với hệ thống phân cấp người dùng / nhóm được tìm thấy trong Microsoft Windows NT và Windows 2000, bạn sẽ thấy rằng nhóm người dùng / vai trò được hỗ trợ bởi SQL Server và Oracle rất giống nhau.

Bạn nên tạo tài khoản người dùng cơ sở dữ liệu riêng lẻ cho từng người sẽ truy cập vào cơ sở dữ liệu của bạn. Về mặt kỹ thuật, có thể chia sẻ tài khoản giữa người dùng hoặc chỉ cần sử dụng một tài khoản người dùng cho từng loại người dùng cần truy cập vào cơ sở dữ liệu của bạn, nhưng tôi không khuyến khích thực hành này vì hai lý do. Đầu tiên, nó sẽ loại bỏ trách nhiệm cá nhân - nếu người dùng thực hiện thay đổi đối với cơ sở dữ liệu của bạn (giả sử bằng cách tự tăng 5.000 đô la), bạn sẽ không thể theo dõi nó trở lại một người cụ thể thông qua việc sử dụng nhật ký kiểm tra. Hơn nữa, nếu một người dùng cụ thể rời khỏi tổ chức của bạn và bạn muốn xóa quyền truy cập của họ khỏi cơ sở dữ liệu, bạn sẽ bị buộc phải thay đổi mật khẩu mà tất cả người dùng dựa vào.

Các phương thức tạo tài khoản người dùng thay đổi từ nền tảng này sang nền tảng khác và bạn sẽ phải tham khảo tài liệu DBMS cụ thể của mình để biết quy trình chính xác. Người dùng Microsoft SQL Server nên điều tra việc sử dụng thủ tục được lưu trữ sp_adduser. Quản trị viên cơ sở dữ liệu Oracle sẽ tìm thấy lệnh CREATE USER hữu ích. Bạn cũng có thể muốn điều tra các lược đồ xác thực thay thế. Ví dụ, Microsoft SQL Server hỗ trợ việc sử dụng Windows NT tích hợp bảo mật. Theo lược đồ này, người dùng được xác định vào cơ sở dữ liệu bởi tài khoản người dùng Windows NT của họ và không bắt buộc phải nhập thêm ID người dùng và mật khẩu để truy cập cơ sở dữ liệu. Cách tiếp cận này cực kỳ phổ biến giữa các quản trị viên cơ sở dữ liệu bởi vì nó thay đổi gánh nặng của quản lý tài khoản cho nhân viên quản trị mạng và nó cung cấp sự dễ dàng của việc đăng nhập một lần cho người dùng cuối.

Vai trò

Nếu bạn đang ở trong một môi trường với một số lượng nhỏ người dùng, có thể bạn sẽ thấy rằng việc tạo tài khoản người dùng và gán quyền trực tiếp cho họ là đủ cho nhu cầu của bạn. Tuy nhiên, nếu bạn có số lượng người dùng lớn, rất có thể bạn sẽ bị choáng ngợp bởi gánh nặng của việc duy trì tài khoản và quyền thích hợp. Để giảm bớt gánh nặng này, các cơ sở dữ liệu quan hệ hỗ trợ khái niệm về các vai trò. Vai trò cơ sở dữ liệu hoạt động tương tự như các nhóm Windows NT. Tài khoản người dùng được gán cho (các) vai trò và quyền sau đó được gán cho vai trò như một tổng thể chứ không phải là các tài khoản người dùng cá nhân. Ví dụ: chúng tôi có thể tạo vai trò DBA và sau đó thêm tài khoản người dùng của nhân viên quản trị của chúng tôi vào vai trò này. Khi chúng tôi đã thực hiện việc này, chúng tôi có thể chỉ định quyền cụ thể cho tất cả quản trị viên hiện tại (và tương lai) bằng cách chỉ định cho phép vai trò đó. Một lần nữa, các thủ tục tạo vai trò khác nhau từ nền tảng đến nền tảng. Các quản trị viên MS SQL Server nên điều tra thủ tục lưu trữ sp_addrole trong khi Oracle DBAs nên sử dụng cú pháp CREATE ROLE.

Cấp quyền

Bây giờ chúng tôi đã thêm người dùng vào cơ sở dữ liệu của mình, đã đến lúc bắt đầu tăng cường bảo mật bằng cách thêm quyền. Bước đầu tiên của chúng tôi là cấp các quyền cơ sở dữ liệu thích hợp cho người dùng của chúng tôi. Chúng ta sẽ thực hiện điều này thông qua việc sử dụng câu lệnh SQL GRANT.

Đây là cú pháp của câu lệnh:

GRANT
[ON

]
ĐẾN
[VỚI TÙY CHỌN LỚN]

Bây giờ, chúng ta hãy xem câu lệnh này từng dòng một. Dòng đầu tiên, GRANT , cho phép chúng tôi chỉ định các quyền bảng cụ thể mà chúng tôi đang cấp. Đây có thể là các quyền mức bảng (chẳng hạn như SELECT, INSERT, UPDATE và DELETE) hoặc các quyền cơ sở dữ liệu (chẳng hạn như CREATE TABLE, ALTER DATABASE và GRANT). Có thể cấp nhiều hơn một quyền trong một câu lệnh GRANT, nhưng các quyền cấp bảng và các quyền mức cơ sở dữ liệu có thể không được kết hợp trong một câu lệnh duy nhất.

Dòng thứ hai, ON

, được sử dụng để chỉ định bảng bị ảnh hưởng cho các quyền mức bảng. Dòng này bị bỏ qua nếu chúng tôi cấp quyền cấp cơ sở dữ liệu. Dòng thứ ba chỉ định người dùng hoặc vai trò đang được cấp quyền.

Cuối cùng, dòng thứ tư, WITH GRANT OPTION, là tùy chọn. Nếu dòng này được đưa vào tuyên bố, người dùng bị ảnh hưởng cũng được phép cấp các quyền tương tự này cho người dùng khác. Lưu ý rằng không thể chỉ định WITH GRANT OPTION khi các quyền được gán cho một vai trò.

Ví dụ

Hãy xem xét một vài ví dụ. Trong kịch bản đầu tiên của chúng tôi, gần đây chúng tôi đã thuê một nhóm 42 nhà khai thác nhập dữ liệu, những người sẽ thêm và duy trì hồ sơ khách hàng. Họ cần để có thể truy cập thông tin trong bảng Khách hàng, sửa đổi thông tin này và thêm bản ghi mới vào bảng. Họ không thể xóa hoàn toàn bản ghi khỏi cơ sở dữ liệu. Đầu tiên, chúng ta nên tạo tài khoản người dùng cho mỗi nhà điều hành và sau đó thêm tất cả chúng vào một vai trò mới, DataEntry. Tiếp theo, chúng ta nên sử dụng câu lệnh SQL sau để cấp cho họ các quyền thích hợp:

GRANT SELECT, INSERT, UPDATE
TRÊN KHÁCH HÀNG
ĐẾN DataEntry

Và đó là tất cả để có nó! Bây giờ chúng ta hãy xem xét một trường hợp chúng ta đang gán các quyền mức cơ sở dữ liệu. Chúng tôi muốn cho phép các thành viên của vai trò DBA thêm bảng mới vào cơ sở dữ liệu của chúng tôi. Hơn nữa, chúng tôi muốn họ có thể cấp cho người dùng khác quyền làm như vậy. Đây là câu lệnh SQL:

GRANT CREATE TABLE
ĐẾN DBA
VỚI LỰA CHỌN LỚN

Lưu ý rằng chúng tôi đã bao gồm dòng WITH GRANT OPTION để đảm bảo rằng các DBA của chúng tôi có thể gán quyền này cho người dùng khác.

Xóa quyền

Khi chúng tôi đã cấp quyền, điều này thường chứng minh là cần thiết để thu hồi chúng vào một ngày sau đó. May mắn thay, SQL cung cấp cho chúng ta lệnh REVOKE để loại bỏ các quyền đã cấp trước đó. Đây là cú pháp:

REVOKE [TÙY CHỌN LỰA CHỌN CHO]
ON


FROM

Bạn sẽ nhận thấy rằng cú pháp của lệnh này tương tự như lệnh GRANT. Điểm khác biệt duy nhất là VỚI GRANT OPTION được chỉ định trên dòng lệnh REVOKE thay vì ở cuối lệnh. Ví dụ, hãy tưởng tượng chúng tôi muốn thu hồi quyền được cấp trước đó của Mary để xóa hồ sơ khỏi cơ sở dữ liệu Khách hàng. Chúng tôi sẽ sử dụng lệnh sau:

REVOKE DELETE
TRÊN KHÁCH HÀNG
TỪ Mary

Và đó là tất cả để có nó! Có một cơ chế bổ sung được hỗ trợ bởi Microsoft SQL Server đáng nhắc đến — lệnh DENY. Lệnh này có thể được sử dụng để từ chối một cách rõ ràng quyền cho người dùng mà họ có thể có thông qua tư cách thành viên hiện tại hoặc tương lai. Đây là cú pháp:

DENY
ON


ĐẾN

Ví dụ

Quay lại ví dụ trước của chúng ta, hãy tưởng tượng rằng Mary cũng là một thành viên của vai trò Người quản lý cũng có quyền truy cập vào bảng Khách hàng. Câu lệnh REVOKE trước đó sẽ không đủ để từ chối truy cập của nó vào bảng. Nó sẽ xóa quyền được cấp cho cô thông qua câu lệnh GRANT nhắm mục tiêu tài khoản người dùng của cô, nhưng sẽ không ảnh hưởng đến quyền truy cập thông qua tư cách thành viên của cô trong vai trò Người quản lý. Tuy nhiên, nếu chúng ta sử dụng một tuyên bố DENY nó sẽ chặn sự kế thừa của cô ấy cho phép. Đây là lệnh:

DỪNG XÓA
TRÊN KHÁCH HÀNG
Để mary

Lệnh DENY về cơ bản tạo ra một "quyền phủ định" trong các điều khiển truy cập cơ sở dữ liệu. Nếu sau này chúng tôi quyết định cho phép Mary xóa các hàng khỏi bảng Khách hàng, chúng tôi không thể sử dụng lệnh GRANT một cách đơn giản. Lệnh đó sẽ ngay lập tức bị ghi đè bởi DENY hiện có. Thay vào đó, đầu tiên chúng ta sẽ sử dụng lệnh REVOKE để loại bỏ mục nhập quyền phủ định như sau:

REVOKE DELETE
TRÊN KHÁCH HÀNG
TỪ Mary

Bạn sẽ nhận thấy rằng lệnh này hoàn toàn giống với lệnh được sử dụng để xóa quyền tích cực. Hãy nhớ rằng các lệnh DENY và GRANT đều hoạt động theo cách tương tự * mdash, cả hai đều tạo quyền (tích cực hoặc tiêu cực) trong cơ chế kiểm soát truy cập cơ sở dữ liệu. Lệnh REVOKE loại bỏ tất cả các quyền tích cực và tiêu cực cho người dùng được chỉ định. Khi lệnh này đã được ban hành, Mary sẽ có thể xóa các hàng trong bảng nếu cô ấy là thành viên của vai trò sở hữu quyền đó. Ngoài ra, lệnh GRANT có thể được cấp để cung cấp quyền DELETE trực tiếp cho tài khoản của cô ấy.

Trong suốt bài viết này, bạn đã học được rất nhiều về các cơ chế kiểm soát truy cập được hỗ trợ bởi Ngôn ngữ truy vấn chuẩn. Phần giới thiệu này sẽ cung cấp cho bạn một điểm khởi đầu tốt, nhưng tôi khuyến khích bạn tham khảo tài liệu DBMS của bạn để tìm hiểu các biện pháp bảo mật nâng cao được hệ thống của bạn hỗ trợ. Bạn sẽ thấy rằng nhiều cơ sở dữ liệu hỗ trợ các cơ chế kiểm soát truy cập nâng cao hơn, chẳng hạn như cấp quyền cho các cột cụ thể.