注意

本文档适用于 Ceph 的开发版本。

CephFS 客户端功能

Ceph 身份验证功能用于将 CephFS 客户端限制在必要的最低权限级别。

注意

路径限制和布局修改限制是在 Ceph 的 Jewel 版本中引入的。

注意

使用纠删码 (EC) 池与 CephFS 仅在 BlueStore 支持。纠删码池不能用作元数据池。必须在纠删码数据池上启用覆盖。

路径限制

默认情况下,客户端在允许挂载的路径上没有限制。当客户端挂载子目录(例如 /home/user)时,MDS 默认不会验证后续操作是否被“锁定”在该目录内。

要限制客户端使其只能挂载和工作在某个特定目录内,请使用基于路径的 MDS 身份验证功能。

此限制影响文件系统层次结构,换句话说,即由 MDS 管理的元数据树。客户端仍然能够直接访问 RADOS 中的底层文件数据。要完全隔离客户端,请将不受信任的客户端隔离在自己的 RADOS 命名空间中。您可以使用 文件布局 将客户端的文件系统子树放置在特定的命名空间中,然后使用 OSD 功能 将其 RADOS 访问权限限制在该命名空间内。

语法

要仅授予对指定目录的 rw 访问权限,请在为客户端创建密钥时提及指定目录。使用以下形式的命令

ceph fs authorize <fs_name> client.<client_id> <path-in-cephfs> rw

例如,要限制名为 foo 的客户端,使其只能写入文件系统 cephfs_abar 目录,请运行以下命令

ceph fs authorize cephfs_a client.foo / r /bar rw

结果如下

client.foo
  key: *key*
  caps: [mds] allow r, allow rw path=/bar
  caps: [mon] allow r
  caps: [osd] allow rw tag cephfs data=cephfs_a

要将客户端完全限制在 bar 目录,请省略根目录

ceph fs authorize cephfs_a client.foo /bar rw

如果客户端的读取访问权限被限制为某个路径,则客户端只能通过在挂载命令中指定可读路径来挂载文件系统(见下文)。

提供 all* 作为文件系统名称将授予对所有文件系统的访问权限。通常需要引用 * 以防止 shell 解析。

有关用户管理的更多信息,请参阅 用户管理 - 将用户添加到密钥环

要将客户端仅限制在指定的子目录,请在挂载时提及指定的目录。使用以下形式的命令

ceph-fuse -n client.<client_id> <mount-path> -r *directory_to_be_mounted*

例如,要将客户端 foo 限制在 mnt/bar 目录,请使用以下命令

ceph-fuse -n client.foo mnt -r /bar

报告可用空间

当客户端挂载子目录时,已用空间(df)是根据该子目录上的配额计算的,而不是根据 CephFS 文件系统上使用的总空间量计算的。

要使客户端报告文件系统的总使用量,而不仅仅是挂载子目录上的配额使用量,请在客户端上设置以下配置选项

client quota df = false

如果未启用配额,或者未在挂载的子目录上设置配额,则无论此设置的值如何,都将报告文件系统的总使用量。

布局和配额限制(“p”标志)

要设置布局或配额,客户端除了 rw 之外还需要 p 标志。将 p 标志与 rw 一起使用会限制通过使用 ceph. 前缀的特殊扩展属性设置的所有属性,并限制设置这些字段的其他方式(例如带有布局的 openc 操作)。

例如,在以下代码片段中,client.0 可以修改文件系统 cephfs_a 上的布局和配额,但 client.1 不能

client.0
    key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
    caps: [mds] allow rwp
    caps: [mon] allow r
    caps: [osd] allow rw tag cephfs data=cephfs_a

client.1
    key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
    caps: [mds] allow rw
    caps: [mon] allow r
    caps: [osd] allow rw tag cephfs data=cephfs_a

快照限制(“s”标志)

要创建或删除快照,客户端除了 rw 之外还需要 s 标志。请注意,当能力字符串也包含 p 标志时,s 标志必须出现在它之后(除 rw 之外的所有标志必须按字母顺序指定)。

例如,在以下代码片段中,client.0 可以在文件系统 cephfs_abar 目录中创建或删除快照

client.0
    key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
    caps: [mds] allow rw, allow rws path=/bar
    caps: [mon] allow r
    caps: [osd] allow rw tag cephfs data=cephfs_a

网络限制

client.foo
  key: *key*
  caps: [mds] allow r network 10.0.0.0/8, allow rw path=/bar network 10.0.0.0/8
  caps: [mon] allow r network 10.0.0.0/8
  caps: [osd] allow rw tag cephfs data=cephfs_a network 10.0.0.0/8

可选的 {network/prefix} 是 CIDR 表示法中的标准网络名称和前缀长度(例如,10.3.0.0/16)。如果存在 {network/prefix}},则此功能的使用仅限于从该网络连接的客户端。

