1. Cấu hình Basic Auth cho Weaviate
Bước đầu tiên là khóa truy cập vào Weaviate bằng tên người dùng và mật khẩu để ngăn chặn truy cập trái phép từ mạng nội bộ hoặc internet.
Chúng ta cần chỉnh sửa file docker-compose.yml để thêm biến môi trường xác thực cơ bản.
Tại sao cần làm này: Weaviate mặc định chạy ở chế độ public. Việc bật Basic Auth yêu cầu mọi request API đều phải kèm header Authorization: Basic base64(username:password).
Kết quả mong đợi: Truy cập API không kèm thông tin đăng nhập sẽ bị trả về lỗi 401 Unauthorized.
cat > /opt/weaviate/docker-compose.yml
File cấu hình đã được ghi vào /opt/weaviate/docker-compose.yml với các biến môi trường xác thực.
cd /opt/weaviate && docker compose up -d
Dịch vụ Weaviate khởi động lại với cấu hình bảo mật mới.
Verify Basic Auth
Chúng ta sẽ thử truy cập API mà không có thông tin xác thực để kiểm tra hệ thống đã chặn chưa.
curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/v1/.well-known/openid-configuration
Kết quả mong đợi: Mã trạng thái 401 (Unauthorized).
Thử truy cập lại với thông tin đăng nhập đúng.
curl -u admin:secure-password-456 http://localhost:8080/v1/.well-known/openid-configuration -H "Content-Type: application/json" -s | jq -r '.issuer // "Error: No issuer found"'
Kết quả mong đợi: Mã trạng thái 200 và trả về chuỗi issuer của Weaviate (ví dụ: http://localhost:8080).
2. Triển khai chứng chỉ SSL/TLS tự ký để bật HTTPS
Bước tiếp theo là mã hóa đường truyền giữa client và server bằng HTTPS để bảo vệ dữ liệu nhạy cảm và token xác thực.
Tạo thư mục chứa chứng chỉ và sinh chứng chỉ tự ký (Self-Signed) bằng OpenSSL.
Tại sao: Các ứng dụng Production yêu cầu HTTPS. Client của Weaviate (Python/Go/JS) thường mặc định từ chối kết nối HTTP không an toàn hoặc không có chứng chỉ hợp lệ.
Kết quả mong đợi: Có 2 file weaviate.crt (public) và weaviate.key (private) trong thư mục chứng chỉ.
mkdir -p /opt/weaviate/certs && cd /opt/weaviate/certs
Tạo thư mục chứa chứng chỉ.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout weaviate.key -out weaviate.crt -subj "/CN=localhost"
Sinh chứng chỉ tự ký hợp lệ trong 365 ngày cho domain localhost.
Cấu hình Docker Compose cho HTTPS
Cập nhật lại file docker-compose.yml để Weaviate sử dụng chứng chỉ vừa tạo và chuyển sang cổng 8080 (HTTPS).
Cần mount thư mục certs vào container và chỉnh sửa biến môi trường SCHEME thành https cùng các đường dẫn chứng chỉ.
cat > /opt/weaviate/docker-compose.yml
File docker-compose.yml đã được cập nhật với volume mount chứng chỉ và các flag SSL.
cd /opt/weaviate && docker compose down && docker compose up -d
Dừng dịch vụ cũ và khởi động lại với cấu hình HTTPS mới.
Verify HTTPS
Kiểm tra kết nối HTTPS có hoạt động không. Do là chứng chỉ tự ký, curl sẽ báo lỗi an toàn nếu không bỏ qua kiểm tra CA.
curl -k -u admin:secure-password-456 https://localhost:8080/v1/.well-known/openid-configuration -s | jq -r '.issuer // "Error: No issuer found"'
Kết quả mong đợi: Mã trạng thái 200 và hiển thị issuer. Flag -k (insecure) được dùng để chấp nhận chứng chỉ tự ký.
Thử truy cập không có chứng chỉ hợp lệ hoặc không có Basic Auth sẽ bị chặn.
curl -s -o /dev/null -w "%{http_code}" https://localhost:8080/v1/.well-known/openid-configuration
Kết quả mong đợi: Mã trạng thái 401.
3. Cấu hình OAuth2 (Google/GitHub) cho xác thực người dùng
Để tích hợp xác thực qua Google hoặc GitHub, Weaviate cần cấu hình OAuth2 Provider bên ngoài. Weaviate hỗ trợ tích hợp trực tiếp với Google OAuth2 hoặc GitHub OAuth.
Ở đây chúng ta sẽ cấu hình ví dụ với GitHub OAuth. Bạn cần tạo một Application trên GitHub Developer Settings để lấy Client ID và Client Secret.
Tại sao: Cho phép người dùng đăng nhập bằng tài khoản xã hội, giảm tải việc quản lý mật khẩu nội bộ cho người dùng cuối.
Kết quả mong đợi: Weaviate có thể cấp phát token OAuth2 từ GitHub.
Chuẩn bị thông tin từ GitHub
Giả sử bạn đã tạo App trên GitHub và có:
CLIENT_ID: gh_abc123xyz
CLIENT_SECRET: secret_key_987654321
REDIRECT_URI: https://localhost:8080/v1/auth/github (Cần cấu hình trong GitHub App Settings)
Cấu hình Weaviate cho OAuth2
Cập nhật file docker-compose.yml để bật module OAuth2 của Weaviate và cung cấp thông tin Client.
cat > /opt/weaviate/docker-compose.yml
File cấu hình đã thêm các biến môi trường bắt đầu bằng AUTHENTICATION_CONFIG_OAUTH2_.
cd /opt/weaviate && docker compose up -d --force-recreate
Khởi động lại Weaviate với cấu hình OAuth2.
Verify OAuth2 Configuration
Kiểm tra xem Weaviate đã nhận diện cấu hình OAuth2 chưa bằng cách gọi endpoint /.well-known/openid-configuration với Basic Auth (Admin).
curl -k -u admin:secure-password-456 https://localhost:8080/v1/.well-known/openid-configuration -s | jq '.authorization_endpoint // "OAuth2 not configured correctly"'
Kết quả mong đợi: Trả về URL endpoint OAuth2 của Weaviate (ví dụ: https://localhost:8080/v1/auth/github) hoặc thông báo lỗi nếu cấu hình sai.
4. Kiểm tra truy cập bị chặn khi thiếu token hợp lệ
Bước cuối cùng là xác minh rằng hệ thống đã hoạt động như một "cổng an ninh" thực thụ: chặn mọi yêu cầu không có token hợp lệ.
Chúng ta sẽ thực hiện 3 bài kiểm tra: (1) Không có Auth, (2) Auth sai, (3) Auth đúng.
Tại sao: Đảm bảo chính sách bảo mật (Security Policy) đã được áp dụng đúng, ngăn chặn truy cập trái phép vào dữ liệu vector.
Test Case 1: Không có bất kỳ thông tin xác thực nào
curl -k https://localhost:8080/v1/schema -s -o /dev/null -w "%{http_code}\n"
Kết quả mong đợi: 401 (Unauthorized).
Test Case 2: Cung cấp Basic Auth sai
curl -k -u admin:wrong-password https://localhost:8080/v1/schema -s -o /dev/null -w "%{http_code}\n"
Kết quả mong đợi: 401 (Unauthorized).
Test Case 3: Cung cấp Basic Auth đúng
curl -k -u admin:secure-password-456 https://localhost:8080/v1/schema -s -o /dev/null -w "%{http_code}\n"
Kết quả mong đợi: 200 (OK).
Hệ thống bảo mật đã được cấu hình thành công với Basic Auth, HTTPS và OAuth2. Các yêu cầu không hợp lệ đều bị chặn, trong khi yêu cầu hợp lệ được phục vụ qua kênh mã hóa.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Weaviate và Ubuntu 24.04
« Phần 4: Xây dựng ứng dụng Vector Search với Python và Weaviate Client
Phần 6: Tối ưu hóa hiệu năng: Sharding, Indexing và Backup »