Cách thiết lập các quy tắc truy cập cho các bảng trong PostgreSQL

Khi làm việc với cơ sở dữ liệu PostgreSQL, việc quản lý quyền truy cập vào các bảng là điều cực kỳ quan trọng nhằm đảm bảo tính bảo mật và toàn vẹn dữ liệu. PostgreSQL cung cấp nhiều cách để kiểm soát quyền truy cập cho người dùng, từ việc giới hạn truy cập ở cấp độ bảng cho đến cấp độ dòng hoặc cột. Trong bài viết này, chúng ta sẽ tìm hiểu cách thiết lập các quy tắc truy cập cho các bảng thông qua việc sử dụng các lệnh như GRANT, REVOKE, cũng như cách sử dụng Row-Level Security (RLS) để bảo vệ dữ liệu.

1. Quyền truy cập cơ bản với GRANTREVOKE

1.1 Lệnh GRANT

Lệnh GRANT trong PostgreSQL được sử dụng để cấp quyền truy cập cho người dùng hoặc nhóm người dùng (roles). Bạn có thể cấp các quyền như SELECT, INSERT, UPDATE, DELETE trên một bảng hoặc các đối tượng khác.

Cú pháp của lệnh GRANT:

GRANT {quyền} ON {đối tượng} TO {người dùng/role};

Ví dụ

Giả sử bạn có một bảng tên là employees, và bạn muốn cấp quyền đọc dữ liệu (SELECT) cho người dùng john.

GRANT SELECT ON employees TO john;

Trong trường hợp bạn muốn cấp quyền thêm (INSERT) và cập nhật (UPDATE) dữ liệu:

GRANT INSERT, UPDATE ON employees TO john;

1.2 Lệnh REVOKE

Lệnh REVOKE dùng để thu hồi các quyền đã được cấp. Cú pháp của nó giống với GRANT, chỉ khác ở chỗ thay vì cấp quyền, ta sẽ thu hồi chúng.

Cú pháp của lệnh REVOKE:

REVOKE {quyền} ON {đối tượng} FROM {người dùng/role};

Ví dụ

Nếu bạn muốn thu hồi quyền truy cập SELECT từ người dùng john:

REVOKE SELECT ON employees FROM john;

Nếu bạn muốn thu hồi tất cả các quyền truy cập của người dùng:

REVOKE ALL PRIVILEGES ON employees FROM john;

2. Các loại quyền trong PostgreSQL

Các quyền mà bạn có thể cấp hoặc thu hồi trên bảng bao gồm:

  • SELECT: Quyền đọc dữ liệu từ bảng.
  • INSERT: Quyền thêm dữ liệu vào bảng.
  • UPDATE: Quyền cập nhật dữ liệu trong bảng.
  • DELETE: Quyền xóa dữ liệu khỏi bảng.
  • TRUNCATE: Quyền làm trống bảng.
  • REFERENCES: Quyền tạo khóa ngoại liên kết với bảng.
  • TRIGGER: Quyền tạo trigger trên bảng.

3. Kiểm soát truy cập ở cấp độ hàng (Row-Level Security – RLS)

Row-Level Security (RLS) là một tính năng mạnh mẽ của PostgreSQL cho phép bạn kiểm soát quyền truy cập dữ liệu ở cấp độ hàng. Điều này có nghĩa là bạn có thể thiết lập các quy tắc để mỗi người dùng chỉ có thể truy cập một số hàng nhất định trong bảng.

3.1 Bật Row-Level Security

Trước khi sử dụng RLS, bạn cần bật tính năng này cho bảng bằng lệnh ALTER TABLE.

ALTER TABLE employees ENABLE ROW LEVEL SECURITY;

3.2 Tạo chính sách bảo mật (Security Policy)

Bạn có thể tạo một chính sách để xác định người dùng nào có thể truy cập các hàng nào trong bảng. Dưới đây là cú pháp để tạo một chính sách:

CREATE POLICY {tên chính sách} ON {bảng} 
  FOR {quyền} 
  USING {điều kiện};

Ví dụ

Giả sử bạn muốn tạo một chính sách cho bảng employees sao cho mỗi người dùng chỉ có thể xem các hàng mà cột department_id khớp với phòng ban của họ. Đầu tiên, bạn cần tạo chính sách:

CREATE POLICY employee_department_policy ON employees
  FOR SELECT
  USING (department_id = current_user);

Chính sách này đảm bảo rằng người dùng chỉ có thể xem những hàng có department_id tương ứng với tên người dùng của họ (giả sử department_id là tên đăng nhập).

3.3 Áp dụng chính sách bảo mật

Sau khi tạo chính sách, bạn cần áp dụng nó bằng lệnh sau:

ALTER TABLE employees FORCE ROW LEVEL SECURITY;

Lệnh này sẽ bắt buộc bảng employees tuân theo các chính sách bảo mật đã được định nghĩa.

4. Quản lý quyền truy cập ở cấp độ cột

Nếu bạn muốn kiểm soát quyền truy cập ở cấp độ cột, PostgreSQL không hỗ trợ trực tiếp các lệnh như GRANT hay REVOKE cho cột cụ thể. Tuy nhiên, bạn có thể sử dụng các view (lượt nhìn) để tạo ra một bảng ảo chỉ chứa các cột bạn muốn chia sẻ. Sau đó, bạn có thể cấp quyền truy cập cho view này.

Ví dụ tạo view

Giả sử bạn muốn tạo một view cho bảng employees chỉ hiển thị các cột nameposition, và sau đó cấp quyền truy cập SELECT cho view này.

CREATE VIEW employee_overview AS
SELECT name, position FROM employees;

GRANT SELECT ON employee_overview TO john;

Với cách này, người dùng john sẽ chỉ có quyền xem các cột nameposition từ bảng employees.

Kết luận

Trong PostgreSQL, việc quản lý quyền truy cập cho các bảng là yếu tố cần thiết để bảo vệ dữ liệu. Bằng cách sử dụng các lệnh GRANTREVOKE, bạn có thể dễ dàng kiểm soát ai có quyền thực hiện các hành động trên bảng. Đồng thời, với tính năng Row-Level Security (RLS), bạn có thể kiểm soát truy cập ở mức độ chi tiết hơn, đến từng hàng dữ liệu. Cuối cùng, thông qua các view, bạn có thể quản lý quyền truy cập ở cấp độ cột. Việc thiết lập các quy tắc truy cập chính xác sẽ giúp đảm bảo tính bảo mật và tính toàn vẹn cho hệ thống cơ sở dữ liệu của bạn.