Cấu hình Authentication và TLS cho Trino và Iceberg REST Catalog
Bước đầu tiên là thiết lập xác thực (Authentication) dựa trên chứng chỉ mTLS (Mutual TLS) giữa Trino và Iceberg REST Catalog, đồng thời kích hoạt mã hóa TLS cho kết nối giữa Client và Server.
Chuẩn bị chứng chỉ số (Certificates)
Tạo thư mục chứa chứng chỉ cho cả Trino và Iceberg REST Catalog trên server Kubernetes hoặc local machine để sinh chứng chỉ tự ký (self-signed) phục vụ môi trường phát triển hoặc demo.
Thư mục mục tiêu: /etc/pki/trino và /etc/pki/iceberg
Thực thi lệnh tạo chứng chỉ CA (Certificate Authority) và chứng chỉ cho từng thành phần:
mkdir -p /etc/pki/trino /etc/pki/iceberg
# Tạo CA Root
openssl genrsa -out /etc/pki/ca.key 4096
openssl req -x509 -new -nodes -key /etc/pki/ca.key -sha256 -days 1024 -out /etc/pki/ca.crt -subj "/CN=DataFabricCA"
# Tạo chứng chỉ cho Trino Server
openssl genrsa -out /etc/pki/trino/trino.key 2048
openssl req -new -key /etc/pki/trino/trino.key -out /etc/pki/trino/trino.csr -subj "/CN=trino-server"
openssl x509 -req -in /etc/pki/trino/trino.csr -CA /etc/pki/ca.crt -CAkey /etc/pki/ca.key -CAcreateserial -out /etc/pki/trino/trino.crt -days 500 -sha256
# Tạo chứng chỉ cho Iceberg REST Catalog
openssl genrsa -out /etc/pki/iceberg/iceberg.key 2048
openssl req -new -key /etc/pki/iceberg/iceberg.key -out /etc/pki/iceberg/iceberg.csr -subj "/CN=iceberg-catalog"
openssl x509 -req -in /etc/pki/iceberg/iceberg.csr -CA /etc/pki/ca.crt -CAkey /etc/pki/ca.key -CAcreateserial -out /etc/pki/iceberg/iceberg.crt -days 500 -sha256
# Tạo chứng chỉ Client cho người dùng (dùng cho mTLS)
openssl genrsa -out /etc/pki/trino/client.key 2048
openssl req -new -key /etc/pki/trino/client.key -out /etc/pki/trino/client.csr -subj "/CN=analyst_user"
openssl x509 -req -in /etc/pki/trino/client.csr -CA /etc/pki/ca.crt -CAkey /etc/pki/ca.key -CAcreateserial -out /etc/pki/trino/client.crt -days 500 -sha256
Kết quả mong đợi: Các file .key và .crt được tạo thành công trong thư mục tương ứng. File .csr và .srl có thể xóa sau khi hoàn tất để dọn dẹp.
Cấu hình Trino Server (TLS + LDAP)
Cấu hình file etc/catalog/iceberg.properties trên container Trino để sử dụng Iceberg Catalog qua HTTPS với xác thực mTLS.
Đường dẫn config: /opt/trino/etc/catalog/iceberg.properties
connector.name=iceberg
iceberg.catalog.name=datafabric_catalog
iceberg.catalog.type=rest
iceberg.catalog.rest.uri=https://iceberg-rest-catalog:8080
iceberg.catalog.rest.authentication.type=OAUTH2
iceberg.catalog.rest.client.key-store.path=/etc/pki/trino/trino.keystore
iceberg.catalog.rest.client.key-store-password=trino_password
iceberg.catalog.rest.client.trust-store.path=/etc/pki/trino/ca.truststore
iceberg.catalog.rest.client.trust-store-password=ca_password
Kết quả mong đợi: Trino có thể kết nối an toàn với Iceberg Catalog qua HTTPS. Cần chuẩn bị trước các file keystore/truststore từ các chứng chỉ .crt đã tạo ở trên (sử dụng lệnh keytool).
Tiếp theo, cấu hình file etc/node.properties để kích hoạt HTTPS cho Trino Server.
http-server=https
https-server=http
https-server.http-port=8080
https-server.https-port=8443
https-server.keystore-path=/etc/pki/trino/trino.keystore
https-server.keystore-password=trino_password
https-server.truststore-path=/etc/pki/trino/ca.truststore
https-server.truststore-password=ca_password
Kết quả mong đợi: Trino lắng nghe cổng 8443 với giao thức HTTPS. Kết nối HTTP thường (8080) sẽ bị chặn hoặc chuyển hướng.
Cấu hình Iceberg REST Catalog (TLS + OAuth2)
Cấu hình file application.properties của Iceberg REST Catalog để hỗ trợ xác thực OAuth2 và TLS.
Đường dẫn config: /opt/iceberg/conf/application.properties
catalog.name=datafabric_catalog
catalog.type=rest
catalog.rest.uri=https://iceberg-rest-catalog:8080
catalog.rest.authentication.type=OAUTH2
catalog.rest.authentication.oauth2.authorization-server-uri=https://auth-server:443
catalog.rest.authentication.oauth2.client-id=trino-client
catalog.rest.authentication.oauth2.client-secret=secret_key
catalog.rest.authentication.oauth2.client-authentication-method=client_secret_post
server.http.enabled=false
server.https.enabled=true
server.https.port=8080
server.https.keystore.path=/etc/pki/iceberg/iceberg.keystore
server.https.keystore.password=iceberg_password
server.https.truststore.path=/etc/pki/iceberg/ca.truststore
server.https.truststore.password=ca_password
Kết quả mong đợi: Iceberg REST Catalog chỉ chấp nhận kết nối HTTPS và yêu cầu token OAuth2 để xác thực client (Trino).
Triển khai Apache Ranger cho Authorization
Sau khi xác thực người dùng (Authentication), bước tiếp theo là phân quyền (Authorization). Chúng ta sẽ sử dụng Apache Ranger để quản lý chính sách truy cập dựa trên vai trò (RBAC) cho các bảng (tables) trong Iceberg.
Cấu hình Trino để tích hợp Ranger
Để Trino tuân thủ chính sách từ Ranger, cần cấu hình plugin Ranger cho Trino. Điều này yêu cầu cài đặt thư viện `iceberg-ranger` và cấu hình kết nối đến Ranger Admin Server.
Đường dẫn config: /opt/trino/etc/catalog/iceberg.properties (bổ sung các dòng sau vào file đã có ở phần trên)
iceberg.catalog.rest.authorization.policy-provider=ranger
iceberg.catalog.rest.authorization.ranger.policy-refresh-interval=60s
iceberg.catalog.rest.authorization.ranger.admin-url=http://ranger-admin:6080
iceberg.catalog.rest.authorization.ranger.plugin-type=iceberg
Kết quả mong đợi: Trino sẽ gọi API của Ranger để kiểm tra quyền truy cập mỗi khi có query thực thi đối với bảng Iceberg.
Cấu hình Plugin Ranger cho Iceberg
Cấu hình plugin Ranger trên Iceberg REST Catalog để đồng bộ chính sách từ Ranger Admin Server.
Đường dẫn config: /opt/iceberg/conf/application.properties (bổ sung các dòng sau)
catalog.rest.authorization.enabled=true
catalog.rest.authorization.policy-provider=ranger
catalog.rest.authorization.ranger.admin-url=http://ranger-admin:6080
catalog.rest.authorization.ranger.plugin-type=iceberg
catalog.rest.authorization.ranger.policy-refresh-interval=60s
Kết quả mong đợi: Iceberg REST Catalog sẽ chặn các yêu cầu vi phạm chính sách được định nghĩa trên Ranger Admin UI.
Định nghĩa Policy trên Ranger UI
Truy cập Ranger Admin UI (thường ở cổng 6080) để tạo policy. Vì đây là hướng dẫn kỹ thuật qua command, ta sẽ giả lập việc tạo policy thông qua API của Ranger.
Tạo policy cho phép nhóm analysts chỉ được quyền SELECT trên bảng sales_data.
curl -X POST \
http://ranger-admin:6080/service/v2/plugin/iceberg/datafabric_catalog \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic admin:admin' \
-d '{
"name": "sales_data_read_only_policy",
"description": "Allow analysts to read sales_data",
"type": "iceberg",
"items": [
{
"name": "sales_data",
"condition": {
"operator": "PERMIT",
"expression": "userGroup == analysts"
}
}
],
"conditions": [],
"deny": false,
"policyItems": []
}'
Kết quả mong đợi: API trả về mã 200 OK. Policy được tạo thành công và áp dụng ngay lập tức (hoặc sau 60s refresh).
Cấu hình Mã hóa Dữ liệu ở trạng thái nghỉ (Encryption at Rest)
Bảo vệ dữ liệu vật lý lưu trữ trên S3 là bắt buộc cho môi trường sản xuất. Chúng ta sẽ kích hoạt Server-Side Encryption (SSE) với khóa quản lý bởi AWS (SSE-S3) hoặc khóa khách (SSE-KMS).
Cấu hình Bucket Policy trên S3
Đảm bảo bucket S3 lưu trữ data catalog của Iceberg yêu cầu mọi request upload (PutObject) phải có encryption.
Đường dẫn file policy (JSON): /etc/s3-bucket-policies/iceberg-data-bucket.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::iceberg-data-bucket/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "AllowEncryptedObjectUploads",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/IcebergWriterRole"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::iceberg-data-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
}
]
}
Kết quả mong đợi: Bất kỳ request nào cố gắng ghi file lên bucket mà không có header `x-amz-server-side-encryption: aws:kms` sẽ bị từ chối (403 Forbidden).
Cấu hình Iceberg để sử dụng KMS Key
Cấu hình Iceberg Catalog để tự động thêm header mã hóa khi ghi dữ liệu lên S3.
Đường dẫn config: /opt/iceberg/conf/application.properties (hoặc trong file catalog properties)
catalog.rest.s3.endpoint=https://s3.us-east-1.amazonaws.com
catalog.rest.s3.path=iceberg-data-bucket
catalog.rest.s3.encryption.type=AES_256
catalog.rest.s3.encryption.key-id=alias/my-iceberg-kms-key
Kết quả mong đợi: Khi Iceberg ghi file data file (parquet/orc), các file này sẽ được lưu dưới dạng đã mã hóa trên S3, không thể đọc trực tiếp nếu không có KMS key.
Verification và Kiểm thử Bảo mật
Thực hiện các bước kiểm tra để đảm bảo toàn bộ cấu hình hoạt động đúng như thiết kế.
Kiểm tra kết nối TLS
Thử truy cập Trino và Iceberg Catalog qua HTTPS để xác minh chứng chỉ hợp lệ.
curl -v https://trino-server:8443 -H "Host: trino-server"
curl -v https://iceberg-rest-catalog:8080 -H "Host: iceberg-rest-catalog"
Kết quả mong đợi: HTTP 200 OK hoặc HTTP 401 Unauthorized (chứng tỏ TLS handshake thành công). Không có lỗi `SSL certificate problem`.
Kiểm tra Authorization (Ranger)
Thử truy vấn với user không có quyền để đảm bảo policy chặn đúng.
# Chạy query với user 'analyst_user' (có quyền SELECT)
trino-cli --server https://trino-server:8443 --user analyst_user --key=/etc/pki/trino/client.key --cert=/etc/pki/trino/client.crt --truststore=/etc/pki/trino/ca.truststore --password=secret
# Trong CLI Trino:
SELECT * FROM datafabric_catalog.default.sales_data LIMIT 10;
# Chạy query với user 'admin_user' (không có quyền SELECT trong policy đã tạo ở trên, giả định chỉ có analysts)
trino-cli --server https://trino-server:8443 --user admin_user ...
# Trong CLI Trino:
SELECT * FROM datafabric_catalog.default.sales_data LIMIT 10;
Kết quả mong đợi:
- User analyst_user: Query chạy thành công, trả về dữ liệu.
- User admin_user: Query bị lỗi Authorization denied: Access denied for user 'admin_user' on table 'sales_data'.
Kiểm tra Encryption at Rest
Kiểm tra trực tiếp file metadata trên S3 để xác nhận file đã được mã hóa.
aws s3api list-objects-v2 --bucket iceberg-data-bucket --prefix "datafabric_catalog/default/sales_data/" --query "Contents[0].Encryption" --output text
Kết quả mong đợi: Trả về giá trị AES256 hoặc AWS_KMS. Nếu trả về null, file chưa được mã hóa.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Data Fabric hiện đại với Apache Iceberg, Trino và Kubernetes
« Phần 5: Tối ưu hóa hiệu năng với Partitioning và Indexing trong Iceberg
Phần 7: Tích hợp ETL và Data Pipeline tự động với Airflow »