第十一章:安全配置

深入学习 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 部署的重要考虑因素,应根据业务需求进行合理配置。