欢迎光临
我们一直在努力

Ceph 分布式存储安全实践:cephx 协议、密钥环与精细化访问权限配置

Ceph 分布式存储 认证和授权管理

摘要:本文全面介绍了Ceph分布式存储系统的认证和授权管理机制。首先详细讲解了Ceph集群身份验证的cephx协议工作原理、账户命名规则、密钥环文件管理以及用户身份指定方法。接着系统阐述了用户账户的创建、查看、删除、导出导入等管理操作。最后深入探讨了用户账户功能配置,包括权限功能定义、预定义功能配置文件使用,以及如何通过池、命名空间、对象前缀、文件路径和命令限制等方式精细控制访问范围。文章通过丰富的命令行示例和实践案例,帮助读者全面掌握Ceph安全管理的核心概念和实际操作。

Ceph 集群身份验证

cephx 协议

Ceph 存储使用 cephx 协议管理集群认证。

Ceph 中用户帐户用途:

  • Ceph 守护进程之间的内部通信。
  • 客户通通过 librados 库访问集群。
  • 集群管理。

账户名称

  • Ceph 守护进程使用的帐户与守护进程名称相匹配,例如 osd.1 或 mgr.ceph1,并在安装期间创建。
  • 使用 librados 的客户端应用所用帐户的名称具有 client. 前缀。例如:
    • 将 OpenStack 与 Ceph 集成时,常常会创建专用的 client.openstack 用户帐户。
    • 对于 Ceph 对象网关,安装过程会创建专用的 client.rgw.hostname 用户帐户。
  • 安装程序会创建超级用户帐户 client.admin,该帐户具有访问所有内容及修改集群配置的能力。运行ceph相关命令时,Ceph 默认使用 client.admin 帐户,除非用户通过 –name 或 –id 选项明确指定了其他用户名。

可以设置 CEPH_ARGS 环境变量来定义用户名称或用户 ID 等参数。 示例:

# export CEPH_ARGS="–id laogao"

应用的最终用户不在 Ceph 集群中拥有帐户。最终用户访问应用,然后由应用代表他们访问 Ceph。从 Ceph 角度来看,应用就是客户端。应用可能会通过其他机制提供自己的用户身份验证。 在这里插入图片描述 Ceph 对象网关有自己的用户数据库来验证 Amazon S3 或 Swift 用户的身份,Ceph 对象网关使用client.rgw.hostname 帐户来访问集群。

密钥环文件

Ceph 创建用户帐户时,为每个用户帐户生成密钥环文件,通过密钥环文件验证用户身份,必须将此文件复制到客户端系统或应用服务器上。

Ceph 根据 /etc/ceph/ceph.conf 配置文件中的 keyring 参数查找密钥环文件,默认值为/etc/ceph/

c

l

u

s

t

e

r

.

cluster.

cluster.name.keyring。例如,对于 client.openstack 帐户,其密钥环文件为 /etc/ceph/ceph.client.openstack.keyring。

密钥环文件以纯文本形式存储机密密钥,因此需要使用适当的 Linux 文件权限来保护文件,仅允许授权的Linux 用户访问。仅将 Ceph 用户的密钥环文件部署到需要用它进行身份验证的系统上。

指定用户身份

ceph、rados 和 rbd 等命令行工具,通过 –id 和 –keyring 选项指定要使用的用户帐户和密钥环文件。 未指定时,命令会以 client.admin 用户进行身份验证。

示例:ceph 命令会以 client.operator3 进行身份验证并列出可用池。

# ceph –id operator3 osd lspools

  • 使用 –id 选项,不要添加 client. 前缀。
  • 使用 –name 选项,需要 client. 前缀。
  • 如果密钥环文件存储在默认的位置,则用户不需要 –keyring 选项。cephadm shell 会自动从 /etc/ceph/ 目录挂载密钥环。

Cephx 协议通信原理

Cephx 协议使用共享机密密钥加密通信。简要通信过程如下:

  • 客户端向监控器请求会话密钥,同时传递共享秘钥给监视器。
  • 监视器使用客户端的共享机密密钥加密会话密钥,再将会话密钥提供给客户端。
  • 由客户端解密会话密钥,然后再从监控器请求票据,以便对集群守护进程进行身份验证。

Cephx 使用共享密钥进行身份验证, 客户端和MON群集都保存着共享秘钥副本。

