Study Web

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:

PrivilegeMô tả
SELECTĐọc dữ liệu
INSERTThêm dòng mới
UPDATESửa dữ liệu hiện có
DELETEXóa dòng
CREATETạo bảng/database
DROPXóa bảng/database
ALL PRIVILEGESTấ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;