文件系统信息限制

监视器集群可以呈现可用文件系统的有限视图。在这种情况下,监视器集群仅向管理员指定的客户端报告文件系统。其他文件系统不会被报告,并且影响它们的命令会失败,就像文件系统不存在一样。

考虑以下示例。Ceph 集群有 2 个文件系统

ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
name: cephfs2, metadata pool: cephfs2_metadata, data pools: [cephfs2_data ]

我们只为客户端 someuser 授权一个文件系统

ceph fs authorize cephfs client.someuser / rw
[client.someuser]
    key = AQAmthpf89M+JhAAiHDYQkMiCq3x+J0n9e8REQ==
cat ceph.client.someuser.keyring
[client.someuser]
    key = AQAmthpf89M+JhAAiHDYQkMiCq3x+J0n9e8REQ==
    caps mds = "allow rw fsname=cephfs"
    caps mon = "allow r fsname=cephfs"
    caps osd = "allow rw tag cephfs data=cephfs"

客户端只能看到它被授权查看的文件系统

ceph fs ls -n client.someuser -k ceph.client.someuser.keyring
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

始终显示备用 MDS 守护程序。有关受限 MDS 守护程序和文件系统的信息可能通过其他方式提供,例如运行 ceph health detail

MDS 通信限制

默认情况下,用户应用程序可以与任何 MDS 通信,无论它们是否被允许修改关联文件系统上的数据(请参阅上面的路径限制)。客户端通信可以通过为特定文件系统添加 MDS 功能来限制为与该特定文件系统关联的 MDS 守护程序。考虑以下示例,其中 Ceph 集群有两个文件系统

ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
name: cephfs2, metadata pool: cephfs2_metadata, data pools: [cephfs2_data ]

客户端 someuser 只被授权一个文件系统

ceph fs authorize cephfs client.someuser / rw
[client.someuser]
    key = AQBPSARfg8hCJRAAEegIxjlm7VkHuiuntm6wsA==
ceph auth get client.someuser > ceph.client.someuser.keyring
exported keyring for client.someuser
cat ceph.client.someuser.keyring
[client.someuser]
    key = AQBPSARfg8hCJRAAEegIxjlm7VkHuiuntm6wsA==
    caps mds = "allow rw fsname=cephfs"
    caps mon = "allow r"
    caps osd = "allow rw tag cephfs data=cephfs"

使用 someusercephfs1 挂载到已创建的挂载点 /mnt/cephfs1 上可以工作

sudo ceph-fuse /mnt/cephfs1 -n client.someuser -k ceph.client.someuser.keyring --client-fs=cephfs

注意

如果在运行上述命令之前 /mnt/cephfs 不存在,请通过运行 mkdir /mnt/cephfs1 创建它。

ceph-fuse[96634]: starting ceph client
ceph-fuse[96634]: starting fuse
mount | grep ceph-fuse
ceph-fuse on /mnt/cephfs1 type fuse.ceph-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

使用 someuser 挂载 cephfs2 不会工作

sudo ceph-fuse /mnt/cephfs2 -n client.someuser -k ceph.client.someuser.keyring --client-fs=cephfs2
ceph-fuse[96599]: starting ceph client
ceph-fuse[96599]: ceph mount failed with (1) Operation not permitted

Root squash

实现 root squash 功能是一种安全措施,用于防止诸如意外强制删除路径(例如 sudo rm -rf /path)之类的情况。在 MDS 功能中启用 root_squash 模式,以禁止 uid=0gid=0 的客户端执行写访问操作(例如 rmrmdirrmsnapmkdirmksnap)。此模式允许根客户端进行读取操作,这与其他文件系统的行为不同。

这是一个在文件系统中启用 root_squash 的示例,但文件系统中的 /volumes 目录树除外

ceph fs authorize a client.test_a / rw root_squash /volumes rw
ceph auth get client.test_a
[client.test_a]
    key = AQBZcDpfEbEUKxAADk14VflBXt71rL9D966mYA==
    caps mds = "allow rw fsname=a root_squash, allow rw fsname=a path=/volumes"
    caps mon = "allow r fsname=a"
    caps osd = "allow rw tag cephfs data=a"

使用 fs authorize 更新功能

从 Ceph 的 Reef 版本开始,可以使用 fs authorize 为现有客户端添加新功能(用于另一个 CephFS 或同一文件系统中的另一个路径)。

