Tạo chứng chỉ TLS CA và Node Certificate bằng CockroachDB
Chuẩn bị thư mục và cấu hình CA
Để bắt đầu, ta cần tạo một thư mục chuyên biệt để chứa các chứng chỉ (certificates) và khóa riêng tư (private keys). Việc tách biệt thư mục này giúp quản lý quyền truy cập (file permissions) dễ dàng hơn và đảm bảo an toàn cho dữ liệu nhạy cảm.
Thư mục này sẽ lưu trữ Root CA, Intermediate CA (nếu có), và các certificate của từng node. CockroachDB yêu cầu quyền truy cập vào thư mục này phải thuộc về user chạy service (thường là cockroach).
sudo mkdir -p /var/lib/cockroachdb/certs
sudo chown -R cockroach:cockroach /var/lib/cockroachdb/certs
sudo chmod 700 /var/lib/cockroachdb/certs
Kết quả mong đợi: Thư mục được tạo, quyền sở hữu thuộc về user cockroach, và chỉ có chủ sở hữu mới có quyền đọc/ghi (700).
Khởi tạo Root CA và tạo chứng chỉ Node
CockroachDB có công cụ tích hợp cockroach cert để quản lý vòng đời chứng chỉ. Ta sẽ thực hiện hai bước: tạo Certificate Authority (CA) để ký các chứng chỉ khác, sau đó dùng CA này để ký chứng chỉ cho node hiện tại.
Tham số --ca-key và --ca-cert chỉ định vị trí lưu file CA. Tham số --lifetime (tính bằng ngày) xác định thời hạn của chứng chỉ. Ở đây ta dùng 365 ngày cho mục đích demo, nhưng trong production nên cân nhắc xoay vòng (rotation) thường xuyên hơn.
sudo -u cockroach cockroach cert create-ca \
--certs-dir=/var/lib/cockroachdb/certs \
--ca-key=/var/lib/cockroachdb/certs/ca.key \
--ca-cert=/var/lib/cockroachdb/certs/ca.crt
Kết quả mong đợi: Xuất hiện thông báo CA certificate created và hai file ca.key, ca.crt xuất hiện trong thư mục certs.
Sau khi có CA, ta tạo chứng chỉ cho node (node certificate) và client (client certificate). Đối với node, ta cần chỉ định hostname hoặc IP mà node này sẽ lắng nghe (listen address). CockroachDB sẽ tự động sinh khóa riêng tư cho node.
sudo -u cockroach cockroach cert create-node \
--certs-dir=/var/lib/cockroachdb/certs \
--ca-key=/var/lib/cockroachdb/certs/ca.key \
--ca-cert=/var/lib/cockroachdb/certs/ca.crt \
--nodes=192.168.1.10,localhost,db-node-1
Kết quả mong đợi: Xuất hiện thông báo Node certificate created. Trong thư mục certs sẽ có thêm file node.crt và node.key.
Verify chứng chỉ đã tạo
Để xác minh tính toàn vẹn, ta dùng lệnh openssl để kiểm tra nội dung certificate. Cần đảm bảo Common Name (CN) trong certificate khớp với các hostname/IP đã khai báo ở bước trước.
openssl x509 -in /var/lib/cockroachdb/certs/node.crt -text -noout | grep -A 1 "Subject:"
Kết quả mong đợi: Dòng Subject hiển thị CN = 192.168.1.10, CN = localhost, CN = db-node-1 (hoặc danh sách tương ứng). Nếu thiếu hostname nào, kết nối sẽ bị từ chối.
Cấu hình rotation tự động cho chứng chỉ
Hiểu về cơ chế tự động xoay vòng (Auto-rotation)
Trong môi trường production, việc quản lý thủ công chứng chỉ là bất khả thi. CockroachDB hỗ trợ tính năng automatic certificate rotation. Khi bật tính năng này, cluster sẽ tự động tạo chứng chỉ mới trước khi chứng chỉ cũ hết hạn và cập nhật cho tất cả các node.
Điều kiện bắt buộc để kích hoạt tính năng này là cluster đã chạy với chế độ bảo mật (secure mode) và có quyền truy cập vào thư mục --certs-dir.
Kích hoạt rotation qua SQL
Trước tiên, ta cần kết nối vào cluster bằng chứng chỉ đã tạo ở phần trên để thực thi lệnh SQL cấu hình. Ta sẽ sử dụng cockroach sql với tham số --certs-dir.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"SET CLUSTER SETTING cluster.preserve_downgrade_option = '23.1';"
Kết quả mong đợi: Lệnh chạy thành công, không có lỗi. Đây là bước chuẩn bị để đảm bảo tính tương thích khi nâng cấp cấu hình rotation.
Để kích hoạt tự động xoay vòng, ta cần thiết lập tham số cluster.preserve_downgrade_option hoặc sử dụng lệnh ALTER SYSTEM (tùy phiên bản). Tuy nhiên, cách phổ biến và an toàn nhất là cấu hình tham số --certs-dir khi khởi động service và đảm bảo CockroachDB có quyền ghi vào thư mục này.
Tuy nhiên, để chủ động kiểm soát thời điểm xoay vòng, ta có thể dùng lệnh ALTER SYSTEM để kích hoạt tính năng tự động tạo chứng chỉ mới. Dưới đây là lệnh kích hoạt rotation với chu kỳ mặc định (thường là 24h trước khi hết hạn).
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"SET CLUSTER SETTING cluster.preserve_downgrade_option = '23.1';"
Kết quả mong đợi: Cluster chấp nhận thay đổi cấu hình. CockroachDB sẽ tự động quản lý vòng đời chứng chỉ dựa trên ngày hết hạn (expiry date) được lưu trong metadata.
Verify trạng thái rotation
Để kiểm tra xem rotation đã được kích hoạt và chứng chỉ mới đã được tạo chưa, ta truy vấn bảng system.certificates (hoặc crdb_internal.cluster_settings tùy phiên bản). Ta sẽ kiểm tra thời gian hết hạn của chứng chỉ hiện tại.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"SELECT name, type, expiry_time FROM system.certificates WHERE name LIKE '%node%';"
Kết quả mong đợi: Bảng hiển thị danh sách chứng chỉ với cột expiry_time trong tương lai. Nếu rotation đã chạy, bạn sẽ thấy các chứng chỉ mới có thời gian hết hạn xa hơn so với chứng chỉ ban đầu.
Thiết lập chính sách quyền truy cập (RBAC) chi tiết
Tạo user và phân quyền cơ bản
CockroachDB sử dụng mô hình RBAC (Role-Based Access Control) mạnh mẽ. Thay vì dùng user root cho mọi thứ, ta cần tạo user riêng cho ứng dụng (application user) và chỉ cấp quyền cần thiết.
Quy tắc an toàn: Chỉ cấp quyền SELECT cho ứng dụng đọc dữ liệu, INSERT, UPDATE, DELETE cho ứng dụng ghi, và tuyệt đối tránh cấp GRANT OPTION hoặc ADMIN cho user ứng dụng.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"CREATE USER app_user WITH PASSWORD 'secure_random_password_123';"
Kết quả mong đợi: User app_user được tạo thành công. Lệnh không trả về dữ liệu, chỉ thông báo CREATE USER.
Cấp quyền chi tiết cho Database và Table
Giả sử ta có database tên ecommerce. Ta cần cấp quyền truy cập cụ thể vào các bảng nhất định. Ta sẽ cấp quyền SELECT cho bảng products và quyền ALL cho bảng orders (vì ứng dụng cần ghi đơn hàng).
Tham số GRANT cho phép gán quyền cho user hoặc role. Ta có thể cấp quyền ở mức database, schema, hoặc table.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"GRANT SELECT ON TABLE ecommerce.products TO app_user;
GRANT ALL ON TABLE ecommerce.orders TO app_user;
GRANT USAGE ON SCHEMA ecommerce TO app_user;"
Kết quả mong đợi: Các lệnh GRANT chạy thành công. User app_user giờ có thể truy cập các bảng đã chỉ định nhưng không thể truy cập các bảng khác trong schema.
Verify quyền truy cập
Để đảm bảo chính sách RBAC hoạt động đúng, ta cần thử kết nối bằng user app_user và thực thi lệnh SHOW GRANTS. Ngoài ra, ta sẽ thử truy cập một bảng không được cấp quyền để xác nhận nó bị từ chối.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=app_user --password -e \
"SHOW GRANTS ON TABLE ecommerce.products;
SHOW GRANTS ON TABLE ecommerce.orders;"
Kết quả mong đợi: Xuất hiện bảng danh sách quyền (GRANT) cho từng bảng. Nếu thử truy cập bảng khác (ví dụ: SELECT * FROM ecommerce.users), hệ thống sẽ báo lỗi permission denied.
Cấu hình kết nối an toàn từ ứng dụng client
Chuẩn bị chứng chỉ Client cho ứng dụng
Để ứng dụng client kết nối an toàn vào cluster, nó cần một client certificate được ký bởi cùng một CA mà cluster đang sử dụng. Điều này đảm bảo xác thực hai chiều (mutual TLS): Server xác thực Client và Client xác thực Server.
Ta sẽ tạo một cặp chứng chỉ client riêng cho ứng dụng (ví dụ: app_user). Chứng chỉ này sẽ được dùng trong connection string của ứng dụng.
sudo -u cockroach cockroach cert create-client \
--certs-dir=/var/lib/cockroachdb/certs \
--ca-key=/var/lib/cockroachdb/certs/ca.key \
--ca-cert=/var/lib/cockroachdb/certs/ca.crt \
--users=app_user
Kết quả mong đợi: Xuất hiện thông báo Client certificate created. Trong thư mục certs sẽ có thêm file client.app_user.crt và client.app_user.key.
Cấu hình Connection String cho ứng dụng
Khi kết nối từ ứng dụng (Java, Go, Python, NodeJS...), ta phải chỉ định đường dẫn đến CA certificate và Client certificate. Đây là điểm quan trọng nhất để bảo vệ kết nối khỏi các cuộc tấn công Man-in-the-Middle.
Dưới đây là ví dụ về connection string cho CockroachDB (dạng URL). Lưu ý tham số sslmode=verify-full (hoặc require tùy driver) để đảm bảo xác thực hostname của server.
cockroach sql \
--certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 \
--port=26257 \
--user=app_user \
--database=ecommerce \
--sslmode=verify-full \
-e "SELECT 1;"
Kết quả mong đợi: Kết nối thành công, trả về kết quả 1. Nếu thiếu file CA hoặc hostname không khớp, kết nối sẽ bị từ chối ngay lập tức.
Verify kết nối an toàn
Để kiểm tra tính an toàn, ta có thể dùng công cụ openssl s_client để bắt tay (handshake) với CockroachDB và xem thông tin certificate được trao đổi. Điều này xác nhận server đang gửi đúng chứng chỉ của nó.
openssl s_client -connect 192.168.1.10:26257 \
-CAfile /var/lib/cockroachdb/certs/ca.crt \
-cert /var/lib/cockroachdb/certs/client.app_user.crt \
-key /var/lib/cockroachdb/certs/client.app_user.key \
-starttls cockroach
Kết quả mong đợi: Xuất hiện dòng Verify return code: 0 (ok) và hiển thị Certificate chain bắt đầu từ chứng chỉ node của CockroachDB và kết thúc bằng Root CA. Nếu thấy verify error, kết nối không an toàn.
Kiểm tra và xác minh tính toàn vẹn của chứng chỉ
Quét lỗi cấu hình chứng chỉ
Trước khi đưa vào production, cần chạy các lệnh kiểm tra để đảm bảo không có chứng chỉ nào sắp hết hạn hoặc bị cấu hình sai. CockroachDB cung cấp các câu lệnh SQL để kiểm tra trạng thái chứng chỉ trong hệ thống.
Tham số crdb_internal.cluster_settings cho phép xem các cài đặt liên quan đến chứng chỉ. Ta cũng cần kiểm tra thời gian hết hạn của tất cả chứng chỉ đang hoạt động.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"SELECT name, type, expiry_time, created_time FROM system.certificates ORDER BY expiry_time ASC;"
Kết quả mong đợi: Danh sách tất cả chứng chỉ (CA, Node, Client) với thời gian hết hạn sắp xếp từ sớm đến muộn. Nếu có chứng chỉ nào hết hạn trong vòng 7 ngày, cần có cảnh báo.
Đảm bảo tính nhất quán của CA
Một lỗi phổ biến là các node trong cluster sử dụng CA khác nhau. Để khắc phục, ta cần đảm bảo file ca.crt giống hệt nhau trên tất cả các node. Ta sẽ so sánh hash của file CA trên các node.
md5sum /var/lib/cockroachdb/certs/ca.crt
Kết quả mong đợi: Hash MD5 của file CA. Bạn cần chạy lệnh này trên tất cả các node (node-1, node-2, node-3) và so sánh kết quả. Tất cả các giá trị hash phải giống hệt nhau. Nếu khác, cluster sẽ bị chia tách hoặc không thể giao tiếp.
Test lại toàn bộ luồng bảo mật
Bước cuối cùng là thực hiện một kịch bản test end-to-end: Tạo user mới, cấp quyền, tạo chứng chỉ client mới, và kết nối từ xa. Nếu mọi bước đều thành công mà không cần can thiệp thủ công vào firewall hay file config, hệ thống đã đạt chuẩn bảo mật.
cockroach sql --certs-dir=/var/lib/cockroachdb/certs \
--host=192.168.1.10 --user=root -e \
"CREATE DATABASE test_security;
CREATE USER test_user WITH PASSWORD 'test_pass';
GRANT ALL ON DATABASE test_security TO test_user;
DROP DATABASE test_security;
DROP USER test_user;"
Kết quả mong đợi: Tất cả các lệnh chạy thành công, không có lỗi về quyền (permission denied) hoặc chứng chỉ (certificate invalid). Database và user được tạo và xóa đúng theo ý muốn.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán an toàn với CockroachDB và Ubuntu 24.04
« Phần 2: Cài đặt CockroachDB và cấu hình bảo mật cơ bản
Phần 4: Quản lý dữ liệu và tối ưu hóa hiệu năng »