Database Security
Tại sao Database Security quan trọng?
Bảo mật database qua mã hóa (SHA5, CREATE SCHEMA ENCRYPTION), kiểm soát truy cập (CREATE ROLE, GRANT, CREATE USER), và nguyên tắc least privilege.
Tại sao Database Security quan trọng?
Database chứa thông tin nhạy cảm: thông tin khách hàng, lương nhân viên, hồ sơ y tế, dữ liệu tài chính. Mất an toàn database có thể dẫn đến:
- Vi phạm quyền riêng tư (GDPR, Privacy Act)
- Thiệt hại tài chính
- Mất uy tín công ty
Ba lớp bảo vệ chính: Mã hóa (Encryption), Kiểm soát truy cập (Access Control), và Phòng chống SQL Injection.
1. Mã hóa mật khẩu (Password Hashing)
Không bao giờ lưu mật khẩu dưới dạng plain text. Dùng hàm hash một chiều:
Tạo bảng user với mật khẩu
CREATE TABLE user (
id INT NOT NULL,
name VARCHAR(100) NOT NULL,
password VARCHAR(50) NOT NULL
);
INSERT với SHA2 hashing
INSERT INTO user VALUES (111, 'jane', SHA2('password', 256));
SHA2('password', 256) tạo hash 64 ký tự hex. Không thể giải mã ngược. Khi đăng nhập, hash mật khẩu nhập vào rồi so sánh với hash đã lưu.
MySQL cũng hỗ trợ:
SHA1()— 40 ký tự hex (không còn an toàn)SHA2(str, 256)— SHA-256 (khuyên dùng)SHA2(str, 512)— SHA-512 (mạnh hơn)MD5()— 32 ký tự hex (không an toàn, không dùng)
2. Database-level Encryption
MySQL hỗ trợ mã hóa toàn bộ schema (tất cả bảng trong schema đó):
CREATE SCHEMA db1 DEFAULT ENCRYPTION='y';
CREATE TABLE db1.user (
id INT,
name VARCHAR(100),
password VARCHAR(50)
);
Với ENCRYPTION='y', dữ liệu trên đĩa được mã hóa tự động. Ngay cả khi ai đó lấy được file vật lý của database, họ không đọc được dữ liệu.
Có thể set encryption cho từng bảng:
CREATE TABLE SensitiveData (
id INT PRIMARY KEY,
data VARCHAR(200)
) ENCRYPTION='y';
3. Access Control — Kiểm soát truy cập theo Role
Nguyên tắc Least Privilege: mỗi user chỉ có đúng quyền cần thiết, không hơn.
Bước 1: Tạo Role
CREATE ROLE accountant; CREATE ROLE manager; CREATE ROLE readonly_user;
Bước 2: Gán quyền cho Role
GRANT SELECT ON employee TO accountant; GRANT SELECT, INSERT, UPDATE, DELETE ON salary TO accountant; GRANT SELECT ON employee TO readonly_user; GRANT ALL PRIVILEGES ON company_db.* TO manager;
Các quyền có thể GRANT:
| Privilege | Mô tả |
|---|---|
SELECT | Đọc dữ liệu |
INSERT | Thêm dòng mới |
UPDATE | Sửa dữ liệu hiện có |
DELETE | Xóa dòng |
CREATE | Tạo bảng/database |
DROP | Xóa bảng/database |
ALL PRIVILEGES | Tất cả quyền |
Bước 3: Tạo User
CREATE USER jane IDENTIFIED BY 'initialpassword123'; CREATE USER bob IDENTIFIED BY 'securePass456!';
Bước 4: Gán Role cho User
GRANT accountant TO jane; GRANT readonly_user TO bob; GRANT manager TO alice;
REVOKE — Thu hồi quyền
REVOKE DELETE ON salary FROM accountant; REVOKE accountant FROM jane;
4. Quyền trên View — Bảo vệ dữ liệu nhạy cảm
Dùng View để che giấu cột nhạy cảm:
CREATE VIEW EmployeePublicInfo AS SELECT EmployeeID, Name, Department, JobTitle FROM Employee; GRANT SELECT ON EmployeePublicInfo TO readonly_user;
User readonly_user thấy EmployeePublicInfo nhưng không thấy bảng Employee gốc (với cột Salary, SSN, ...).
5. Kiểm tra quyền
SHOW GRANTS FOR jane; SHOW GRANTS FOR CURRENT_USER;