强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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)详解

能力类型权限说明
monallow r读取 Monitor 信息
monallow rw读写 Monitor 信息
monallow *完全控制 Monitor
osdallow r读取所有 OSD
osdallow rw pool=mypool读写指定池
osdallow rwx pool=mypool完全控制指定池
osdprofile rbdRBD 标准权限
osdprofile rbd pool=mypool指定池的 RBD 权限
mdsallow *完全控制 MDS
mdsallow rw path=/myfs/data指定路径的读写权限
mgrallow r读取 MGR 信息
mgrprofile rbdRBD 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 用户(生产环境)

扩展阅读

  1. CephX 认证文档
  2. Messenger v2 配置
  3. dm-crypt 加密
  4. RGW 服务端加密

下一章13 - 扩容与缩容 — 学习在线添加/移除 OSD、集群扩容和数据再平衡。