Cấu hình kết nối từ ứng dụng bên ngoài vào Enclave
Bước đầu tiên là thiết lập cầu nối giao tiếp giữa ứng dụng chạy ở không gian người dùng (User Space) và cơ sở dữ liệu đang chạy bên trong Enclave SGX. Chúng ta sẽ cấu hình file `odbc.ini` để định nghĩa DSN (Data Source Name) trỏ đến socket hoặc port đặc biệt mà Enclave PostgreSQL đang lắng nghe.
Mục đích là để ứng dụng có thể gửi yêu cầu SQL qua cổng mạng an toàn, nơi dữ liệu sẽ được mã hóa khi đi qua mạng và chỉ được giải mã bên trong Enclave.
Đầu tiên, tạo file cấu hình ODBC toàn cục tại `/etc/odbc.ini` với nội dung sau. Lưu ý địa chỉ IP `127.0.0.1` và port `5433` (giả định Enclave đã chạy trên port này trong Phần 4).
cat > /etc/odbc.ini
Sau khi chạy lệnh, file `/etc/odbc.ini` sẽ được tạo. Bạn cần kiểm tra lại nội dung file để đảm bảo không có lỗi định dạng. Kết quả mong đợi là file tồn tại và hiển thị đúng các tham số đã cấu hình.
Để hệ thống nhận diện driver PostgreSQL, bạn cần đảm bảo thư viện `odbcinst.ini` đã trỏ đúng đường dẫn đến `psqlodbcw.so` (hoặc `psqlodbc.so` tùy phiên bản 32/64 bit). Trong môi trường Linux tiêu chuẩn với Postgres ODBC driver, file này thường nằm tại `/etc/odbcinst.ini`.
cat > /etc/odbcinst.ini
Lệnh này tạo file định nghĩa driver. Kết quả mong đợi là hệ thống ODBC đã biết vị trí của thư viện driver PostgreSQL. Bạn có thể kiểm tra bằng lệnh `odbcinst -q -d` để liệt kê các driver đã cài đặt.
Triển khai ứng dụng mẫu sử dụng driver ODBC/ODBC-SGX
Bây giờ chúng ta sẽ xây dựng một ứng dụng C đơn giản để kết nối vào database bảo mật. Ứng dụng này sẽ sử dụng thư viện ODBC chuẩn nhưng được liên kết với các hàm đặc biệt của SGX để đảm bảo tính toàn vẹn của kết nối.
Mục đích là minh họa luồng kết nối: Ứng dụng -> ODBC Driver -> SGX Runtime -> Enclave. Dữ liệu truy vấn sẽ được mã hóa khi rời khỏi ứng dụng.
Tạo file mã nguồn `app_connect.c` tại thư mục làm việc của bạn. Mã này thực hiện kết nối, thực thi một truy vấn chọn đơn giản và đóng kết nối.
cat > app_connect.c
File `app_connect.c` đã được tạo. Mã này sử dụng API ODBC chuẩn. Khi biên dịch, bạn cần liên kết với thư viện `libodbc.so` và đảm bảo môi trường biến `LD_LIBRARY_PATH` bao gồm đường dẫn đến thư viện driver PostgreSQL.
Biên dịch ứng dụng với trình biên dịch GCC, liên kết thư viện ODBC. Trong môi trường SGX, bạn cần đảm bảo ứng dụng này chạy ở không gian user (Untrusted) để truy cập vào Enclave.
gcc -o sgx_app app_connect.c -lodbc -lodbcinst -lpsqlodbc -I/usr/include/postgresql/14/server 2>&1
Lệnh biên dịch sẽ tạo ra file thực thi `sgx_app`. Kết quả mong đợi là không có lỗi liên kết (linker errors) và file binary được tạo thành công. Nếu thiếu header hoặc library, bạn cần cài đặt package `unixodbc-dev` và `postgresql-odbc`.
Thực thi các truy vấn SQL và xác minh dữ liệu được bảo vệ
Chúng ta sẽ chạy ứng dụng đã biên dịch để thực hiện truy vấn. Đây là bước kiểm chứng cuối cùng để đảm bảo dữ liệu thực sự được xử lý bên trong Enclave và không bị lộ ra bộ nhớ RAM thông thường.
Mục đích là xác minh tính bảo mật: dữ liệu chỉ tồn tại ở dạng mã hóa trong RAM của host và chỉ được giải mã khi nằm bên trong vùng SGX.
Trước khi chạy, bạn cần đảm bảo dịch vụ PostgreSQL trong Enclave (đã cấu hình ở Phần 4) đang chạy và lắng nghe trên port 5433. Sau đó, chạy ứng dụng mẫu.
./sgx_app
Kết quả mong đợi là xuất hiện thông báo "Successfully connected to SGX PostgreSQL Enclave" và hiển thị phiên bản PostgreSQL. Nếu kết nối thất bại, hãy kiểm tra lại firewall hoặc cấu hình `odbc.ini`.
Để xác minh dữ liệu được bảo vệ trong bộ nhớ, chúng ta sẽ sử dụng công cụ `sgx_dump` hoặc phân tích qua `dmesg` để kiểm tra trạng thái của Enclave. Một cách đơn giản hơn trong môi trường Linux là kiểm tra xem liệu dữ liệu nhạy cảm có xuất hiện trong dump file bộ nhớ của tiến trình không.
Tạo một bảng chứa dữ liệu nhạy cảm (ví dụ: mật khẩu) và thực hiện truy vấn để lấy dữ liệu đó, sau đó kiểm tra xem liệu dữ liệu thô có thể đọc được từ bộ nhớ của tiến trình ứng dụng hay không.
psql -h 127.0.0.1 -p 5433 -U sgx_admin -d secure_db -c "CREATE TABLE secret_data (id int, secret text); INSERT INTO secret_data VALUES (1, 'SGX_PROTECTED_SECRET_KEY_12345'); SELECT * FROM secret_data;"
Lệnh này chèn một chuỗi bí mật vào database. Kết quả mong đợi là dữ liệu được chèn thành công và truy vấn trả về kết quả. Tuy nhiên, dữ liệu này khi lưu trữ trên disk (nếu có journaling) hoặc khi truyền qua mạng đều đã được mã hóa, và khi nằm trong RAM của Enclave thì chỉ Enclave mới đọc được.
Để chứng minh tính bảo mật, hãy cố gắng dump bộ nhớ của tiến trình `sgx_app` ngay sau khi nó thực thi truy vấn, và tìm kiếm chuỗi "SGX_PROTECTED_SECRET_KEY_12345" trong file dump. Trong môi trường SGX hoạt động đúng, chuỗi này sẽ KHÔNG xuất hiện dưới dạng văn bản thuần túy (plaintext) trong bộ nhớ của tiến trình ứng dụng (User Space).
gcore -o /tmp/app_dump.core $(pgrep sgx_app) 2>/dev/null; strings /tmp/app_dump.core | grep "SGX_PROTECTED_SECRET_KEY"
Lệnh này tạo file dump bộ nhớ và tìm kiếm chuỗi. Kết quả mong đợi là lệnh `grep` trả về kết quả rỗng (không tìm thấy gì). Nếu tìm thấy chuỗi, có nghĩa là dữ liệu đã bị rò rỉ ra User Space và cấu hình Enclave chưa đạt yêu cầu bảo mật tuyệt đối.
Để xác nhận trạng thái Enclave đang hoạt động an toàn, bạn có thể kiểm tra file log của SGX Driver hoặc kiểm tra qua file `/proc/` của tiến trình Enclave (thường là tiến trình PostgreSQL chạy trong Enclave).
cat /sys/class/misc/sgx_enclaves/* 2>/dev/null || ls -l /proc/ | grep postgres
Kết quả mong đợi là bạn thấy các mục liên quan đến Enclave hoặc tiến trình PostgreSQL đang chạy với quyền hạn đặc biệt. Điều này xác nhận dữ liệu đang được xử lý trong vùng cách ly của CPU.
Để kết thúc kiểm tra, xóa dữ liệu nhạy cảm khỏi database để đảm bảo không để lại dấu vết.
psql -h 127.0.0.1 -p 5433 -U sgx_admin -d secure_db -c "DROP TABLE secret_data;"
Lệnh xóa bảng sẽ được thực thi. Kết quả mong đợi là bảng bị xóa thành công. Dữ liệu đã được mã hóa và xóa khỏi vùng nhớ Enclave, đảm bảo tính bảo mật trọn vẹn từ lúc tạo đến lúc xóa.
Đ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 4: Cấu hình database PostgreSQL chạy trên Enclave SGX
Phần 6: Quản lý chứng chỉ, xác thực và triển khai trên đám mây »