以下示例演示了两次运行命令 ceph fs authorize a client.x / rw 导致的行为。

  1. 创建新客户端

    ceph fs authorize a client.x / rw
    
    [client.x]
        key = AQAOtSVk9WWtIhAAJ3gSpsjwfIQ0gQ6vfSx/0w==
    
  2. 获取客户端功能

    ceph auth get client.x
    
    [client.x]
          key = AQAOtSVk9WWtIhAAJ3gSpsjwfIQ0gQ6vfSx/0w==
          caps mds = "allow rw fsname=a"
          caps mon = "allow r fsname=a"
          caps osd = "allow rw tag cephfs data=a"
    
  3. 以前,第二次运行 fs authorize a client.x / rw 会打印错误消息。在 Reef 版本和更高版本中,此命令会打印一条消息,报告功能未更新

    ./bin/ceph fs authorize a client.x / rw
    
    no update for caps of client.x
    

使用 fs authorize 添加新功能

为同一 CephFS 中的另一个路径添加功能

ceph fs authorize a client.x /dir1 rw
updated caps for client.x
ceph auth get client.x
[client.x]
        key = AQAOtSVk9WWtIhAAJ3gSpsjwfIQ0gQ6vfSx/0w==
        caps mds = "allow r fsname=a, allow rw fsname=a path=some/dir"
        caps mon = "allow r fsname=a"
        caps osd = "allow rw tag cephfs data=a"

为 Ceph 集群上的另一个 CephFS 添加功能

ceph fs authorize b client.x / rw
updated caps for client.x
ceph auth get client.x
[client.x]
        key = AQD6tiVk0uJdARAABMaQuLRotxTi3Qdj47FkBA==
        caps mds = "allow rw fsname=a, allow rw fsname=b"
        caps mon = "allow r fsname=a, allow r fsname=b"
        caps osd = "allow rw tag cephfs data=a, allow rw tag cephfs data=b"

更改 caps 中的 rw 权限

只有在必须更改读/写权限的情况下,才能通过运行 fs authorize 来修改功能。这是因为命令 fs authorize 变得模糊不清。例如,用户运行 fs authorize cephfs1 client.x /dir1 rw 来创建客户端,然后运行 fs authorize cephfs1 client.x /dir2 rw(注意 /dir1 已更改为 /dir2)。运行第二个命令可能被解释为将 /dir1 更改为 /dir2 并具有当前功能,或者可能被解释为为路径 /dir2 授权新功能。如前所述,选择了第二种解释,因此除了 rw 权限之外,无法更新已授予功能的一部分。以下显示了如何更改 client.x 的读/写权限

ceph fs authorize a client.x / r
 [client.x]
     key = AQBBKjBkIFhBDBAA6q5PmDDWaZtYjd+jafeVUQ==
ceph auth get client.x
[client.x]
        key = AQBBKjBkIFhBDBAA6q5PmDDWaZtYjd+jafeVUQ==
        caps mds = "allow r fsname=a"
        caps mon = "allow r fsname=a"
        caps osd = "allow r tag cephfs data=a"

fs authorize 永远不会扣除 caps 的任何部分

已授予客户端的功能不能通过再次运行 fs authorize 来删除。例如,如果客户端功能在某个 CephFS 上应用了 root_squash,则再次为同一 CephFS 运行 fs authorize 但没有 root_squash 将不会导致任何更新,并且客户端功能将保持不变

ceph fs authorize a client.x / rw root_squash
[client.x]
        key = AQD61CVkcA1QCRAAd0XYqPbHvcc+lpUAuc6Vcw==
ceph auth get client.x
[client.x]
        key = AQD61CVkcA1QCRAAd0XYqPbHvcc+lpUAuc6Vcw==
        caps mds = "allow rw fsname=a root_squash"
        caps mon = "allow r fsname=a"
        caps osd = "allow rw tag cephfs data=a"
ceph fs authorize a client.x / rw
[client.x]
        key = AQD61CVkcA1QCRAAd0XYqPbHvcc+lpUAuc6Vcw==
no update was performed for caps of client.x. caps of client.x remains unchanged.

如果客户端已经拥有文件系统名称 a 和路径 dir1 的功能,则再次为 FS 名称 a 但路径 dir2 运行 fs authorize,将授予 dir2 的新功能,而不是修改客户端已有的功能

ceph fs authorize a client.x /dir1 rw
ceph auth get client.x
[client.x]
        key = AQC1tyVknMt+JxAAp0pVnbZGbSr/nJrmkMNKqA==
        caps mds = "allow rw fsname=a path=/dir1"
        caps mon = "allow r fsname=a"
        caps osd = "allow rw tag cephfs data=a"
ceph fs authorize a client.x /dir2 rw
updated caps for client.x
ceph auth get client.x
[client.x]
        key = AQC1tyVknMt+JxAAp0pVnbZGbSr/nJrmkMNKqA==
        caps mds = "allow rw fsname=a path=dir1, allow rw fsname=a path=dir2"
        caps mon = "allow r fsname=a"
        caps osd = "allow rw tag cephfs data=a"

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入