Cài đặt SQLcrypt từ nguồn trên Linux
Chuẩn bị môi trường build và dependencies
Ta cần cài đặt các thư viện nền tảng trước khi biên dịch SQLcrypt. Đây là bước bắt buộc để đảm bảo compiler có thể liên kết với các hàm mã hóa và mạng.
Trên Ubuntu/Debian, ta sử dụng package manager để cài đặt GCC, Make, và các thư viện OpenSSL.
sudo apt-get update && sudo apt-get install -y build-essential cmake libssl-dev libreadline-dev zlib1g-dev pkg-config
Kết quả mong đợi: Hệ thống báo "0 upgraded, X newly installed" và không có lỗi dependency.
Tải và biên dịch mã nguồn SQLcrypt
SQLcrypt thường không có gói binary trong repo mặc định của Linux. Ta phải clone mã nguồn từ repository chính thức và build thủ công để kiểm soát phiên bản.
Đầu tiên, tạo thư mục làm việc và clone repo. Sau đó, tạo thư mục build riêng biệt để giữ vệ sinh source code.
mkdir -p /opt/sqlcrypt && cd /opt/sqlcrypt
git clone https://github.com/sqlcrypt-project/sqlcrypt.git .
mkdir build && cd build
Kết quả mong đợi: Thư mục /opt/sqlcrypt chứa mã nguồn và thư mục build được tạo thành công.
Thực hiện configure để chỉ định đường dẫn cài đặt và bật các tính năng bảo mật.
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sqlcrypt -DENABLE_ENCRYPTION=ON -DENABLE_TLS=ON ..
Kết quả mong đợi: CMake in ra thông báo "Configuring done" và "Generating done" mà không có WARNING về thiếu thư viện.
Biên dịch mã nguồn với 4 luồng (tùy theo CPU của server) để tăng tốc độ build.
make -j4
Kết quả mong đợi: Quá trình biên dịch hoàn tất, xuất hiện dòng "Built target sqlcrypt" hoặc tương tự.
Cài đặt binary vào hệ thống. Cần dùng sudo để ghi vào thư mục hệ thống.
sudo make install
Kết quả mong đợi: Các file binary được copy vào /usr/local/sqlcrypt/bin và thư viện vào /usr/local/sqlcrypt/lib.
Verify cài đặt
Chạy lệnh kiểm tra phiên bản để xác nhận binary đã được cài đặt đúng vị trí và có thể thực thi.
/usr/local/sqlcrypt/bin/sqlcrypt --version
Kết quả mong đợi: In ra phiên bản SQLcrypt (ví dụ: "SQLcrypt v1.2.3") và thông tin build.
Cấu hình file kết nối và quản lý khóa mã hóa (Key Management)
Tạo cấu hình kết nối database (sqlcrypt.conf)
File cấu hình này định nghĩa cách SQLcrypt kết nối đến backend database (MySQL/PostgreSQL) và cấu hình các tham số mã hóa.
Đạo tạo thư mục config và file cấu hình với quyền truy cập hạn chế (600) để đảm bảo an toàn.
sudo mkdir -p /etc/sqlcrypt
sudo tee /etc/sqlcrypt/sqlcrypt.conf > /dev/null
Kết quả mong đợi: File được tạo, quyền sở hữu thuộc root, mode 600 (chỉ owner đọc/ghi).
Quản lý khóa mã hóa (Key Management)
Bảo mật Zero-Knowledge phụ thuộc hoàn toàn vào việc lưu trữ Master Key. Không được lưu key trong file config text.
Tạo thư mục chứa khóa với quyền riêng tư cao nhất. Sử dụng lệnh dd hoặc openssl để tạo key ngẫu nhiên 32 byte (256-bit).
sudo mkdir -p /etc/sqlcrypt/keys
sudo chmod 700 /etc/sqlcrypt/keys
openssl rand -base64 32 > /etc/sqlcrypt/keys/master.key
sudo chmod 600 /etc/sqlcrypt/keys/master.key
sudo chown root:root /etc/sqlcrypt/keys/master.key
Kết quả mong đợi: File master.key được tạo chứa chuỗi base64 ngẫu nhiên, quyền 600.
Lưu ý: Trong môi trường production, ta sẽ sử dụng Hashicorp Vault hoặc HSM để lưu key này thay vì file local, nhưng cấu hình trên là bước đầu tiên để verify.
Verify cấu hình và khóa
Chạy lệnh test connection của SQLcrypt để đảm bảo nó đọc đúng config và có thể decrypt key (nếu có cơ chế wrap key) hoặc kết nối backend.
/usr/local/sqlcrypt/bin/sqlcrypt --config /etc/sqlcrypt/sqlcrypt.conf --test-connection
Kết quả mong đợi: Thông báo "Connection successful" và "Key loaded successfully". Nếu lỗi, kiểm tra lại quyền truy cập file key.
Thiết lập cơ chế xác thực người dùng và phân quyền truy cập
Khởi tạo schema và người dùng admin
Sau khi cài đặt, ta cần khởi tạo database backend với các bảng metadata của SQLcrypt và tạo người dùng quản trị.
Chạy script khởi tạo schema được cung cấp trong gói cài đặt. Script này tạo bảng users, keys, và access_logs.
cd /opt/sqlcrypt
sudo /usr/local/sqlcrypt/bin/sqlcrypt --init-schema --config /etc/sqlcrypt/sqlcrypt.conf
Kết quả mong đợi: Thông báo "Schema initialized successfully" và các bảng được tạo trong database backend.
Định nghĩa Policy phân quyền (RBAC)
SQLcrypt sử dụng cơ chế Role-Based Access Control (RBAC) để xác định ai được decrypt trường nào. Ta cần tạo file policy định nghĩa các role.
Tạo file policy.json định nghĩa role 'analyst' chỉ được phép decrypt các trường không nhạy cảm (PII masked), và role 'admin' được decrypt toàn bộ.
sudo tee /etc/sqlcrypt/policy.json > /dev/null
Kết quả mong đợi: File policy.json được tạo với cấu trúc JSON hợp lệ.
Tạo người dùng và gán Role
Sử dụng CLI để tạo người dùng mới và gán role đã định nghĩa. Mật khẩu người dùng sẽ được hash và lưu trong database.
Tạo user 'data_analyst' với role 'analyst' và user 'db_admin' với role 'admin'. Thay thế 'secure_password' bằng mật khẩu thật.
/usr/local/sqlcrypt/bin/sqlcrypt --config /etc/sqlcrypt/sqlcrypt.conf --add-user data_analyst --role analyst --password 'secure_password'
/usr/local/sqlcrypt/bin/sqlcrypt --config /etc/sqlcrypt/sqlcrypt.conf --add-user db_admin --role admin --password 'super_secure_admin_pass'
Kết quả mong đợi: Thông báo "User data_analyst created with role analyst" và "User db_admin created with role admin".
Verify phân quyền
Thử kết nối với tư cách user 'data_analyst' và truy vấn bảng nhạy cảm để kiểm tra cơ chế masking (che giấu) có hoạt động không.
/usr/local/sqlcrypt/bin/sqlcrypt --config /etc/sqlcrypt/sqlcrypt.conf --user data_analyst --password 'secure_password' --query "SELECT customer_id, ssn FROM customers LIMIT 1"
Kết quả mong đợi: Cột 'customer_id' hiển thị giá trị thật, cột 'ssn' hiển thị giá trị bị mask (ví dụ: "XXX-XX-1234") hoặc thông báo lỗi quyền truy cập tùy theo policy.
Thử với user 'db_admin' để xác nhận quyền decrypt toàn bộ.
/usr/local/sqlcrypt/bin/sqlcrypt --config /etc/sqlcrypt/sqlcrypt.conf --user db_admin --password 'super_secure_admin_pass' --query "SELECT customer_id, ssn FROM customers LIMIT 1"
Kết quả mong đợi: Cả hai cột 'customer_id' và 'ssn' đều hiển thị giá trị thật (đã được decrypt).
Điều hướng series:
Mục lục: Series: Triển khai Zero-Knowledge Database với SQLcrypt và Linux Kernel
« Phần 2: Cấu hình Linux Kernel hỗ trợ mã hóa trong bộ nhớ
Phần 4: Tích hợp Zero-Knowledge Proof vào cơ sở dữ liệu SQL »