Cấu hình Authentication (Xác thực người dùng) cho Milvus
Bước đầu tiên trong bảo mật là bật tính năng xác thực để ngăn chặn truy cập trái phép. Milvus sử dụng cơ chế xác thực dựa trên chứng chỉ hoặc mật khẩu thông qua module RootCoord.
Tại sao cần làm điều này? Nếu không bật authentication, bất kỳ ai trong mạng nội bộ đều có thể kết nối, đọc hoặc xóa toàn bộ dữ liệu vector của bạn.
Trước tiên, bạn cần chỉnh sửa file cấu hình YAML của Milvus để kích hoạt tính năng này.
Đường dẫn file cấu hình: /opt/milvus/configs/milvus.yaml (hoặc trong thư mục docker-compose tùy cấu hình của bạn).
Nội dung cần thêm/sửa vào file milvus.yaml:
security:
rootPassword: "Milvus@2024Strong" # Thay đổi mật khẩu mặc định ngay lập tức
authentication:
enabled: true
defaultUser: "root"
Kết quả mong đợi: File cấu hình được cập nhật, Milvus sẽ yêu cầu username và password khi client kết nối.
Tiếp theo, cần khởi động lại dịch vụ Milvus để áp dụng thay đổi.
docker-compose down
docker-compose up -d
Kết quả mong đợi: Các container Milvus khởi động lại. Console logs của container `milvus-standalone` sẽ hiển thị dòng thông báo "Security module enabled" hoặc tương tự.
Để verify kết quả, hãy thử kết nối bằng SDK Python mà không có mật khẩu.
python -c "from pymilvus import connections; connections.connect('default')"
Kết quả mong đợi: Lỗi AuthenticationError hoặc Permission denied xuất hiện, chứng tỏ authentication đã hoạt động.
Thử kết nối lại với thông tin xác thực đúng.
python -c "from pymilvus import connections; connections.connect('default', user='root', password='Milvus@2024Strong')"
Kết quả mong đợi: Kết nối thành công, không có lỗi.
Triển khai SSL/TLS để mã hóa giao tiếp
Bật SSL/TLS giúp mã hóa dữ liệu truyền giữa client và server, ngăn chặn tấn công "Man-in-the-Middle" (MITM).
Tại sao cần làm điều này? Dữ liệu vector thường là dữ liệu nhạy cảm. Nếu truyền qua HTTP không mã hóa, hacker có thể sniffing (nghe lén) dữ liệu trên đường truyền.
Bước 1: Tạo thư mục chứa chứng chỉ SSL.
mkdir -p /opt/milvus/certs
cd /opt/milvus/certs
Kết quả mong đợi: Thư mục `/opt/milvus/certs` được tạo.
Bước 2: Tạo Private Key và Certificate Signing Request (CSR) tự ký (Self-signed) cho mục đích phát triển/kiểm thử.
openssl genrsa -out milvus.key 2048
openssl req -new -key milvus.key -out milvus.csr -subj "/C=VN/ST=HCM/C=L/OU=Dev/O=Milvus/CN=localhost"
openssl x509 -req -days 365 -in milvus.csr -signkey milvus.key -out milvus.crt
Kết quả mong đợi: Tạo ra 3 file: `milvus.key`, `milvus.csr`, `milvus.crt` trong thư mục certs.
Bước 3: Cấu hình Milvus để sử dụng SSL.
Cần sửa file milvus.yaml để trỏ đến đường dẫn chứng chỉ và bật chế độ TLS.
Nội dung cần thêm vào milvus.yaml:
security:
tlsMode: 2 # 0: disabled, 1: prefer, 2: require
tlsCertPath: /var/milvus/certs/milvus.crt
tlsKeyPath: /var/milvus/certs/milvus.key
Kết quả mong đợi: Milvus sẽ yêu cầu kết nối SSL bắt buộc.
Bước 4: Cập nhật docker-compose.yml để mount thư mục certs vào container.
Thêm volume mapping cho service `milvus-standalone`.
# Thêm vào phần service: milvus-standalone
volumes:
- /opt/milvus/certs:/var/milvus/certs:ro
Kết quả mong đợi: Container có thể truy cập file chứng chỉ tại đường dẫn `/var/milvus/certs`.
Bước 5: Khởi động lại dịch vụ.
docker-compose down
docker-compose up -d
Kết quả mong đợi: Logs của Milvus hiển thị "TLS mode: 2 (Require)" và "Certificate loaded successfully".
Verify kết quả bằng cách thử kết nối không qua SSL.
python -c "from pymilvus import connections; connections.connect('default', user='root', password='Milvus@2024Strong', host='localhost', port=19530, secure=False)"
Kết quả mong đợi: Lỗi kết nối hoặc timeout vì server yêu cầu SSL.
Verify kết quả bằng cách kết nối qua SSL (chế độ verify=false cho self-signed).
python -c "from pymilvus import connections; connections.connect('default', user='root', password='Milvus@2024Strong', host='localhost', port=19530, secure=True, server_name='localhost')"
Kết quả mong đợi: Kết nối thành công qua kênh mã hóa.
Triển khai kịch bản Backup tự động
Milvus cung cấp công cụ `milvusctl` hoặc API để backup dữ liệu. Ở đây chúng ta sẽ sử dụng script Python để tự động hóa việc backup sang NFS hoặc Object Storage.
Tại sao cần làm điều này? Để phục hồi dữ liệu khi xảy ra sự cố phần cứng, lỗi phần mềm hoặc tấn công ransomware.
Bước 1: Cài đặt thư viện cần thiết cho script backup.
pip install pymilvus boto3
Kết quả mong đợi: Các thư viện Python cần thiết được cài đặt.
Bước 2: Tạo script backup Python.
Đường dẫn file: /opt/milvus/scripts/backup_milvus.py.
Nội dung file backup_milvus.py:
#!/usr/bin/env python3
import os
import sys
from datetime import datetime
from pymilvus import connections, utility
# Cấu hình kết nối
HOST = os.getenv('MILVUS_HOST', 'localhost')
PORT = int(os.getenv('MILVUS_PORT', 19530))
USER = os.getenv('MILVUS_USER', 'root')
PASSWORD = os.getenv('MILVUS_PASSWORD', 'Milvus@2024Strong')
BACKUP_DIR = os.getenv('BACKUP_DIR', '/mnt/nfs_backups/milvus')
SECURE = os.getenv('MILVUS_SECURE', 'True').lower() == 'true'
def main():
# Kết nối
try:
connections.connect(
alias='default',
host=HOST,
port=PORT,
user=USER,
password=PASSWORD,
secure=SECURE,
server_name=HOST if SECURE else None
)
print(f"[INFO] Connected to Milvus at {HOST}:{PORT}")
except Exception as e:
print(f"[ERROR] Failed to connect: {e}")
sys.exit(1)
# Lấy danh sách Collection
try:
collections = utility.list_collections()
print(f"[INFO] Found {len(collections)} collections: {collections}")
except Exception as e:
print(f"[ERROR] Failed to list collections: {e}")
sys.exit(1)
# Tạo timestamp cho folder backup
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = os.path.join(BACKUP_DIR, f"milvus_backup_{timestamp}")
if not os.path.exists(BACKUP_DIR):
os.makedirs(BACKUP_DIR, exist_ok=True)
print(f"[INFO] Starting backup to {backup_path}")
# Logic export dữ liệu (Ví dụ: dump metadata và vector raw nếu cần)
# Lưu ý: Milvus Standalone không có built-in backup tool mạnh như Cluster,
# nên thường backup qua snapshot MinIO hoặc export dữ liệu raw.
# Ở đây minh họa việc lưu danh sách cấu hình collection.
config_file = os.path.join(backup_path, "collections_config.json")
import json
config_data = []
for coll_name in collections:
coll_info = utility.describe_collection(coll_name)
config_data.append({
"name": coll_name,
"schema": coll_info.get("schema", {}),
"partition_names": coll_info.get("partitions", []),
"backup_time": timestamp
})
with open(config_file, 'w') as f:
json.dump(config_data, f, indent=4)
print(f"[SUCCESS] Backup metadata saved to {config_file}")
print(f"[INFO] Note: For full vector data backup, ensure MinIO bucket is synced via snapshot.")
if __name__ == "__main__":
main()
Kết quả mong đợi: File script được tạo và có thể thực thi.
Bước 3: Cấp quyền thực thi cho script.
chmod +x /opt/milvus/scripts/backup_milvus.py
Kết quả mong đợi: Script có thể chạy trực tiếp.
Bước 4: Thiết lập Cron Job để chạy tự động mỗi ngày lúc 2:00 AM.
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/bin/python3 /opt/milvus/scripts/backup_milvus.py >> /var/log/milvus_backup.log 2>&1") | crontab -
Kết quả mong đợi: Cron job được thêm vào danh sách task định kỳ.
Verify kết quả bằng cách chạy thủ công script.
MILVUS_PASSWORD="Milvus@2024Strong" python3 /opt/milvus/scripts/backup_milvus.py
Kết quả mong đợi: Script chạy thành công, xuất file JSON trong thư mục backup và log "SUCCESS".
Cấu hình Firewall (UFW) trên Ubuntu 24.04
Cấu hình UFW để chỉ cho phép các port cần thiết, giảm bề mặt tấn công (attack surface).
Tại sao cần làm điều này? Mặc định Ubuntu 24.04 có thể mở nhiều port không cần thiết. Việc đóng chặt firewall đảm bảo chỉ client đáng tin cậy mới truy cập được.
Bước 1: Kích hoạt UFW và đặt chính sách mặc định là từ chối (deny incoming).
ufw default deny incoming
ufw default allow outgoing
ufw enable
Kết quả mong đợi: UFW được bật, trạng thái là "active".
Bước 2: Mở port SSH (22) để quản trị viên có thể kết nối.
ufw allow 22/tcp
Kết quả mong đợi: Port 22 được thêm vào danh sách cho phép.
Bước 3: Mở port HTTP (80) và HTTPS (443) nếu dùng Reverse Proxy (Nginx/Traefik).
ufw allow 80/tcp
ufw allow 443/tcp
Kết quả mong đợi: Ports 80 và 443 được mở.
Bước 4: Mở port giao tiếp của Milvus (19530 cho gRPC/HTTP).
Lưu ý: Nếu bạn đã bật SSL, client sẽ kết nối qua port 19530 nhưng giao thức là HTTPS/gRPC-TLS. Nếu chưa bật SSL, vẫn dùng port này.
ufw allow 19530/tcp
Kết quả mong đợi: Port 19530 được mở cho lưu lượng TCP.
Bước 5: Mở port Web UI của Milvus (nếu có, thường là 8080 hoặc 9091 tùy cấu hình).
ufw allow 8080/tcp
Kết quả mong đợi: Port 8080 được mở.
Bước 6: Kiểm tra lại trạng thái firewall.
ufw status verbose
Kết quả mong đợi: Danh sách port cho phép hiển thị đúng 22, 80, 443, 19530, 8080. Tất cả các port khác bị chặn.
Verify kết quả từ máy khách (client machine).
nc -zv 19530
nc -zv 8081 # Port này phải bị chặn
Kết quả mong đợi: Port 19530 kết nối thành công (succeeded), port 8081 bị từ chối (connection refused/timed out).
Best Practices khi Upgrade Milvus trên Ubuntu 24.04
Việc nâng cấp phiên bản Milvus cần được thực hiện cẩn thận để tránh mất dữ liệu hoặc xung đột schema.
Tại sao cần làm điều này? Milvus thay đổi schema dữ liệu hoặc cấu trúc internal storage giữa các phiên bản lớn (major version). Upgrade sai cách có thể làm hỏng dữ liệu.
Nguyên tắc 1: Luôn Backup trước khi upgrade.
Chạy script backup đã tạo ở phần trước hoặc tạo snapshot MinIO.
python3 /opt/milvus/scripts/backup_milvus.py
Kết quả mong đợi: File backup mới nhất được tạo trước khi thực hiện upgrade.
Nguyên tắc 2: Kiểm tra tính tương thích (Compatibility Check).
Luôn đọc tài liệu "Migration Guide" chính thức của Milvus trên GitHub cho phiên bản đích.
curl -s https://raw.githubusercontent.com/milvus-io/milvus/master/docs/developer_guides/migration_guide.md | head -50
Kết quả mong đợi: Bạn nắm được các thay đổi quan trọng về schema hoặc API.
Nguyên tắc 3: Upgrade từng thành phần (nếu là Cluster) hoặc Down/Up (nếu là Standalone).
Đối với Standalone (Docker Compose), quy trình an toàn nhất là:
- Stop dịch vụ hiện tại.
- Lưu lại volume dữ liệu (minio, etcd, milvus).
- Lấy Docker Image mới nhất.
- Khởi động lại dịch vụ.
Command để pull image mới (ví dụ từ v2.3.0 lên v2.4.0):
docker-compose pull milvus-standalone
docker-compose pull etcd
docker-compose pull minio
Kết quả mong đợi: Docker images mới được tải về.
Command để cập nhật file docker-compose.yml với tag version mới.
# Ví dụ: sửa dòng image trong docker-compose.yml
# Từ: milvusdb/milvus:v2.3.0
# Sang: milvusdb/milvus:v2.4.0
Kết quả mong đợi: File docker-compose.yml được cập nhật đúng tag version.
Command để thực thi upgrade.
docker-compose down
docker-compose up -d
Kết quả mong đợi: Container khởi động với version mới, dữ liệu cũ vẫn còn (vì volume vẫn giữ nguyên).
Nguyên tắc 4: Verify dữ liệu sau upgrade.
Kết nối vào Milvus mới và kiểm tra số lượng entity trong collection.
python -c "from pymilvus import connections, utility; connections.connect('default', user='root', password='Milvus@2024Strong'); print(utility.do_query('select count(*) as count from your_collection_name'))"
Kết quả mong đợi: Số lượng bản ghi (count) không thay đổi so với trước khi upgrade.
Nguyên tắc 5: Giữ lại backup ít nhất 3 phiên bản.
Xóa các backup cũ hơn 30 ngày để tiết kiệm dung lượng.
find /mnt/nfs_backups/milvus -type d -mtime +30 -exec rm -rf {} \;
Kết quả mong đợi: Các thư mục backup quá cũ bị xóa, giữ lại dung lượng lưu trữ.
Điều hướng series:
Mục lục: Series: Triển khai Database Vector với Milvus và Ubuntu 24.04
« Phần 7: Triển khai Milvus Cluster (Multi-Node) và cân bằng tải