注意
本文档适用于 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_a 的 bar 目录,请运行以下命令
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_a 的 bar 目录中创建或删除快照
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"
使用 someuser 将 cephfs1 挂载到已创建的挂载点 /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=0 或 gid=0 的客户端执行写访问操作(例如 rm、rmdir、rmsnap、mkdir 和 mksnap)。此模式允许根客户端进行读取操作,这与其他文件系统的行为不同。
这是一个在文件系统中启用 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"