Hãy tưởng tượng một cơn ác mộng: bạn là admin database, và một bảng dữ liệu khách hàng quan trọng bỗng dưng... biến mất. Ai làm chuyện này? Tại sao? Có thể là do một intern chưa có kinh nghiệm, lỡ tay gõ DROP TABLE. Hoặc cũng có thể là một user xấu nào đó có quyền truy cập vào database... Dù là gì đi nữa thì cũng đã muộn để hoảng loạn! Chỉ còn cách tỉnh dậy, lấy lại bình tĩnh và bắt đầu học về bảo vệ database thôi. Vì database mà không có bảo mật thì chẳng khác gì nhà không có móng vậy.
Với database, bảo mật phải thật chắc để tránh các mối đe dọa như:
- Truy cập trái phép: ai đó lấy được quyền truy cập vào dữ liệu mà họ không được phép.
- Rò rỉ dữ liệu: mật khẩu, thẻ tín dụng hoặc thông tin nhạy cảm rơi vào tay người lạ.
- SQL-injection: chiêu trò cực kỳ nguy hiểm cho phép hacker thao túng database của bạn qua những truy vấn không được bảo vệ kỹ.
- Lỗi do con người: xóa nhầm dữ liệu hoặc thay đổi mà không thể hoàn tác.
Trong PostgreSQL, bảo mật được thực hiện ở nhiều tầng: từ tạo roles và quản lý quyền cho đến giới hạn truy cập mạng. Nhờ vậy bạn có thể tùy chỉnh linh hoạt ai được làm gì với dữ liệu của mình.
Các tầng bảo mật chính trong PostgreSQL
Trong PostgreSQL có ba tầng chính mà bạn có thể quản lý truy cập:
1. Quản lý truy cập ở cấp database. Ở tầng này, bạn quyết định ai được phép kết nối vào database và user đó được làm gì khi đã kết nối. Ví dụ, bạn có thể cấm một số user không cho vào database luôn. Người khác thì chỉ cho phép đọc dữ liệu thôi. Công cụ chính ở đây là roles.
2. Kiểm soát truy cập ở cấp bảng, dòng và cột.
Trong PostgreSQL, bạn có thể giới hạn truy cập dữ liệu rất chi tiết. Bạn có thể:
- Chỉ cho phép user đọc một số cột nhất định.
- Chỉ cho phép đọc dữ liệu trong bảng nếu user là chủ sở hữu của dòng đó. Cái này gọi là ROW LEVEL SECURITY (RLS), tụi mình sẽ học kỹ ở các bài sau.
- Giới hạn truy cập chỉ vào các schema chứa dữ liệu quan trọng.
3. Cấu hình truy cập mạng. Database có thể được cấu hình chỉ nhận truy vấn từ client đáng tin cậy. Cái này chỉnh trong file cấu hình PostgreSQL tên là pg_hba.conf. Nhờ file này, bạn có thể chỉ cho phép kết nối từ máy local hoặc một số IP nhất định.
Các công cụ bảo mật của PostgreSQL
Cùng xem PostgreSQL có những công cụ bảo mật gì và chúng hoạt động ra sao nhé.
Bắt đầu với roles và privileges — đây là nền tảng của hệ thống quản lý truy cập. Trong PostgreSQL, role không chỉ là user, mà còn linh hoạt hơn nhiều. Nó có thể đại diện cho một người hoặc cả một nhóm. Ví dụ, bạn có thể tạo role tên manager có toàn quyền với bảng đơn hàng, còn intern thì dùng role intern chỉ có quyền đọc — để lỡ tay cũng không phá hỏng gì.
Bản thân roles có thể cấu hình rất linh hoạt: cho người này nhiều quyền, người kia ít quyền, hoặc cho phép một role kế thừa quyền của role khác. Nhờ roles mà bạn quyết định ai được kết nối vào database, schema và bảng nào được truy cập, thậm chí là dòng nào có thể xem hoặc sửa.
Tiếp theo là các file cấu hình. Trong PostgreSQL có hai file cấu hình chính đóng vai trò quan trọng trong bảo mật.
File đầu tiên là pg_hba.conf. Nó kiểm soát truy cập mạng vào database. Ở đây bạn cấu hình ai được phép kết nối vào server, từ IP nào và xác thực kiểu gì. Nếu muốn chỉ cho phép một số máy hoặc user truy cập — chỉnh ở đây luôn.
File thứ hai là postgresql.conf. Nó quản lý các thiết lập chung của server, trong đó có cả các tham số log và audit. Nhờ vậy bạn có thể theo dõi ai làm gì, phát hiện kịp thời hoạt động đáng ngờ và điều tra chi tiết khi cần.
Cuối cùng là logging và audit. "Log là bạn thân nhất của admin". Nghe hơi lạ nhưng với admin database thì đây là quy tắc số một. Trong PostgreSQL, bạn có thể cấu hình log tất cả truy vấn và hành động của user. Nhờ đó, nếu có chuyện gì xảy ra, bạn sẽ biết ai đã làm gì với database.
Ví dụ: bảo vệ dữ liệu khỏi SQL-injection
SQL-injection là một trong những kiểu tấn công phổ biến nhất vào database. Và bạn phải biết cách phòng tránh nó. Hãy tưởng tượng bạn có một app, nơi user nhập ID tài khoản để xem profile. App sẽ chạy truy vấn kiểu này:
SELECT * FROM users WHERE id = 123;
Nhưng nếu user nhập 123 OR 1=1 thay vì số? Khi đó truy vấn sẽ thành:
SELECT * FROM users WHERE id = 123 OR 1=1;
Và thay vì một bản ghi toàn bộ bảng users sẽ bị lộ.
Làm sao để bảo vệ? PostgreSQL cho phép bạn dùng parameterized queries hoặc prepared statements (PREPARE và EXECUTE), để dữ liệu user không bao giờ trộn lẫn với code SQL. Ví dụ như này:
PREPARE get_user_by_id (int) AS
SELECT * FROM users WHERE id = $1;
EXECUTE get_user_by_id(123);
Thêm ví dụ về các mối đe dọa thực tế
Để bạn thấy rõ tại sao cần bảo mật, mình kể hai kịch bản thực tế nhé:
Ví dụ 1: "Nhân viên xóa sạch bảng"
Có lần ở một công ty (thật ra là nhiều công ty luôn...) intern lỡ gõ lệnh này trong console:
DROP TABLE employees;
Và 10 năm dữ liệu nhân viên bay màu luôn. Làm sao tránh được chuyện này?
- Quản lý quyền cho chặt! Ví dụ, role
internchỉ nên được phép đọc thôi. - Cấu hình audit! Log sẽ cho bạn biết ai đã chạy lệnh định mệnh đó.
Ví dụ 2: "Rò rỉ dữ liệu qua kết nối không mã hóa"
Nếu user kết nối tới server PostgreSQL mà không có mã hóa, login và password có thể bị hacker bắt được. Hãy cấu hình SSL và đảm bảo kết nối luôn được bảo vệ nhé.
Nhiệm vụ chính của admin
Kết lại phần mở đầu này, tụi mình tổng kết ba nhiệm vụ quan trọng nhất của admin PostgreSQL:
- Phân quyền truy cập. Đảm bảo chỉ user được phép mới thực hiện được các thao tác nhất định.
- Mã hóa. Dữ liệu nhạy cảm luôn phải được lưu trữ và truyền đi dưới dạng mã hóa.
- Giám sát. Cấu hình audit và theo dõi hoạt động đáng ngờ trong log.
Ở các bài sau, bạn sẽ học cách tạo roles, quản lý truy cập bằng GRANT và REVOKE, triển khai kiểm soát truy cập ở cấp dòng và dùng mã hóa để bảo vệ dữ liệu.
GO TO FULL VERSION