第十一章:安全配置
深入学习 MinIO 的安全配置,包括 TLS 加密、访问控制、审计日志和安全最佳实践。
最后更新: 2024-01-15
页面目录
第十一章:安全配置
11.1 TLS/SSL 配置
11.1.1 生成证书
# 使用 minio-ca-certgen 生成证书
# 安装证书生成工具
git clone https://github.com/minio/certgen
cd certgen && go build -o certgen
# 生成 CA 证书
./certgen -ca -host "localhost,127.0.0.1,minio"
# 生成服务器证书
./certgen -host "minio-server" -ip "192.168.1.100"
# 或者使用 OpenSSL
openssl req -new -x509 -nodes -days 365 \
-keyout private.key -out public.crt \
-subj "/C=US/ST=State/L=City/O=Org/CN=minio"
11.1.2 配置 TLS
# 创建证书目录
sudo mkdir -p /etc/minio/certs
# 复制证书
sudo cp public.crt /etc/minio/certs/
sudo cp private.key /etc/minio/certs/
# 设置权限
sudo chmod 600 /etc/minio/certs/private.key
# 重启 MinIO
sudo systemctl restart minio
11.1.3 TLS 配置选项
# 启动时指定 TLS
minio server /data/minio \
--cert /etc/minio/certs/public.crt \
--key /etc/minio/certs/private.key
# 强制 HTTPS
export MINIO_FORCE_PATH_HTTPS=true
# TLS 版本配置
# MinIO 默认支持 TLS 1.2+
11.2 访问密钥管理
11.2.1 根账户保护
# 设置强密码
# 根账户应使用强密码
# 建议:16+ 字符,包含大小写、数字、特殊字符
# 定期轮换密码
mc admin user update myminio/admin --secret-key NEW_STRONG_PASSWORD
11.2.2 密钥轮换
# 创建新访问密钥
mc admin user add myminio new-admin NEW_PASSWORD
# 分配管理员权限
mc admin policy attach myminio/consoleAdmin --user new-admin
# 验证新账户
mc alias set newminio http://localhost:9000 new-admin NEW_PASSWORD
mc admin info newminio/
# 禁用旧账户
mc admin user disable myminio/old-admin
11.3 网络安全
11.3.1 网络隔离
# 使用防火墙限制访问
# iptables 示例
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 9000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9000 -j DROP
# Kubernetes NetworkPolicy 示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: minio-network-policy
spec:
podSelector:
matchLabels:
app: minio
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: production
11.3.2 强制 HTTPS
# 配置 Nginx 反向代理强制 HTTPS
server {
listen 443 ssl;
server_name minio.example.com;
ssl_certificate /etc/ssl/certs/minio.crt;
ssl_certificate_key /etc/ssl/private/minio.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
11.4 审计日志
11.4.1 启用审计
# 配置审计 Webhook
mc admin config set myminio/ \
audit_webhook=endpoint=http://audit-server:8080/audit \
audit_webhook/auth_token=Bearer_TOKEN
# 完整审计配置
mc admin config set myminio/ \
audit_webhook/endpoint=http://audit-server:8080/audit \
audit_webhook/auth_token=Bearer_TOKEN \
audit_webhook/client_cert=/path/to/cert.pem \
audit_webhook/client_key=/path/to/key.pem
# 重启生效
mc admin service restart myminio/
11.4.2 审计日志内容
{
"version": "1.0",
"time": "2024-01-15T10:30:00.000Z",
"api": {
"name": "PutObject",
"version": "v4",
"signatureVersion": "SigV4"
},
"level": "string",
"remotehost": "192.168.1.100",
"userAgent": "MinIO (linux) minio-go/v7.0.0",
"reqclaims": {
"accessKey": "user1"
},
"requestID": "3E3D2A2E6C73B2E9",
"timeToResponseNs": 345000,
"withContentLength": false,
"statusCode": 200
}
11.5 存储加密
11.5.1 SSE-S3
# 设置存储桶加密
mc encryption set sse-s3 myminio/mybucket
# 上传时自动加密
mc cp file.txt myminio/mybucket/ --enc-sse-s3
# 验证加密状态
mc encryption info myminio/mybucket
11.5.2 SSE-KMS
# 配置 KMS (使用 HashiCorp Vault)
export MINIO_KMS_KES_ENDPOINT=https://kes-server:7373
export MINIO_KMS_KES_KEY_NAME=my-minio-key
export MINIO_KMS_KES_CERT_FILE=/certs/kes-cert.pem
export MINIO_KMS_KES_KEY_FILE=/certs/kes-key.pem
export MINIO_KMS_KES_CAPATH=/certs/kes-ca.pem
# 设置存储桶加密
mc encryption set sse-kms myminio/mybucket
# 使用特定密钥
mc cp file.txt myminio/mybucket/ --enc-sse-kms=key-name
11.5.3 SSE-C
# 客户管理的密钥
# 生成 32 字节密钥
openssl rand -out sse-c.key 32
# 上传使用 SSE-C
mc cp file.txt myminio/mybucket/ --enc-sse-c=sse-c.key
# 下载时提供密钥
mc cp myminio/mybucket/file.txt /tmp/ --decryption-key sse-c.key
11.6 访问控制
11.6.1 最小权限原则
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::readonly-bucket/*"
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::readonly-bucket/*"
}
]
}
11.6.2 公开访问控制
# 禁止公开写入
mc anonymous set download myminio/mybucket
# 查看公开访问设置
mc anonymous list myminio/mybucket
# 全局禁止公开访问
mc admin config set myminio/ \
ocsp_reload_secret=secret_key
11.7 对象锁定
11.7.1 合规模式
# 创建合规模式存储桶
mc mb --with-lock myminio/compliance-bucket
# 设置默认保留期
mc object-lock set myminio/compliance-bucket \
--default-retention-days 365 \
--mode compliance
# 上传带保留的对象
mc cp file.txt myminio/compliance-bucket/ \
--lock-until "2025-12-31T23:59:59Z"
# 查看保留状态
mc retention info myminio/compliance-bucket/file.txt
11.7.2 法律保留
# 设置法律保留
mc legalhold set myminio/mybucket/file.txt
# 移除法律保留
mc legalhold clear myminio/mybucket/file.txt
# 查看法律保留状态
mc legalhold info myminio/mybucket/file.txt
11.8 安全加固
11.8.1 安全检查清单
□ 使用 TLS/HTTPS 加密通信
□ 使用强密码(16+ 字符)
□ 定期轮换访问密钥
□ 启用审计日志
□ 配置对象锁定
□ 启用存储加密
□ 使用防火墙限制访问
□ 定期更新 MinIO 版本
□ 禁用不必要的默认账户
□ 配置访问速率限制
11.8.2 配置限制
# 启用 CORS 限制
mc cors set myminio/mybucket cors.json
# 配置速率限制
mc admin config set myminio/ \
api_requests_max=1000 \
api_requests_deadline=10s
# 禁止特定 HTTP 方法
# 通过 Nginx 配置
11.9 安全最佳实践
11.9.1 生产环境配置
# 使用环境变量配置
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=SECURE_PASSWORD_123
export MINIO_KMS_KES_ENDPOINT=https://kes:7373
export MINIO_KMS_KES_KEY_NAME=minio-master-key
export MINIO_LOGGER_WEBHOOK_ENABLE=on
export MINIO_AUDIT_WEBHOOK_ENABLE=on
# 启动服务
minio server /data/minio \
--console-address ":9001"
11.9.2 Kubernetes 安全
# 使用 TLS
# 启用 Pod 安全策略
# 使用 NetworkPolicy 限制访问
# 配置 Secret 管理密钥
apiVersion: v1
kind: Secret
metadata:
name: minio-secret
type: Opaque
stringData:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: secure-password
11.10 总结
本章介绍了 MinIO 的安全配置,包括 TLS 加密、访问控制、审计日志和加密存储等。安全是 MinIO 部署的重要考虑因素,应根据业务需求进行合理配置。