Cephx 协议的认证流程:

  • client 向 MON 请求会话秘钥。
  • MON 创建会话秘钥,同时将产生的会话秘钥分享给 MDS 和 OSD。
  • MON 使用共享密钥加密会话密钥,并返回给 client。client 使用共享秘钥解密数据,获得会话密钥。 后续通信都使用会话秘钥进行加密和解密。
  • client 然后使用会话密钥加密会话,向 MON 请求票据数据。MON 使用会话密钥解密客户端请求,并创建 ticket,使用会话密钥加密返回给 client。client 使用会话密钥解密数据收到ticket。
  • client 使用ticket与MDS和OSD进行交互。由于client、MDS和OSD都拥有MON产生的秘钥,因此它们之间可以验证ticket是否合法。 在这里插入图片描述
  • 管理用户账户

    查看用户账户

    要列出现有用户帐户,可运行 ceph auth ls 或者 ceph auth list 命令。

    [root@ceph1 ~]# ceph auth list
    osd.0
    key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    caps: [mgr] allow profile osd
    caps: [mon] allow profile osd
    caps: [osd] allow *
    ......

    要获取特定帐户的详细信息,可使用 ceph auth get 命令。

    [root@ceph1 ~]# ceph auth get osd.0
    [osd.0]
    key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    caps mgr = "allow profile osd"
    caps mon = "allow profile osd"
    caps osd = "allow *"
    exported keyring for osd.0

    要获取特定帐户的key内容,可使用命令:

    • ceph auth get-key
    • ceph auth print-key
    • ceph auth print_key

    [root@ceph1 ~]# ceph auth get-key osd.0
    AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    [root@ceph1 ~]# ceph auth print-key osd.0
    AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    [root@ceph1 ~]# ceph auth print_key osd.0
    AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==

    创建用户账户

    要创建用户帐户,可使用命令:

    • ceph auth add
    • ceph auth get-or-create
    • ceph auth get-or-create-key

    [root@ceph1 ~]# ceph auth add client.app1
    added key for client.app1

    [root@ceph1 ~]# ceph auth get-or-create client.app2
    [client.app2]
    key = AQC2vKZoZQzOCRAAWn6PfXhyMxh3/i4KTTvKQg==

    [root@ceph1 ~]# ceph auth get-or-create-key client.app3
    AQDFvKZoF8/iDxAAV7gMq2lnCQcLs9NAQGH5Kg==

    还可以在创建用户账户的时候,赋予用户账户权限。 赋予用户账户权限,稍后讲解。

    [root@ceph1 ~]# ceph auth add client.app4 mon 'allow r'
    added key for client.app4

    删除用户账户

    要创建用户帐户,可使用命令:

    • ceph auth del
    • ceph auth rm

    [root@ceph1 ~]# ceph auth del client.app3
    updated

    [root@ceph1 ~]# ceph auth rm client.app2
    updated

    [root@ceph1 ~]# ceph auth ls | grep client.app
    installed auth entries:
    client.app1
    client.app4

    导出和导入用户账户

    要导出特定帐户的详细信息,可使用命令:

    • ceph auth export -o
    • ceph auth get -o

    [root@ceph1 ~]# ceph auth export osd.0 -o ceph.osd.0.keyring.1
    export auth(key=AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==)

    [root@ceph1 ~]# cat ceph.osd.0.keyring.1
    [osd.0]
    key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    caps mgr = "allow profile osd"
    caps mon = "allow profile osd"
    caps osd = "allow *"

    [root@ceph1 ~]# ceph auth get osd.0 -o ceph.osd.0.keyring.2
    exported keyring for osd.0

    [root@ceph1 ~]# cat ceph.osd.0.keyring.2
    [osd.0]
    key = AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    caps mgr = "allow profile osd"
    caps mon = "allow profile osd"
    caps osd = "allow *"

    要导入特定帐户的详细信息,可使用 ceph auth import -i 命令。

    # 先导出client.app4然后删除client.app4
    [root@ceph1 ~]# ceph auth export client.app4 -o ceph.client.app4.keyring
    export auth(key=AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==)
    [root@ceph1 ~]# ceph auth rm client.app4
    updated
    [root@ceph1 ~]# ceph auth get client.app4
    Error ENOENT: failed to find client.app4 in keyring
    # 将刚才删除的client.app4导入观察现象
    [root@ceph1 ~]# ceph auth import -i ceph.client.app4.keyring
    imported keyring
    [root@ceph1 ~]# ceph auth get client.app4
    [client.app4]
    key = AQDnvKZoY7irCRAA5ap2HQ1nQ2ADHSJRJWtczw==
    caps mon = "allow r"
    exported keyring for client.app4

    配置用户账户功能

    用户账户功能

    cephx 中的权限称为功能,使用功能来限制或提供对池中数据、池的命名空间或一组池的访问权限。功能还允许集群中的守护进程之间互相交互。通过守护进程类型(mon、osd、mgr 或 mds)来授予它们。

    在 cephx 内,对于每个守护进程类型来说,都有多项功能可用:

    • allow,在守护进程的访问权限之前设置。
    • r,授予读取访问权限。每一用户帐户至少应在监控器上具有读取访问权限,以便能够检索 CRUSH 映射。
    • w,授予写入访问权限。客户端需要写入访问权限以在 OSD 上存储和修改对象。对于管理器 (MGR),w 授予启用或禁用模块的权限。
    • x,授予执行扩展对象类的权限。让用户能够调用类方法(即读取和写入)并对监控器执行身份验证操作。这使得客户端能够在对象上执行额外的操作,如使用 rados lock get 设置锁定或使用 rbd list 列出 RBD 镜像。
    • class-read ,让用户能够调用类读取方法。x 的子集。通常用在 RBD 池中。
    • class-write,让用户能够调用类写入方法。x 的子集。通常用在 RBD 池中。
    • *,授予完整访问权限。授予用户对特定守护进程或池的读取、写入和执行权限,并允许用户执行管理命令。

    要赋予用户帐户功能,可运行 ceph auth caps 命令,运行该命令前确保用户账户已创建。 示例:

    [root@ceph1 ~]# ceph auth add client.laogao
    added key for client.laogao
    [root@ceph1 ~]# ceph auth caps client.laogao mon 'allow r' osd 'allow rw'
    updated caps for client.laogao

    在创建用户账户时,直接赋予权限。

    [root@ceph1 ~]# ceph auth add client.laogao mon 'allow r' osd 'allow rw'

    用户账户功能配置文件

    创建用户帐户时,可使用cephx 预定义的功能配置文件:

    • 简化用户访问权限配置。
    • 实现守护进程之间的内部通信。
    • Ceph 会在内部定义这些文件,用户无法自行创建配置文件。

    cephx 预定义的部分功能配置文件如下:

    • osd,授予用户作为 OSD 连接其他 OSD 或监控器的权限, 以便 OSD 能够 处理复制心跳流量和状态报告。

    [root@ceph1 ~]# ceph auth get osd.1
    [osd.1]
    key = AQA8EqRoxyM2OBAAQuVUxOvvVZL7Ydg4niwLPQ==
    caps mgr = "allow profile osd"
    caps mon = "allow profile osd"
    caps osd = "allow *"
    exported keyring for osd.1

    • bootstrap-osd,授予用户引导 OSD 的权限,以便他们在引导 OSD 时具有添加密钥的权限。

    [root@ceph1 ~]# ceph auth get client.bootstrap-osd
    [client.bootstrap-osd]
    key = AQCgDqRoAD+sABAAP2icy5PAW2sgh8sU/An5Pw==
    caps mon = "allow profile bootstrap-osd"
    exported keyring for client.bootstrap-osd

    • rbd,授予用户读写访问 Ceph 块设备的权限。
    • rbd-read-only,授予用户只读访问 Ceph 块设备的权限。 示例:

    [root@ceph1 ~]# ceph auth add client.forrbd mon 'profile rbd' osd 'profile rbd'
    added key for client.forrbd

    [root@ceph1 ~]# ceph auth get client.forrbd
    [client.forrbd]
    key = AQDLwqZo4W28KxAA8onfLsxAxUvYt2cKq+comQ==
    caps mon = "profile rbd"
    caps osd = "profile rbd"
    exported keyring for client.forrbd

    限制访问范围

    • 池,限制用户只能访问他们需要的池。

    示例:

    [root@ceph1 ~]# ceph auth get-or-create client.formyapp1 mon 'allow r' osd 'allow rw pool=myapp'
    [client.formyapp1]
    key = AQAMxqZodL12BhAA0IyPEV6SqT+9cLpr+k1DPw==

    如果在配置功能时不指定池,则 Ceph 会将它们设置到所有现有的池。

    • 命名空间,限制用户帐户仅访问从属于特定命名空间中对象。 示例:

    [root@ceph1 ~]# ceph auth get-or-create client.formyapp2 mon 'allow r' osd 'allow rw namespace=photos'
    [client.formyapp2]
    key = AQA6xqZolcVtBxAAMGJtK4hes9LLfuwaoTnMFA==

    • 池和命名空间,限制用户帐户仅访问特定池中特定命名空间中对象。 示例:

    [root@ceph1 ~]# ceph auth get-or-create client.formyapp3 mon 'allow r' osd 'allow rw pool=myapp namespace=photos'
    [client.formyapp3]
    key = AQBmxqZo9uExExAAePkx63ERHvgGmMiEJd4GEg==

    • 对象名称前缀,限制用户帐户仅访问特定名称前缀的对象。 示例:

    [root@ceph1 ~]# ceph auth get-or-create client.formyapp4 mon 'allow r' osd 'allow rw object_prefix pref'
    [client.formyapp4]
    key = AQCYxqZorsmOHxAAlQMGO+Ouv719SN1/BLpy8w==

    • 文件路径,限制用户帐户仅访问 Ceph 文件系统 (CephFS) 中特定目录。 示例:

    # ceph fs authorize cephfs client.webdesigner /webcontent rw

    • monitor 命令,限制用户帐户只能使用一组特定的命令。 示例:

    [root@ceph1 ~]# ceph auth get-or-create client.operator1 mon 'allow r, allow command "auth get-or-create", allow command "auth list"'
    [client.operator1]
    key = AQDdxqZotZpCFRAAI1DFw519uGF/EbAF2KB6GQ==

    实践1:创建一个可执行ceph auth list的用户,并使用该用户执行该命令

    [root@ceph1 ~]# ceph auth get-or-create client.gaoqiaodong mon 'allow r,allow command "auth list"'
    [client.gaoqiaodong]
    key = AQCn56Zo8hxHFxAA1GnGWHE9RRGe6TnglJIoVg==

    [root@ceph1 ~]# ceph auth get client.gaoqiaodong -o /etc/ceph/ceph.client.gaoqiaodong.keyring
    exported keyring for client.gaoqiaodong

    [root@ceph1 ~]# ceph auth ls –id gaoqiaodong
    #执行等同于auth list的auth ls都不行
    Error EACCES: access denied

    [root@ceph1 ~]# ceph auth list –id gaoqiaodong
    osd.0
    key: AQA8EqRojLYOOBAAVprA9Rs0Gkg4zK0dKZUUrA==
    caps: [mgr] allow profile osd
    caps: [mon] allow profile osd
    caps: [osd] allow *
    ......

    实践2:通过client管理ceph client:

    [root@client ~]# mkdir /etc/ceph

    [root@client ~]# cat << 'EOF' > /etc/yum.repos.d/ceph.repo
    [Ceph]
    name=Ceph
    baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/storage/x86_64/ceph-pacific
    enabled=1
    gpgcheck=0
    EOF

    [root@client ~]# dnf install -y ceph-common

    ceph1:

    # 将/etc/ceph/ceph.client.admin.keyring拷贝到client
    [root@ceph1 ~]# scp /etc/ceph/ceph.client.admin.keyring root@client:/etc/ceph/
    # 将/etc/ceph.conf拷贝到cleint
    [root@ceph1 ~]# scp /etc/ceph/ceph.conf root@client:/etc/ceph/

    client:

    #查看 Ceph 集群整体运行状态
    [root@client ~]# ceph -s
    cluster:
    id: 2faf683a-7cbf-11f0-b5ba-000c29e0ad0e
    health: HEALTH_OK

    services:
    mon: 3 daemons, quorum ceph1.laogao.cloud,ceph2,ceph3 (age 3h)
    mgr: ceph2.oetbal(active, since 3h), standbys: ceph1.laogao.cloud.zoqmbt, ceph3.npaxvt
    osd: 9 osds: 9 up (since 3h), 9 in (since 2d)

    data:
    pools: 1 pools, 1 pgs
    objects: 0 objects, 0 B
    usage: 2.6 GiB used, 177 GiB / 180 GiB avail
    pgs: 1 active+clean

    赞(0)
    未经允许不得转载:171主机测评 » Ceph 分布式存储安全实践:cephx 协议、密钥环与精细化访问权限配置
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址