Triển khai CockroachDB trên các Node đã Hardening
Tiến hành cài đặt CockroachDB phiên bản Enterprise lên các node đã được hardening kernel ở phần trước. Chúng ta sẽ sử dụng gói RPM/APT chính thức và cấu hình systemd để đảm bảo quyền hạn tối thiểu (least privilege).
Cài đặt gói CockroachDB Enterprise
Tải và cài đặt gói CockroachDB Enterprise từ repository chính thức. Sử dụng gói Enterprise là bắt buộc để hỗ trợ tính năng TDE (Transparent Data Encryption) và các tính năng bảo mật nâng cao khác.
curl -o cockroach-enterprise-v23.2.1.tar.gz https://releases.cockroachdb.com/cockroach-v23.2.1/cockroach-enterprise-v23.2.1.tar.gz && tar -xzf cockroach-enterprise-v23.2.1.tar.gz && mv cockroach-v23.2.1/cockroach /usr/local/bin/cockroach && rm -rf cockroach-v23.2.1.tar.gz cockroach-v23.2.1
Đường dẫn: /usr/local/bin/cockroach. Kết quả mong đợi: Command 'cockroach' có thể gọi được từ terminal với quyền root, phiên bản hiển thị là v23.2.1 Enterprise.
Tạo user và thư mục dữ liệu an toàn
Tạo user hệ thống 'cockroach' và group 'cockroach' để chạy dịch vụ, sau đó tạo thư mục dữ liệu với quyền sở hữu chính xác. Việc này ngăn chặn các user khác truy cập trực tiếp vào file dữ liệu nhạy cảm trên disk.
useradd -r -s /bin/false -U cockroach && mkdir -p /var/lib/cockroach/data && chown -R cockroach:cockroach /var/lib/cockroach/data && chmod 700 /var/lib/cockroach/data
Đường dẫn: /var/lib/cockroach/data. Kết quả mong đợi: Thư mục dữ liệu có quyền 700, owner là cockroach:cockroach, không user nào khác có quyền đọc.
Cấu hình systemd unit file
Tạo file unit file để quản lý vòng đời của CockroachDB, tích hợp các chỉ số bảo mật (Hardening) của systemd như NoNewPrivileges, ProtectSystem, và ProtectHome để ngăn chặn container escape hoặc truy cập trái phép vào hệ thống file.
cat > /etc/systemd/system/cockroach.service
Đường dẫn: /etc/systemd/system/cockroach.service. Kết quả mong đợi: File unit được tạo, systemd nhận diện service mới, các tham số bảo mật đã được ghi vào file.
Khởi động và Verify Cluster
Khởi động service trên tất cả các node (node 10, 11, 12) và kiểm tra trạng thái của cluster. Đây là bước xác nhận kiến trúc phân tán đã hoạt động đúng sau khi hardening.
systemctl daemon-reload && systemctl enable cockroach && systemctl start cockroach && systemctl status cockroach
Đường dẫn: N/A (Command line). Kết quả mong đợi: Trạng thái service là 'active (running)', log không có lỗi về quyền truy cập file (Permission denied).
cockroach node list --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs
Đường dẫn: N/A. Kết quả mong đợi: Danh sách 3 node hiển thị với trạng thái 'liveness' là 'alive' và 'status' là 'healthy'.
Cấu hình TDE với Secret Sharing
Triển khai Transparent Data Encryption (TDE) cho toàn bộ dữ liệu tại nghỉ (data-at-rest). Khóa mã hóa sẽ được chia nhỏ thành các mảnh (shards) dựa trên cơ chế Shamir's Secret Sharing đã thiết lập ở Phần 4.
Tạo và phân phối mảnh khóa (Key Shards)
Sử dụng các file mảnh khóa đã tạo ở Phần 4 để tạo một file khóa tổng hợp (Keyset) cho CockroachDB. Chúng ta sẽ đặt các mảnh khóa vào thư mục riêng biệt với quyền truy cập hạn chế tối đa.
mkdir -p /var/lib/cockroach/secrets && chown -R root:root /var/lib/cockroach/secrets && chmod 700 /var/lib/cockroach/secrets
Đường dẫn: /var/lib/cockroach/secrets. Kết quả mong đợi: Thư mục secrets được tạo, chỉ root có quyền truy cập, ngăn user cockroach đọc trực tiếp các file key raw.
cat /path/to/shard_1 /path/to/shard_2 /path/to/shard_3 > /var/lib/cockroach/secrets/master_key.enc && chmod 600 /var/lib/cockroach/secrets/master_key.enc
Đường dẫn: /var/lib/cockroach/secrets/master_key.enc. Kết quả mong đợi: File master_key.enc được tạo bằng cách nối các mảnh khóa, quyền 600 (chỉ owner root có thể đọc/ghi).
Cấu hình CockroachDB sử dụng Keyset
Sửa file systemd unit file để chỉ định đường dẫn tới file khóa đã hợp nhất và bật chế độ TDE. CockroachDB sẽ tự động giải mã các mảnh khóa khi khởi động nếu cấu hình đúng.
cat > /etc/systemd/system/cockroach.service
Đường dẫn: /etc/systemd/system/cockroach.service. Kết quả mong đợi: Service file được cập nhật với các tham số --external-io-dir và --encryption-method.
Tạo file cấu hình Encryption Policy
Tạo file cấu hình riêng biệt để định nghĩa chính sách mã hóa, chỉ định thuật toán (AES-256-GCM) và đường dẫn tới keyset. File này sẽ được load bởi systemd qua EnvironmentFile.
mkdir -p /etc/cockroach && cat > /etc/cockroach/encryption.conf
Đường dẫn: /etc/cockroach/encryption.conf. Kết quả mong đợi: File config được tạo, chứa các biến môi trường cần thiết cho TDE.
Verify TDE đã kích hoạt
Khởi động lại cluster và kiểm tra xem dữ liệu có đang được mã hóa hay không. Nếu TDE hoạt động, các file SST trong thư mục data sẽ là dữ liệu ngẫu nhiên (binary) thay vì text có thể đọc được.
systemctl daemon-reload && systemctl restart cockroach
Đường dẫn: N/A. Kết quả mong đợi: Service khởi động thành công, không báo lỗi "Key not found" hoặc "Decryption failed".
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SHOW CLUSTER SETTING cluster.encryption.method;"
Đường dẫn: N/A. Kết quả mong đợi: Output trả về 'external-io', xác nhận TDE đang sử dụng cơ chế mã hóa bên ngoài.
Cấu hình Giao dịch Phân tán và Replication
Tối ưu hóa cơ chế đồng bộ dữ liệu để đảm bảo tính nhất quán (Consistency) trong môi trường phân tán, đồng thời thiết lập chính sách sao lưu tự động cho dữ liệu đã mã hóa.
Cấu hình Replication Factor
Đặt hệ số sao chép (Replication Factor) là 3 để dữ liệu được lưu trữ trên 3 node khác nhau. Điều này đảm bảo tính sẵn sàng cao (High Availability) ngay cả khi 1 node bị lỗi vật lý.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "ALTER SYSTEM SET cluster.replication.factor = 3;"
Đường dẫn: N/A. Kết quả mong đợi: Command thực thi thành công, không có lỗi, replication factor của cluster được cập nhật.
Cấu hình Transaction Isolation
Thiết lập chế độ cách ly giao dịch (Isolation Level) mặc định là Serializable để đảm bảo tính toàn vẹn dữ liệu tuyệt đối trong môi trường phân tán, ngăn chặn hiện tượng Dirty Read hoặc Phantom Read.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SET CLUSTER SETTING cluster.transaction.isolation_level = 'serializable';"
Đường dẫn: N/A. Kết quả mong đợi: Transaction isolation level được thiết lập thành 'serializable' cho toàn cluster.
Thiết lập Backup tự động với dữ liệu mã hóa
Cấu hình chính sách sao lưu tự động (Automated Backup) sử dụng lệnh CRDB Backup. Dữ liệu sẽ được mã hóa lại một lần nữa khi xuất ra file backup để đảm bảo bảo mật ở lớp lưu trữ (S3/NFS).
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "CREATE SCHEDULE backup_db_backup FOR BACKUP DATABASE production TO 's3://my-bucket/backup/production?aws_access_key_id=KEY&aws_secret_access_key=SECRET®ion=us-east-1' WITH encryption_method='aes256-gcm', encryption_key='my-secret-backup-key' SCHEDULE '0 2 * * *';"
Đường dẫn: N/A. Kết quả mong đợi: Schedule backup được tạo, lịch trình chạy vào 02:00 sáng mỗi ngày, dữ liệu sẽ được mã hóa trước khi đẩy lên S3.
Verify Replication và Backup
Kiểm tra trạng thái của các range dữ liệu để đảm bảo chúng đã được sao chép đủ 3 bản, và xác nhận schedule backup đã tồn tại trong hệ thống.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SELECT * FROM system.replication_status WHERE state = 'under_replicated';"
Đường dẫn: N/A. Kết quả mong đợi: Query trả về kết quả rỗng (no rows returned), nghĩa là tất cả dữ liệu đã được replication đầy đủ.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SHOW SCHEDULES;"
Đường dẫn: N/A. Kết quả mong đợi: Hiển thị schedule 'backup_db_backup' với trạng thái 'active' và thời gian chạy tiếp theo.
Kiểm tra tính khả dụng sau khởi động lại
Thực hiện mô phỏng sự cố bằng cách khởi động lại toàn bộ cluster để xác nhận cơ chế Secret Sharing và TDE hoạt động đúng, dữ liệu có thể được giải mã và truy cập lại.
Dừng và Khởi động lại Cluster
Dừng service trên tất cả các node và khởi động lại để mô phỏng tình huống reboot máy chủ. Đây là bước quan trọng nhất để test tính năng TDE + Secret Sharing.
systemctl stop cockroach && sleep 5 && systemctl start cockroach
Đường dẫn: N/A (Thực thi trên cả 3 node). Kết quả mong đợi: Service khởi động lại thành công trên cả 3 node, không có lỗi "Corrupted data" hoặc "Encryption key mismatch".
Kiểm tra khả năng truy cập dữ liệu
Thực hiện một query đọc đơn giản để xác nhận database đã giải mã dữ liệu thành công và sẵn sàng phục vụ người dùng.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SELECT COUNT(*) FROM production.users;"
Đường dẫn: N/A. Kết quả mong đợi: Trả về số lượng bản ghi chính xác (ví dụ: 1000), không có lỗi truy cập dữ liệu.
Kiểm tra tính toàn vẹn của Backup
Thực hiện thao tác restore thử nghiệm (dry-run) hoặc kiểm tra metadata của backup gần nhất để đảm bảo file backup đã được tạo với dữ liệu mã hóa vẫn nguyên vẹn.
cockroach sql --host 192.168.1.10 --certs-dir /var/lib/cockroach/certs -e "SHOW BACKUPS FROM 's3://my-bucket/backup/production';"
Đường dẫn: N/A. Kết quả mong đợi: Hiển thị danh sách các backup đã tạo, kèm thông tin thời gian tạo và kích thước, xác nhận backup tồn tại và có thể đọc được metadata.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Secret Sharing và Linux Kernel Hardening
« Phần 4: Triển khai cơ chế Secret Sharing (Shamir's Secret Sharing) cho quản lý khóa
Phần 6: Kiểm thử bảo mật, hiệu năng và xử lý sự cố cho hệ thống phân tán »