Kiến trúc Sharded Database và vai trò của Secret Sharing
Chúng ta sẽ xây dựng một cụm Sharded Database (Cơ sở dữ liệu phân mảnh) nơi dữ liệu được chia nhỏ và lưu trữ trên nhiều node khác nhau để tăng khả năng mở rộng và hiệu năng.
Vai trò của Secret Sharing (cụ thể là Shamir's Secret Sharing) trong kiến trúc này là phân mảnh khóa mã hóa (Encryption Key) thành nhiều phần (shares). Chỉ khi tập hợp đủ số lượng phần quy định (threshold) thì mới khôi phục được khóa gốc để giải mã dữ liệu TDE (Transparent Data Encryption).
Điều này đảm bảo rằng ngay cả khi một node bị xâm nhập hoặc mất dữ liệu, kẻ tấn công vẫn không thể khôi phục được toàn bộ dữ liệu vì chúng không có đủ các phần của khóa.
Yêu cầu phần cứng tối thiểu cho mỗi Node
Mỗi node trong cụm phân tán cần đáp ứng các thông số tối thiểu sau để đảm bảo hiệu năng ổn định khi thực hiện các phép tính mã hóa và phân mảnh dữ liệu.
CPU: Tối thiểu 4 Cores (x86_64 hoặc ARM64). Ưu tiên các dòng có hỗ trợ tập lệnh AES-NI để tăng tốc độ mã hóa phần cứng.
RAM: Tối thiểu 8GB. Cần thiết để lưu cache của Database và bộ nhớ đệm cho các thư viện mã hóa.
Disk I/O: SSD NVMe là bắt buộc. Tốc độ IOPS tối thiểu 5000. Cần phân vùng riêng cho dữ liệu (Data) và Log để tránh xung đột I/O.
Để kiểm tra cấu hình phần cứng hiện tại, chạy lệnh sau trên tất cả các node dự định triển khai:
lscpu | grep "Model name" && free -h && lsscsi -g && iostat -x 1 5
Kết quả mong đợi: Thấy thông tin CPU rõ ràng, RAM trống ít nhất 4GB, và thiết bị lưu trữ là SSD NVMe (thường là nvme0n1). IOPS phải ổn định không bị nghẽn cổ chai.
Lựa chọn hệ điều hành và phiên bản Kernel
Để thực hiện Hardening Linux Kernel hiệu quả, chúng ta cần một hệ điều hành có vòng đời hỗ trợ dài (LTS) và kernel mới nhất đủ để hỗ trợ các tính năng bảo mật như seccomp, namespaces và các tham số hardening tiên tiến.
Chúng ta chọn Ubuntu Server 22.04 LTS (Jammy Jellyfish) hoặc Rocky Linux 9. Phiên bản Kernel tối thiểu yêu cầu là 5.15 trở lên để đảm bảo các tính năng hardening được hỗ trợ đầy đủ.
Trước khi cài đặt, hãy kiểm tra phiên bản kernel hiện tại của server:
uname -r
Kết quả mong đợi: Phiên bản trả về phải lớn hơn hoặc bằng 5.15.0. Nếu thấp hơn, cần nâng cấp kernel hoặc cài đặt lại OS.
Để kiểm tra thông tin chi tiết về phân phối Linux và kernel:
cat /etc/os-release && cat /proc/version
Kết quả mong đợi: Thấy dòng "VERSION_ID" hoặc "VERSION" của Ubuntu 22.04 hoặc Rocky Linux 9, cùng với thông tin kernel config.
Chuẩn bị môi trường mạng: IP tĩnh và DNS nội bộ
Trong môi trường phân tán, việc sử dụng IP động (DHCP) là cấm kỵ vì các node cần biết địa chỉ cố định của nhau để duy trì kết nối sharding và trao đổi secret shares.
Chúng ta sẽ cấu hình IP tĩnh thông qua Netplan (trên Ubuntu) hoặc NetworkManager (trên Rocky/CentOS). Ở đây tôi hướng dẫn cho Ubuntu 22.04 sử dụng Netplan.
Tạo file cấu hình mạng tại /etc/netplan/01-netcfg.yaml với nội dung như sau (thay thế 192.168.1.10/24 và 192.168.1.1 theo mạng thật của bạn):
cat > /etc/netplan/01-netcfg.yaml
Sau đó áp dụng cấu hình:
netplan apply
Kết quả mong đợi: Không có lỗi báo cáo, mạng được cấu hình lại và IP của interface eth0 trở thành 192.168.1.10.
Cấu hình DNS nội bộ và Firewall cơ bản
Để các node gọi nhau bằng tên (ví dụ: db-node-01, db-node-02) thay vì IP, chúng ta cần cập nhật file /etc/hosts trên tất cả các node trong cụm.
Sửa file /etc/hosts trên mỗi node để ánh xạ tên host tương ứng với IP tĩnh của nhau:
cat >> /etc/hosts
Để đảm bảo an ninh mạng cơ bản, chúng ta sử dụng UFW (Uncomplicated Firewall) để chỉ cho phép traffic cần thiết (SSH, Database port, và kết nối nội bộ).
Áp dụng các quy tắc firewall sau:
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow from 192.168.1.0/24 to any port 5432 comment 'PostgreSQL internal'
ufw allow from 192.168.1.0/24 to any port 27017 comment 'MongoDB internal'
ufw --force enable
Kết quả mong đợi: Firewall được bật, chỉ cho phép SSH từ mọi nơi (nên hạn chế sau này) và cho phép truy cập Database port từ mạng nội bộ 192.168.1.0/24.
Verify kết quả mạng:
ping -c 3 db-node-02 && ufw status verbose
Kết quả mong đợi: Ping thành công đến node khác bằng tên host, và ufw status hiện thị các rule đã cấu hình.
Kiểm tra và cài đặt công cụ cần thiết
Để tự động hóa việc triển khai (Ansible), chạy container (Docker) và xử lý mã hóa (OpenSSL, GPG), chúng ta cần cài đặt các công cụ này ngay từ đầu.
Cài đặt Docker Engine
Docker sẽ được dùng để chạy các container chứa Database hoặc các service hỗ trợ Secret Sharing.
apt update
apt install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kiểm tra Docker đã chạy chưa:
docker run hello-world
Kết quả mong đợi: Docker pull image và chạy container thành công, in ra thông báo "Hello from Docker!".
Cài đặt Ansible và các thư viện mã hóa
Ansible sẽ là công cụ chính để đẩy cấu hình hardening và cài đặt database lên các node. Các thư viện mã hóa cần thiết bao gồm OpenSSL, GnuPG, và Python cryptography.
apt install -y software-properties-common
add-apt-repository --yes --update ppa:ansible/ansible
apt install -y ansible
apt install -y openssl gnupg2 python3-cryptography python3-pip
Để đảm bảo Python có thể tương tác với các module mã hóa nâng cao, cập nhật pip và cài đặt thêm thư viện `pycryptodome`:
pip3 install --upgrade pip
pip3 install pycryptodome
Kiểm tra phiên bản các công cụ:
ansible --version && openssl version && gpg --version && python3 -c "import Crypto; print('Crypto library installed')"
Kết quả mong đợi: Ansible trả về phiên bản (ví dụ 2.14+), OpenSSL và GPG trả về phiên bản mới nhất, và Python in ra "Crypto library installed" không lỗi.
Verify toàn bộ môi trường trước khi bắt đầu Phần 2
Trước khi chuyển sang phần Hardening Kernel, hãy chạy script kiểm tra tổng hợp để đảm bảo mọi thứ đã sẵn sàng.
echo "=== Hardware Check ===" && lscpu | grep Model && free -h | grep Mem
echo "=== OS & Kernel Check ===" && cat /etc/os-release | grep PRETTY_NAME && uname -r
echo "=== Network Check ===" && ip addr show eth0 | grep inet && ping -c 2 db-node-02
echo "=== Tools Check ===" && docker --version && ansible --version && openssl version
Kết quả mong đợi: Tất cả các dòng lệnh trên chạy thành công, không có lỗi, và trả về thông tin chính xác theo yêu cầu phần cứng, OS, mạng và công cụ đã định nghĩa ở trên.
Đ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 2: Cài đặt và cấu hình nền tảng Linux cho các node Database »