12 - 安全加固
12 - 安全加固
12.1 Ceph 安全架构
Ceph 提供多层次的安全保护机制:
┌─────────────────────────────────────────────┐
│ 安全层 │
├─────────────────────────────────────────────┤
│ 1. CephX 认证 节点间身份验证 │
│ 2. 传输加密 Messenger v2 + TLS │
│ 3. 静态加密 dm-crypt / LUKS │
│ 4. 授权控制 能力(Capabilities) │
│ 5. RGW ACL/Policy S3 桶策略 / ACL │
│ 6. Dashboard RBAC Web 界面角色权限 │
└─────────────────────────────────────────────┘
12.2 CephX 认证
CephX 是 Ceph 的内置认证协议,基于共享密钥(对称加密)进行节点间认证。
认证配置
# ceph.conf 认证配置
[global]
auth_cluster_required = cephx # 集群内部认证(MON/OSD/MGR 间)
auth_service_required = cephx # 服务端认证(OSD 间通信)
auth_client_required = cephx # 客户端认证
用户与密钥管理
# 列出所有用户
ceph auth ls
# 查看用户详情
ceph auth get client.admin
# 创建新用户(最小权限原则)
ceph auth get-or-create client.monitor-user \
mon 'allow r' \
osd 'allow r' \
mgr 'allow r'
# 创建 RBD 专用用户
ceph auth get-or-create client.rbd-user \
mon 'profile rbd' \
osd 'profile rbd pool=mypool' \
mgr 'profile rbd pool=mypool'
# 创建 CephFS 专用用户
ceph auth get-or-create client.cephfs-user \
mon 'allow r' \
mds 'allow rw path=/myfs/data' \
osd 'allow rw pool=cephfs-data' \
mgr 'allow r'
# 导出密钥文件
ceph auth get-or-create client.myuser > /etc/ceph/ceph.client.myuser.keyring
# 修改用户权限
ceph auth caps client.myuser \
mon 'allow r' \
osd 'allow rw pool=mypool'
# 删除用户
ceph auth del client.myuser
能力(Capabilities)详解
| 能力类型 | 权限 | 说明 |
|---|---|---|
| mon | allow r | 读取 Monitor 信息 |
| mon | allow rw | 读写 Monitor 信息 |
| mon | allow * | 完全控制 Monitor |
| osd | allow r | 读取所有 OSD |
| osd | allow rw pool=mypool | 读写指定池 |
| osd | allow rwx pool=mypool | 完全控制指定池 |
| osd | profile rbd | RBD 标准权限 |
| osd | profile rbd pool=mypool | 指定池的 RBD 权限 |
| mds | allow * | 完全控制 MDS |
| mds | allow rw path=/myfs/data | 指定路径的读写权限 |
| mgr | allow r | 读取 MGR 信息 |
| mgr | profile rbd | RBD MGR 权限 |
业务场景:多租户用户隔离
# 为不同租户创建隔离的用户和池
# 租户 A
ceph osd pool create tenant-a-pool 128 128 replicated
ceph auth get-or-create client.tenant-a \
mon 'allow r' \
osd 'allow rw pool=tenant-a-pool'
# 租户 B
ceph osd pool create tenant-b-pool 128 128 replicated
ceph auth get-or-create client.tenant-b \
mon 'allow r' \
osd 'allow rw pool=tenant-b-pool'
# 测试隔离性
# tenant-a 用户无法访问 tenant-b-pool
ceph --id tenant-a -p tenant-b-pool ls # 应该失败
12.3 传输加密(Messenger v2)
Ceph 从 Nautilus 版本开始支持 Messenger v2 协议,提供传输层加密。
启用 Messenger v2
# ceph.conf 配置
[global]
ms_cluster_mode = secure # 集群内部通信加密
ms_service_mode = secure # OSD 间通信加密
ms_client_mode = secure # 客户端通信加密
# 或只加密客户端通信
ms_client_mode = secure
ms_cluster_mode = crc # 集群内部用 CRC(性能更好)
ms_service_mode = crc
启用 TLS
# 使用 Ceph 内置的 TLS
ceph config set global ms_cluster_mode secure
ceph config set global ms_service_mode secure
ceph config set global ms_client_mode secure
# 查看 Messenger 版本
ceph daemon mon.node1 config show | grep ms_type
# 输出: "ms_type": "async+posix"
# 重启所有服务使配置生效
ceph orch restart mon
ceph orch restart osd
注意事项
| 事项 | 说明 |
|---|---|
| 性能影响 | 启用加密会增加约 5-10% 的 CPU 开销 |
| 版本要求 | Ceph Nautilus 14.2.0+ |
| 兼容性 | 所有节点必须支持 Messenger v2 |
| 证书管理 | Ceph 自动管理证书,无需手动配置 |
12.4 静态数据加密
使用 dm-crypt 加密 OSD
# 在创建 OSD 时启用加密
# cephadm 方式
ceph orch daemon add osd node1:/dev/sdb --dmcrypt
# ceph-volume 方式
ceph-volume lvm create --data /dev/sdb --dmcrypt
# 批量部署加密 OSD
ceph orch apply osd --all-available-devices --dmcrypt
# 验证加密状态
ceph-volume lvm list
# 输出中应显示 encrypted=true
加密密钥管理
# dm-crypt 密钥存储在 Monitor 中
# 查看加密密钥
ceph config-key list | grep dm-crypt
# 导出密钥(用于灾难恢复)
ceph config-key get dm-crypt/osd/osd.5/luks | base64 -d > /backup/osd5-luks-key.bin
# 备份所有加密密钥
for osd_id in $(ceph osd ls); do
ceph config-key get dm-crypt/osd/osd.${osd_id}/luks | base64 -d > /backup/osd${osd_id}-luks-key.bin
done
警告:
- 加密密钥丢失意味着数据永久不可恢复
- 务必备份密钥到安全位置
- 建议使用外部密钥管理系统(Vault 等)
12.5 RGW 安全配置
HTTPS 配置
# 生成 SSL 证书
openssl req -new -x509 -nodes -days 3650 \
-keyout /etc/ceph/rgw.key \
-out /etc/ceph/rgw.crt \
-subj "/CN=rgw.example.com"
# 配置 RGW 使用 HTTPS
ceph config set client.rgw rgw_frontends "beast ssl_port=443 ssl_certificate=/etc/ceph/rgw.crt ssl_private_key=/etc/ceph/rgw.key"
# 重启 RGW
ceph orch restart rgw
S3 服务端加密(SSE)
# 启用 RGW 服务端加密
ceph config set client.rgw rgw_crypt_default_encryption_key <base64-key>
# 使用 KMS 加密(如 Vault)
ceph config set client.rgw rgw_crypt_vault_auth token
ceph config set client.rgw rgw_crypt_vault_addr https://vault.example.com:8200
ceph config set client.rgw rgw_crypt_vault_secret_engine transit
ceph config set client.rgw rgw_crypt_vault_prefix /v1/transit
RGW 用户配额
# 设置用户存储配额
radosgw-admin quota set --quota-scope=user --uid=myuser --max-size=100G
radosgw-admin quota set --quota-scope=user --uid=myuser --max-objects=100000
radosgw-admin quota enable --quota-scope=user --uid=myuser
# 设置桶配额
radosgw-admin quota set --quota-scope=bucket --uid=myuser --max-size=10G
radosgw-admin quota set --quota-scope=bucket --uid=myuser --max-objects=10000
radosgw-admin quota enable --quota-scope=bucket --uid=myuser
12.6 Dashboard 安全
# 设置强密码
ceph dashboard set-login-credentials admin 'MyStr0ng!P@ssw0rd'
# 启用 SSL
ceph dashboard create-self-signed-cert
# 配置 RBAC 角色
ceph dashboard ac-role-create readonly
ceph dashboard ac-role-add-scope-perms readonly cephfs read
ceph dashboard ac-role-add-scope-perms readonly pool read
ceph dashboard ac-role-add-scope-perms readonly osd read
ceph dashboard ac-role-add-scope-perms readonly rgw read
# 创建只读用户
ceph dashboard ac-user-create viewer 'Read0nly!' readonly
# 查看所有用户
ceph dashboard ac-user-show
12.7 防火墙配置
# Ceph 需要开放的端口
# Monitor: 3300 (v2), 6789 (v1)
# OSD: 6800-7300
# MGR: 9283 (prometheus), 8443 (dashboard), 9287 (prometheus metrics)
# RGW: 80/443
# MDS: 6800+
# iptables 规则示例
# 允许集群网络
iptables -A INPUT -s 10.10.10.0/24 -j ACCEPT
# 允许公共网络访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6789 -j ACCEPT # MON
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6800:7300 -j ACCEPT # OSD
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT # RGW
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 8443 -j ACCEPT # Dashboard
# firewalld (RHEL/CentOS)
firewall-cmd --permanent --zone=trusted --add-source=10.10.10.0/24
firewall-cmd --permanent --add-port=6789/tcp
firewall-cmd --permanent --add-port=6800-7300/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8443/tcp
firewall-cmd --reload
12.8 安全审计
# 启用 Ceph 审计日志
ceph config set global log_to_stderr true
ceph config set mon audit_log_to_stderr true
# 查看审计日志
tail -f /var/log/ceph/ceph.audit.log
# Dashboard 操作审计
ceph dashboard audit-log-get
12.9 安全加固 Checklist
| 项目 | 优先级 | 状态 |
|---|---|---|
| 启用 CephX 认证 | 高 | ☐ |
| 最小权限原则配置用户 | 高 | ☐ |
| 启用 Messenger v2 传输加密 | 中 | ☐ |
| OSD 静态数据加密(敏感数据) | 中 | ☐ |
| Dashboard 启用 HTTPS | 高 | ☐ |
| Dashboard 配置强密码 | 高 | ☐ |
| RGW 启用 HTTPS | 高 | ☐ |
| 防火墙配置 | 高 | ☐ |
| 定期轮换密钥 | 中 | ☐ |
| 备份加密密钥 | 高 | ☐ |
| 审计日志启用 | 中 | ☐ |
| 禁用默认 admin 用户(生产环境) | 中 | ☐ |
扩展阅读
下一章:13 - 扩容与缩容 — 学习在线添加/移除 OSD、集群扩容和数据再平衡。