Giới thiệu về PostgreSQL-SGX (PG-SGX) và cơ chế hoạt động
PG-SGX là một bản phân phối đặc biệt của PostgreSQL được tích hợp với Intel SGX SDK để tạo ra một Enclave bảo mật.
Cơ chế hoạt động: Khi khởi động, PostgreSQL sẽ yêu cầu CPU tạo một vùng bộ nhớ riêng biệt (Enclave) được bảo vệ bằng phần cứng.
Toàn bộ quá trình xử lý query, lưu trữ metadata và thực thi các hàm tính toán nhạy cảm sẽ diễn ra bên trong vùng Enclave này.
Dữ liệu trong Enclave được mã hóa tự động khi đưa ra ngoài bộ nhớ RAM, ngay cả khi root hoặc hypervisor cố gắng truy cập.
PG-SGX sử dụng cơ chế "Trusted Path" để đảm bảo dữ liệu chỉ được trao đổi an toàn giữa ứng dụng và database thông qua các giao thức xác thực.
Verify kiến trúc cơ bản
Trước khi cài đặt, hãy xác nhận rằng các thành phần nền tảng từ Phần 2 và Phần 3 đã sẵn sàng.
Chạy lệnh sau để kiểm tra thư viện SGX runtime:
ls -l /opt/intel/sgxsdk/lib64/libsgx_enclave_common.so
Kết quả mong đợi: Lệnh trả về thông tin file tồn tại, không có lỗi "No such file or directory".
Cài đặt và build PostgreSQL-SGX từ source code
Bước 1: Cài đặt các dependency build cần thiết
PG-SGX cần các công cụ build và thư viện SSL để hoạt động đúng chuẩn.
Cài đặt các gói cần thiết trên Ubuntu/Debian:
sudo apt-get update && sudo apt-get install -y build-essential libreadline-dev zlib1g-dev libssl-dev libxml2-dev libxslt-dev libcurl4-openssl-dev flex bison libkrb5-dev
Kết quả mong đợi: Tất cả các gói được cài đặt thành công, không có cảnh báo về package missing.
Bước 2: Clone và chuẩn bị source code
Tải mã nguồn PG-SGX từ kho lưu trữ chính thức. Phiên bản hiện tại thường tương thích với PostgreSQL 10.x hoặc 11.x.
Thư mục làm việc: /opt/pg-sgx
mkdir -p /opt/pg-sgx && cd /opt/pg-sgx && git clone https://github.com/intel/PostgreSQL-SGX.git
Kết quả mong đợi: Thư mục PostgreSQL-SGX được tạo và chứa toàn bộ source code.
Bước 3: Cấu hình và Compile PostgreSQL-SGX
Chúng ta cần chỉ rõ đường dẫn đến SDK SGX để trình biên dịch biết cách liên kết các thư viện bảo mật.
Thay thế /opt/intel/sgxsdk nếu bạn cài SDK ở vị trí khác trong Phần 3.
cd /opt/pg-sgx/PostgreSQL-SGX && export SGX_SDK=/opt/intel/sgxsdk && ./configure --prefix=/usr/local/pg-sgx --with-openssl --enable-debug --with-included-regex
Kết quả mong đợi: Quá trình configure hoàn tất, xuất ra dòng "configure: error: ... " nếu thiếu thư viện, hoặc "PostgreSQL configuration summary" nếu thành công.
Thực hiện biên dịch (build) với 4 luồng để tăng tốc:
make -j4
Kết quả mong đợi: Không có lỗi compile liên quan đến sgx_enclave_common hoặc sgx_edger8r.
Cài đặt vào hệ thống:
sudo make install
Kết quả mong đợi: Các binary của PostgreSQL-SGX (postgres, initdb, psql) được đặt vào thư mục /usr/local/pg-sgx/bin.
Bước 4: Tạo Enclave Key và thư mục dữ liệu
PG-SGX yêu cầu một khóa bảo mật (Enclave Key) để khởi tạo vùng nhớ an toàn. Khóa này sẽ được lưu trong file enclave.key.
Tạo thư mục dữ liệu và sinh khóa:
sudo mkdir -p /var/lib/pg-sgx/data && sudo chown postgres:postgres /var/lib/pg-sgx/data
su - postgres -c "openssl rand -out /var/lib/pg-sgx/data/enclave.key 32"
Kết quả mong đợi: File enclave.key được tạo với kích thước 32 bytes, quyền sở hữu thuộc user postgres.
Cấu hình file pg.conf để kích hoạt chế độ bảo mật SGX
Bước 5: Khởi tạo Database Cluster (initdb)
Khởi tạo database cluster với đường dẫn đến binary đã build và thư mục dữ liệu.
Chạy lệnh dưới quyền user postgres:
su - postgres -c "/usr/local/pg-sgx/bin/initdb -D /var/lib/pg-sgx/data --pgdata=/var/lib/pg-sgx/data"
Kết quả mong đợi: Xuất hiện dòng "Success! You can now start the database server." và các file cấu hình mặc định được tạo trong thư mục data.
Bước 6: Chỉnh sửa file pg_hba.conf để cho phép kết nối
Để truy cập vào database SGX, bạn cần cấu hình file xác thực. Vì đang chạy local test, ta dùng trust hoặc md5.
Đường dẫn file: /var/lib/pg-sgx/data/pg_hba.conf
Nội dung hoàn chỉnh:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
Kết quả mong đợi: File được ghi lại, không có lỗi cú pháp.
Bước 7: Cấu hình file postgresql.conf cho SGX
Đây là bước quan trọng nhất. Cần bật các tham số đặc thù của PG-SGX để kích hoạt Enclave.
Đường dẫn file: /var/lib/pg-sgx/data/postgresql.conf
Nội dung hoàn chỉnh (bao gồm các tham số SGX đặc thù):
listen_addresses = 'localhost'
port = 5432
max_connections = 100
shared_buffers = 256MB
data_directory = '/var/lib/pg-sgx/data'
hba_file = '/var/lib/pg-sgx/data/pg_hba.conf'
ident_file = '/var/lib/pg-sgx/data/pg_ident.conf'
# SGX Specific Configuration
# Đường dẫn đến file enclave key đã tạo ở bước 4
sgx_enclave_key_file = '/var/lib/pg-sgx/data/enclave.key'
# Kích hoạt chế độ SGX (bắt buộc phải là true)
sgx_enable = on
# Chế độ debug (bật khi phát triển, tắt khi production)
sgx_debug = on
# Log mức độ chi tiết để theo dõi hoạt động Enclave
log_statement = 'all'
log_min_messages = 'notice'
# Giới hạn bộ nhớ cho Enclave (tùy thuộc vào phần cứng, thường 128MB-1GB)
sgx_max_memory = 128MB
Kết quả mong đợi: File được ghi lại, các tham số SGX được nhận diện đúng.
Verify kết quả triển khai
Bước 8: Khởi động PostgreSQL-SGX
Khởi động server dưới quyền user postgres. Hệ thống sẽ tự động tải thư viện SGX và khởi tạo Enclave.
su - postgres -c "/usr/local/pg-sgx/bin/pg_ctl -D /var/lib/pg-sgx/data -l /var/lib/pg-sgx/data/logfile.log start"
Kết quả mong đợi: Xuất hiện dòng "waiting for server to start.... done" và server đã chạy.
Quan sát log file để xác nhận Enclave đã khởi tạo:
grep -i "sgx" /var/lib/pg-sgx/data/logfile.log
Kết quả mong đợi: Có dòng log chứa "SGX enclave initialized" hoặc "Enclave created successfully".
Bước 9: Kiểm tra kết nối và truy vấn
Sử dụng psql để kết nối vào database đã chạy trong Enclave.
su - postgres -c "/usr/local/pg-sgx/bin/psql -U postgres -c 'SELECT version();'"
Kết quả mong đợi: Trả về chuỗi version của PostgreSQL (ví dụ: "PostgreSQL 11.x (SGX) ...").
Thực hiện một query tạo bảng để kiểm tra tính toàn vẹn dữ liệu trong Enclave:
su - postgres -c "/usr/local/pg-sgx/bin/psql -U postgres -c 'CREATE TABLE secure_data (id serial, secret text);'"
su - postgres -c "/usr/local/pg-sgx/bin/psql -U postgres -c "INSERT INTO secure_data (secret) VALUES ('SGX Secret Data');" "
su - postgres -c "/usr/local/pg-sgx/bin/psql -U postgres -c 'SELECT * FROM secure_data;'"
Kết quả mong đợi: Dữ liệu được chèn và lấy ra chính xác. Nếu Enclave hoạt động tốt, quá trình này diễn ra mà không có lỗi Segmentation Fault.
Bước 10: Dừng và kiểm tra trạng thái Enclave
Khi dừng server, Enclave sẽ bị giải phóng và dữ liệu trong bộ nhớ RAM sẽ bị xóa.
su - postgres -c "/usr/local/pg-sgx/bin/pg_ctl -D /var/lib/pg-sgx/data stop"
Kết quả mong đợi: Server dừng hoạt động, không còn tiến trình postgres chạy liên quan đến SGX.
Khởi động lại và kiểm tra xem dữ liệu có còn không (PG-SGX lưu dữ liệu trên disk nhưng mã hóa, nên vẫn khôi phục được):
su - postgres -c "/usr/local/pg-sgx/bin/pg_ctl -D /var/lib/pg-sgx/data start"
su - postgres -c "/usr/local/pg-sgx/bin/psql -U postgres -c 'SELECT * FROM secure_data;'"
Kết quả mong đợi: Dữ liệu "SGX Secret Data" vẫn hiển thị, chứng tỏ cơ chế lưu trữ và khôi phục Enclave hoạt động đúng chuẩn.
Điều hướng series:
Mục lục: Series: Triển khai Database bảo mật với Confidential Computing và Linux SGX
« Phần 3: Cài đặt SDK Intel SGX và các thư viện nền tảng
Phần 5: Triển khai ứng dụng thực tế: Kết nối và truy vấn database bảo mật »