Lý thuyết cơ bản và nguyên lý Shamir's Secret Sharing
Shamir's Secret Sharing (SSS) là một thuật toán mật mã học cho phép chia một bí mật (secret) thành nhiều mảnh (shares) và phân phối chúng cho các người tham gia.
Nguyên lý hoạt động dựa trên đa thức: Để khôi phục bí mật gốc, cần một ngưỡng (threshold) k mảnh nhất định từ tổng số n mảnh được tạo ra. Nếu thiếu k mảnh, không thể suy ra bất kỳ thông tin nào về bí mật gốc.
Trong kiến trúc Database phân tán của chúng ta, Master Key (Khóa chính) sẽ được chia thành n=5 mảnh, với ngưỡng khôi phục k=3. Điều này đảm bảo hệ thống vẫn hoạt động ngay cả khi 2 node bị mất hoặc bị tấn công.
Cài đặt môi trường và tạo cặp khóa cho từng Node
Trước khi chia sẻ bí mật, mỗi node trong cụm (cluster) cần có một cặp khóa riêng tư (Private Key) và công khai (Public Key) để ký và xác minh các mảnh khóa.
Chúng ta sẽ sử dụng OpenSSL có sẵn trên Linux để tạo khóa RSA 4096-bit.
Thực hiện lệnh này trên tất cả các node (node-1 đến node-5) để tạo cặp khóa riêng:
mkdir -p /opt/ssss-keys/$(hostname)
cd /opt/ssss-keys/$(hostname)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out private.key
openssl rsa -in private.key -pubout -out public.key
chmod 600 private.key
chmod 644 public.key
Kết quả mong đợi: Thư mục /opt/ssss-keys chứa tên node, bên trong có file private.key (quyền 600) và public.key (quyền 644). Không có lỗi xuất hiện trên stdout.
Tạo Public Key Bundle cho toàn cụm
Để các node có thể xác minh tính nguyên vẹn của mảnh khóa từ node khác, chúng ta cần tập hợp tất cả Public Key vào một file duy nhất trên mỗi node.
Tạo file danh sách public key của tất cả 5 node:
cd /opt/ssss-keys
cat node-1/public.key node-2/public.key node-3/public.key node-4/public.key node-5/public.key > cluster_public_keys.pem
Kết quả mong đợi: File cluster_public_keys.pem được tạo thành công, chứa 5 cặp public key nối tiếp nhau.
Triển khai chia sẻ khóa Master Key thành các mảnh
Chúng ta sẽ sử dụng thư viện `ssss` (Shamir's Secret Sharing) được biên dịch sẵn hoặc cài đặt qua package manager. Nếu không có sẵn, ta dùng Python với thư viện `ssss` hoặc `pyssss` để thực thi logic chia sẻ.
Đảm bảo đã cài đặt Python3 và pip trên node chủ (node-1).
apt update && apt install -y python3-pip
pip3 install ssss
Kết quả mong đợi: Thư viện ssss được cài đặt thành công, không báo lỗi phiên bản Python.
Định nghĩa Master Key và tham số chia sẻ
Chúng ta sẽ tạo một Master Key ngẫu nhiên (32 bytes) để dùng làm khóa mã hóa cho Database (TDE). Sau đó chia nó thành 5 mảnh với ngưỡng 3.
Tạo script Python để thực hiện việc này:
cat > /opt/ssss-scripts/generate_shares.py
Kết quả mong đợi: Script được tạo thành công, có quyền thực thi (+x).
Thực thi chia sẻ và phân phối
Chạy script trên node chủ (node-1) để tạo các mảnh khóa. Sau đó, phân phối từng file .share về đúng node tương ứng.
cd /opt/ssss-scripts
python3 generate_shares.py
Kết quả mong đợi: Script chạy xong, hiển thị thông báo "Share generated for node-1" đến "node-5". Thư mục /opt/ssss-shares xuất hiện 5 file .share và 1 file config.json.
Phân phối mảnh khóa qua SSH
Sử dụng scp để gửi từng mảnh khóa về đúng node đích. Đảm bảo SSH key-based authentication đã được cấu hình trong phần trước.
for i in {1..5}; do
scp /opt/ssss-shares/node-$i.share root@node-$i:/opt/ssss-shares/
echo "Share for node-$i transferred."
done
Kết quả mong đợi: Không có lỗi truyền tải, thông báo thành công cho từng node. Trên mỗi node, file .share tương ứng xuất hiện trong thư mục /opt/ssss-shares/.
Thiết lập cơ chế khôi phục khóa
Khôi phục khóa yêu cầu thu thập đủ 3 mảnh (threshold) từ các node khác nhau để tái tạo lại Master Key gốc.
Chúng ta sẽ tạo script khôi phục có thể chạy trên bất kỳ node nào, miễn là nó có thể truy cập vào 2 node khác để lấy mảnh.
Script khôi phục tự động
Tạo script `recover_key.py` để đọc 3 file share, hợp nhất và giải mã ra Master Key.
cat > /opt/ssss-scripts/recover_key.py
Kết quả mong đợi: Script được tạo, có quyền thực thi.
Thực hành khôi phục giả lập
Giả lập mất node-1 và node-2. Chúng ta sẽ lấy mảnh từ node-3, node-4, node-5 về node-1 để thử khôi phục.
cd /opt/ssss-scripts
# Giả lập lấy share từ node-3, node-4, node-5 về node-1 (trong thực tế dùng scp)
# Ở đây ta copy nội dung file để test logic trên cùng một máy
cp /opt/ssss-shares/node-3.share /tmp/share_a
cp /opt/ssss-shares/node-4.share /tmp/share_b
cp /opt/ssss-shares/node-5.share /tmp/share_c
python3 recover_key.py /tmp/share_a /tmp/share_b /tmp/share_c
Kết quả mong đợi: Xuất hiện dòng "SUCCESS: Master Key recovered", hiển thị chuỗi Hex của khóa và thông báo lưu file recovered_master.key.
Tích hợp quy trình tự động hóa quản lý và luân chuyển khóa
Để đảm bảo bảo mật lâu dài, cần có cơ chế luân chuyển (key rotation) định kỳ. Quy trình này sẽ tạo một Master Key mới, chia sẻ lại, và cập nhật vào Database.
Script luân chuyển khóa tự động
Script này sẽ: 1. Tạo key mới, 2. Chia sẻ, 3. Phân phối, 4. Lưu thông tin cấu hình mới, 5. Lưu key cũ vào archive.
cat > /opt/ssss-scripts/rotate_keys.sh
Kết quả mong đợi: Script rotate_keys.sh được tạo và có quyền thực thi.
Cấu hình Cron job để chạy tự động
Thiết lập lịch chạy script luân chuyển khóa mỗi 90 ngày (ví dụ). Đây là chu kỳ bảo mật tiêu chuẩn cho hệ thống phân tán quan trọng.
crontab -l > /tmp/my_crontab
echo "0 0 15 */3 * root /opt/ssss-scripts/rotate_keys.sh >> /var/log/ssss_rotation.log 2>&1" >> /tmp/my_crontab
crontab /tmp/my_crontab
rm /tmp/my_crontab
Kết quả mong đợi: Cron job được thêm vào. Lệnh `crontab -l` sẽ hiển thị dòng lệnh vừa thêm. Script sẽ chạy tự động vào lúc 00:00 của ngày 15 mỗi quý.
Verify kết quả triển khai
Thực hiện các bước kiểm tra sau để đảm bảo toàn bộ hệ thống Secret Sharing hoạt động chính xác.
Kiểm tra 1: Xác minh sự tồn tại của các file share trên từng node.
for i in {1..5}; do
ssh node-$i "ls -l /opt/ssss-shares/node-$i.share"
done
Kiểm tra 2: Xác minh khả năng khôi phục với đúng ngưỡng (3 mảnh).
cd /opt/ssss-scripts
# Thử khôi phục với đủ 3 mảnh
python3 recover_key.py /opt/ssss-shares/node-1.share /opt/ssss-shares/node-2.share /opt/ssss-shares/node-3.share
Kiểm tra 3: Xác minh việc khôi phục thất bại khi thiếu mảnh (chỉ dùng 2 mảnh).
python3 recover_key.py /opt/ssss-shares/node-1.share /opt/ssss-shares/node-2.share
Kiểm tra 4: Kiểm tra lịch sử luân chuyển trong log.
cat /var/log/ssss_rotation.log
Kiểm tra 5: Kiểm tra quyền truy cập file private key và share file.
ls -la /opt/ssss-keys/$(hostname)/private.key
ls -la /opt/ssss-shares/node-1.share
Đ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 3: Hardening Linux Kernel: Tối ưu hóa tham số và vô hiệu hóa dịch vụ không cần thiết
Phần 5: Cài đặt và cấu hình Database phân tán (Distributed DB) với TDE »