Cấu hình chính sách IAM cho User và Group
Bước đầu tiên để bảo mật MinIO là xác định rõ ai được phép truy cập bucket nào và với quyền gì. Thay vì dùng quyền Admin toàn cục, chúng ta sẽ tạo user cụ thể và gán policy tùy chỉnh.
Tạo một file cấu hình chính sách đọc-giữ (read-write) cho một bucket cụ thể. File này sẽ được upload vào MinIO Console hoặc dùng lệnh mc để áp dụng.
Đường dẫn: /root/minio-policies/readonly-bucket-policy.json
cat > /root/minio-policies/readonly-bucket-policy.json
Kết quả mong đợi: File JSON hợp lệ được tạo tại đường dẫn chỉ định, sẵn sàng để áp dụng cho user.
Sử dụng công cụ CLI (mc) để tạo user mới và gán chính sách vừa tạo. Giả sử alias "myminio" đã được cấu hình từ phần 4.
mc alias set myminio http://localhost:9000 YOUR_ACCESS_KEY YOUR_SECRET_KEY
mc admin user add myminio readonly-user YOUR_SECRET_KEY
mc admin policy add myminio readonly-policy /root/minio-policies/readonly-bucket-policy.json
mc admin policy attach myminio readonly-policy --user readonly-user
Kết quả mong đợi: User "readonly-user" được tạo thành công và chỉ có quyền đọc danh sách và nội dung bucket "my-data-bucket".
Để quản lý nhóm (Group), tạo file policy cho phép ghi (write) và gán cho nhóm.
cat > /root/minio-policies/writer-group-policy.json
Kết quả mong đợi: Nhóm "writers" được tạo, chứa các user đã liệt kê, và có quyền ghi/xóa trên bucket mục tiêu.
Verify kết quả bằng cách thử truy cập bucket với user mới.
mc --access-key readonly-user --secret-key YOUR_SECRET_KEY ls myminio/my-data-bucket
Kết quả mong đợi: Lệnh list thành công. Nếu thử upload (mc cp file.txt myminio/my-data-bucket/...) sẽ báo lỗi Access Denied.
Kích hoạt chứng chỉ SSL/TLS cho kết nối HTTPS
Để mã hóa lưu lượng truyền tải giữa client và server, cần cấu hình MinIO chạy trên cổng HTTPS (9001) thay vì HTTP (9000). Ở đây chúng ta sử dụng chứng chỉ tự ký (self-signed) để triển khai nhanh trong môi trường nội bộ.
Tạo thư mục chứa chứng chỉ và key, sau đó dùng OpenSSL để tạo chứng chỉ tự ký hợp lệ trong 365 ngày.
mkdir -p /etc/minio/certs
cd /etc/minio/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout minio.key -out minio.crt -subj "/C=VN/ST=HCMC/L=District1/O=DevOps/OU=Team/CN=minio.example.com"
Kết quả mong đợi: Hai file minio.key và minio.crt được tạo trong thư mục /etc/minio/certs. Kiểm tra bằng lệnh ls -l.
Cấu hình Docker Compose để map thư mục chứng chỉ vào container và đổi cổng HTTP sang HTTPS. File docker-compose.yml cần được chỉnh sửa phần ports và volumes.
Đường dẫn: /opt/minio/docker-compose.yml
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9001:9001"
volumes:
- /data/minio:/data
- /etc/minio/certs:/root/.minio/certs:ro
environment:
MINIO_ROOT_USER: YOUR_ACCESS_KEY
MINIO_ROOT_PASSWORD: YOUR_SECRET_KEY
MINIO_ADDRESS: ":9001"
MINIO_BROWSER_ADDRESS: ":9002"
command: server /data --console-address ":9002"
restart: unless-stopped
Kết quả mong đợi: File cấu hình đã được cập nhật. Lưu ý biến MINIO_ADDRESS chỉ định cổng 9001 để server lắng nghe HTTPS.
Khởi động lại dịch vụ để áp dụng thay đổi.
cd /opt/minio
docker-compose down
docker-compose up -d
Kết quả mong đợi: Container MinIO chạy lại. Console truy cập qua cổng 9002 (HTTPS), API truy cập qua cổng 9001 (HTTPS).
Verify kết quả bằng cách kiểm tra kết nối SSL và nội dung certificate.
curl -kv https://localhost:9001/minio 2>&1 | grep -E "SSL|subject|issuer"
Kết quả mong đợi: Output hiển thị thông tin "SSL connection using TLS...", subject và issuer trùng khớp với dữ liệu đã tạo ở bước 1.
Tối ưu hóa thông số Docker cho workload lớn
Khi MinIO xử lý lượng dữ liệu lớn hoặc nhiều request đồng thời, cần điều chỉnh giới hạn tài nguyên của container để tránh bị OOM (Out of Memory) hoặc nghẽn cổ chai CPU.
Chỉnh sửa file docker-compose.yml để thêm các thông số deploy với giới hạn memory và CPU. Cấu hình này áp dụng cho môi trường production với 16GB RAM và 4 CPU cores dành cho MinIO.
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: minio
deploy:
resources:
limits:
cpus: '4.0'
memory: 16G
reservations:
cpus: '2.0'
memory: 8G
ports:
- "9001:9001"
- "9002:9002"
volumes:
- /data/minio:/data
- /etc/minio/certs:/root/.minio/certs:ro
environment:
MINIO_ROOT_USER: YOUR_ACCESS_KEY
MINIO_ROOT_PASSWORD: YOUR_SECRET_KEY
MINIO_ADDRESS: ":9001"
MINIO_BROWSER_ADDRESS: ":9002"
MINIO_SERVER_URL: "https://minio.example.com"
command: server /data --console-address ":9002"
restart: unless-stopped
Kết quả mong đợi: File docker-compose.yml đã chứa phần deploy với limits và reservations. MinIO sẽ không được phép tiêu thụ quá 16GB RAM.
Để tối ưu thêm hiệu năng I/O cho disk, cần đảm bảo disk mount point sử dụng filesystem phù hợp (XFS hoặc ext4 với tune2fs) và disable swap trên host để tránh swap thrashing.
swapoff -a
sed -i '/ swap / s/^\s*#//g' /etc/fstab
echo "vm.swappiness=1" >> /etc/sysctl.conf
sysctl -p
Kết quả mong đợi: Swap bị tắt, hệ thống sẽ ưu tiên OOM Killer hơn là swap, đảm bảo hiệu năng ổn định cho MinIO.
Khởi động lại service để áp dụng các giới hạn tài nguyên mới.
cd /opt/minio
docker-compose down
docker-compose up -d
Kết quả mong đợi: Container chạy lại với các giới hạn tài nguyên đã cấu hình.
Verify kết quả bằng cách kiểm tra giới hạn memory của container đang chạy.
docker inspect minio --format '{{.HostConfig.Memory}}' | numfmt --to=iec
Kết quả mong đợi: Output trả về 16G (hoặc 17179869184 bytes tương đương).
Cấu hình Firewall (UFW) để chỉ mở port cần thiết
UFW (Uncomplicated Firewall) trên Ubuntu 24.04 cần được cấu hình để chỉ cho phép truy cập vào các cổng dịch vụ của MinIO, chặn tất cả các kết nối không cần thiết khác.
Khởi động UFW và thiết lập chính sách mặc định là chặn tất cả kết nối nhập (deny incoming), cho phép tất cả kết nối xuất (allow outgoing).
ufw default deny incoming
ufw default allow outgoing
ufw enable
Kết quả mong đợi: UFW được kích hoạt, hiển thị thông báo "Firewall is active and enabled on system startup".
Mở cổng HTTPS cho API (9001) và Console (9002) từ địa chỉ IP cụ thể hoặc toàn bộ mạng. Ở đây mở cho toàn bộ mạng để test, sau đó nên giới hạn IP.
ufw allow 9001/tcp
ufw allow 9002/tcp
ufw allow from 192.168.1.0/24 to any port 9001 proto tcp
ufw allow from 192.168.1.0/24 to any port 9002 proto tcp
Kết quả mong đợi: Các quy tắc cho phép truy cập cổng 9001 và 9002 được thêm vào danh sách UFW.
Cho phép truy cập SSH để không bị khóa mình ra khỏi server khi firewall bật.
ufw allow 22/tcp
Kết quả mong đợi: Cổng SSH (22) được mở. Bạn vẫn có thể SSH vào server sau khi enable firewall.
Verify kết quả bằng cách kiểm tra trạng thái UFW và thử scan port từ xa.
ufw status verbose
nmap -sT -p 9000,9001,9002 localhost
Kết quả mong đợi: ufw status hiển thị "Status: active" với các quy tắc cho 9001, 9002. nmap trả về "closed" cho port 9000 (vì đã chuyển sang HTTPS) và "open" cho 9001, 9002.
Điều hướng series:
Mục lục: Series: Triển khai Database Object Storage với MinIO và Ubuntu 24.04
« Phần 4: Cấu hình truy cập MinIO qua Console và CLI
Phần 6: Triển khai MinIO Distributed Mode và tính năng Erasure Code »