1. Tích hợp Mã hóa Đầu cuối (End-to-End Encryption) trước khi chia bí mật
Trước khi đưa dữ liệu vào thuật toán Shamir Secret Sharing, chúng ta phải mã hóa toàn bộ dữ liệu gốc. Điều này đảm bảo rằng ngay cả khi kẻ tấn công thu thập đủ các fragment (mảnh) để khôi phục, chúng vẫn không thể đọc được nội dung nếu không có khóa giải mã riêng biệt.
Chúng ta sẽ sử dụng OpenSSL với thuật toán AES-256-CBC để mã hóa file dữ liệu gốc. Khóa mã hóa (Encryption Key) sẽ được lưu trữ an toàn trong Key Management System (KMS) giả lập, không được lưu cùng file fragment.
1.1. Tạo và quản lý khóa mã hóa
Tạo một khóa mã hóa ngẫu nhiên 32 bytes (256-bit) và lưu vào file riêng biệt với quyền truy cập hạn chế.
Trước khi thực hiện, hãy tạo thư mục bảo mật cho khóa.
sudo mkdir -p /etc/shamir-db/crypto-keys
sudo chmod 700 /etc/shamir-db/crypto-keys
Khóa đã được tạo và lưu tại /etc/shamir-db/crypto-keys/master.key với quyền chỉ owner mới đọc được.
openssl rand -base64 32 > /etc/shamir-db/crypto-keys/master.key
chmod 600 /etc/shamir-db/crypto-keys/master.key
File master.key được tạo thành công. Kiểm tra bằng lệnh ls -l để đảm bảo quyền là -rw-------.
1.2. Mã hóa dữ liệu gốc (Plaintext to Ciphertext)
Giả sử file dữ liệu cần bảo vệ là /data/raw-database.db. Chúng ta sẽ mã hóa file này bằng khóa đã tạo ở bước trên.
Lệnh dưới đây sử dụng AES-256-CBC, vector khởi tạo (IV) ngẫu nhiên và lưu file mã hóa ra .enc.
openssl enc -aes-256-cbc -salt -in /data/raw-database.db -out /data/shamir-input/db-fragment-source.enc -pass file:/etc/shamir-db/crypto-keys/master.key
File db-fragment-source.enc được tạo ra. File này là đầu vào duy nhất cho thuật toán Shamir, đảm bảo tính bảo mật đầu cuối.
1.3. Verify kết quả mã hóa
Để xác minh tính toàn vẹn và khả năng giải mã, thực hiện giải mã thử nghiệm vào một file tạm.
openssl enc -d -aes-256-cbc -in /data/shamir-input/db-fragment-source.enc -out /tmp/verify-db.db -pass file:/etc/shamir-db/crypto-keys/master.key
cmp /data/raw-database.db /tmp/verify-db.db && echo "Verification SUCCESS: Data integrity confirmed."
Nếu không có output nào ngoài dòng "Verification SUCCESS", dữ liệu đã được mã hóa và giải mã chính xác mà không bị thay đổi bit nào.
2. Triển khai cơ chế xác thực Node và chữ ký số cho Fragment
Sau khi chia bí mật, mỗi fragment được phân phối đến một node khác nhau. Chúng ta cần đảm bảo fragment đó không bị giả mạo trong quá trình truyền tải và chỉ được chấp nhận từ các node đã được ủy quyền.
Chúng ta sẽ sử dụng Ed25519 (thông qua OpenSSL) để ký số vào từng fragment. Node nhận sẽ xác thực chữ ký trước khi lưu trữ.
2.1. Tạo cặp khóa xác thực cho Node
Mỗi node trong cụm phân tán cần có một cặp khóa riêng tư (Private Key) và công khai (Public Key) để ký và xác thực.
Tạo cặp khóa cho Node 1 (ví dụ: node-a).
mkdir -p /etc/shamir-db/nodes/node-a
openssl genpkey -algorithm Ed25519 -out /etc/shamir-db/nodes/node-a/node-a.priv
openssl pkey -in /etc/shamir-db/nodes/node-a/node-a.priv -pubout -out /etc/shamir-db/nodes/node-a/node-a.pub
File node-a.priv (bí mật) và node-a.pub (công khai) đã được tạo trong thư mục cấu hình của node.
2.2. Ký số cho Fragment (Signing)
Trước khi gửi fragment đến node đích, node tạo (Generator) phải ký vào fragment đó. Chúng ta ký vào nội dung của file fragment đã được mã hóa.
Giả sử fragment 1 có tên frag-1.enc. Lệnh dưới đây tạo file chữ ký .sig.
openssl dgst -sha512 -sign /etc/shamir-db/nodes/node-a/node-a.priv -out /data/shamir-input/frag-1.enc.sig /data/shamir-input/frag-1.enc
File frag-1.enc.sig được tạo. File này chứa chữ ký số chứng minh nguồn gốc và tính toàn vẹn của fragment.
2.3. Xác thực Fragment tại Node đích (Verification)
Node nhận (Receiver) sẽ sử dụng khóa công khai của node tạo để kiểm tra chữ ký. Nếu không khớp, fragment sẽ bị từ chối.
Thực hiện lệnh xác thực tại node đích (sử dụng file node-a.pub đã được phân phối an toàn).
openssl dgst -sha512 -verify /etc/shamir-db/nodes/node-a/node-a.pub -signature /data/shamir-input/frag-1.enc.sig /data/shamir-input/frag-1.enc
Kết quả mong đợi là dòng Verified OK. Nếu chữ ký bị giả mạo hoặc file bị thay đổi, kết quả sẽ là Verification Failure.
2.4. Verify kết quả xác thực
Để kiểm tra cơ chế từ chối, hãy cố tình sửa đổi một byte trong file fragment và chạy lại lệnh xác thực.
cp /data/shamir-input/frag-1.enc /tmp/frag-1-modified.enc
printf 'x' | dd of=/tmp/frag-1-modified.enc bs=1 seek=10 conv=notrunc 2>/dev/null
openssl dgst -sha512 -verify /etc/shamir-db/nodes/node-a/node-a.pub -signature /data/shamir-input/frag-1.enc.sig /tmp/frag-1-modified.enc
Kết quả phải là Verification Failure và Signature Verification Failed, chứng tỏ hệ thống đã chặn dữ liệu bị giả mạo.
3. Cấu hình chính sách kiểm soát truy cập (ACL) dựa trên vai trò
Trong hệ thống phân tán, không phải user nào cũng có quyền truy cập tất cả các fragment hoặc quyền khôi phục dữ liệu. Chúng ta sẽ sử dụng POSIX ACL kết hợp với Linux User Roles để phân quyền chi tiết.
Chính sách:
- Admin: Đọc, Ghi, Xóa tất cả fragment.
- Operator: Chỉ Đọc fragment để phục vụ khôi phục, không được xóa.
- Guest: Không có quyền truy cập vào thư mục chứa fragment.
3.1. Tạo nhóm người dùng (Roles)
Tạo các nhóm Linux tương ứng với các vai trò trong hệ thống.
groupadd shamir-admin
groupadd shamir-operator
groupadd shamir-guest
Các nhóm đã được tạo. Bây giờ thêm user cụ thể vào nhóm (ví dụ: user admin vào nhóm shamir-admin).
usermod -aG shamir-admin admin
usermod -aG shamir-operator operator
User admin và operator đã được gán vào nhóm tương ứng.
3.2. Cấu hình ACL cho thư mục Fragment
Áp dụng ACL lên thư mục chứa các fragment /data/shamir-input để kiểm soát quyền truy cập file.
Đầu tiên, cấp quyền cơ bản (Base permissions) là 700 (chỉ owner root mới truy cập), sau đó mở rộng quyền cho các nhóm qua ACL.
chmod 700 /data/shamir-input
setfacl -m g:shamir-admin:rwx /data/shamir-input
setfacl -m g:shamir-operator:r-- /data/shamir-input
setfacl -m g:shamir-guest:--- /data/shamir-input
Thư mục /data/shamir-input đã được cấu hình ACL: Admin có quyền đầy đủ, Operator chỉ đọc, Guest không có quyền.
3.3. Thiết kế Default ACL (Default ACL)
Quan trọng: Để các file fragment mới được tạo bởi root (trong quá trình chia bí mật) tự động thừa hưởng quyền ACL của thư mục, chúng ta cần thiết lập Default ACL.
setfacl -d -m g:shamir-admin:rwx /data/shamir-input
setfacl -d -m g:shamir-operator:r-- /data/shamir-input
setfacl -d -m g:shamir-guest:--- /data/shamir-input
Bất kỳ file nào được tạo mới trong thư mục này sẽ tự động áp dụng quyền cho các nhóm tương ứng.
3.4. Verify kết quả ACL
Kiểm tra cấu hình ACL hiện tại và thử nghiệm truy cập từ các vai trò khác nhau.
getfacl /data/shamir-input
Output sẽ hiển thị danh sách user::rwx, group::---, mask::rwx và các dòng ACL cụ thể cho group:shamir-admin, group:shamir-operator.
Thử nghiệm quyền truy cập bằng cách chuyển sang user operator và cố gắng ghi vào file.
su - operator -c "touch /data/shamir-input/test-write.txt"
Kết quả mong đợi là lỗi Permission denied vì nhóm shamir-operator chỉ có quyền r-- (Read only). Ngược lại, user admin sẽ thực hiện lệnh touch thành công.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Shamir Secret Sharing và Linux Kernel Modules
« Phần 5: Tích hợp module Shamir vào hệ thống tệp tin phân tán
Phần 7: Đảm bảo độ tin cậy: Khôi phục dữ liệu và xử lý sự cố node »