发布于: Nov 30, 2022

【概要】EFS 在 NFS 文件权限控制的基础上,结合安全组 (Security Group),身份与访问管理服务 (IAM) 和 EFS 独特的接入点 (Access Point) 机制,简化权限控制的配置工作,并进行细粒度的权限管理和审计。

接下来我们再看一下,如何进一步对 NFS 客户端进行权限的控制,包括限制操作系统用户身份和限制可访问的文件系统路径等。这里会使用到 EFS 的接入点 (Access Points) 设置。

接着上面的例子,假设我们希望这个管理节点的 EC2 实例,在写入 EFS 文件系统时,强制使用操作系统用户 id 为 1003, 用户组 id 也为 1003, 同时限制这个用户只能往 /data 目录下面进行数据写入。那我们可以配置如下的接入点:

在这个接入点配置里,我们设置了:

  • POSIX 用户: 这里我们可以设置通过该接入点访问时,强制使用的操作系统用户 ID /组 ID。本示例中我们使用了用户 ID 和组 ID 均为 1003,以便与现有操作系统用户区分。
  • 目录:这里我们可以设置通过接入点访问时做为根目录的路径,如果该目录不存在,则在第一次通过接入点访问时 EFS 会自动创建。如果不指定则默认使用文件系统根目录。本示例中我们指定了/data 做为根目录
  • 拥有者用户与权限:这里我们可以设置根目录拥有者的用户 ID 和组 ID,同时我们也可以指定这个根目录的权限。本示例我们指定拥有者用户 ID 和组 ID 均为 1003,权限是 755

接着我们需要修改管理员所使用的 IAM 角色 (即 FSWrite) 的策略,限制其只能通过该接入点访问时才赋予写权限:

{
    "Version": "2012-10-17",
    "Id": "efsid",
    "Statement": [
        {
            "Sid": "efssid",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientRootAccess"
            ],
            "Resource": "arn:aws-cn:elasticfilesystem:cn-northwest-1:402202783068:file-system/fs-57789eb2",
            "Condition": {
                "StringEquals": {
                    "elasticfilesystem:AccessPointArn": "arn:aws-cn:elasticfilesystem:cn-northwest-1:402202783068:access-point/fsap-068adf52269d7df77"
                }
            }
        }
    ]
}

可以看到这个策略修改的地方是最后的 ”Condition” 段,增加了指定接入点 ARN 为 fsap-068adf52269d7df77 。

接下来我们在管理节点的 EC2 实例(附加了 FSWrite 角色)上,通过这个接入点进行挂载,挂载时需要使用 -o tls, iam,- accesspoint 参数指定接入点,启用 TLS 和 IAM 权限认证:

$ sudo mount -t efs fs-57789eb2:/ -o tls,iam,accesspoint=fsap-068adf52269d7df77 /mnt/efs

接入我们进行写入测试:

$ touch /mnt/efs/test1
$ ls -l /mnt/efs/test1
-rw-rw-r-- 1 1003 1003 0 Feb  7 13:25 /mnt/efs/test1
$ id
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)

可以看到我们获得了写入权限,同时写入的文件所有者用户 ID 和组 ID 均为接入点所指定的 1003,而不是当前命令行的用户 id 1000

注意到我们角色的策略里虽然赋予了 Rootaccess 的权限,但此时即使客户端使用 root 用户发起请求,EFS 还是会以接入点的用户 id 为准:

$ sudo touch /mnt/efs/test2
$ ls -l /mnt/efs/test2
-rw-rw-r-- 1 1003 1003 0 Feb  7 14:47 /mnt/efs/test2

接下来我们检查接入点是否指定了/data 做为根目录。我们重新挂载文件系统,这次挂载不使用任何接入点:

$ sudo umount /mnt/efs
$ sudo mount -t efs fs-57789eb2:/ /mnt/efs

检查相关的目录和文件:

$ ls -l /mnt/efs/data
total 8
-rw-rw-r-- 1 1003 1003 0 Feb  7 13:25 test1
-rw-rw-r-- 1 1003 1003 0 Feb  7 14:47 test2

可以看到/data 目录被自动创建出来,刚才通过接入点挂载后创建的文件 test1 和 test2 也在其中。

接下来我们检查,如果不通过这个接入点,我们是否还可以通过 IAM 角色 FSWrite 获取写入权限:

$ sudo umount /mnt/efs
$ sudo mount -t efs fs-57789eb2:/ -o tls,iam /mnt/efs
$ touch /mnt/efs/test2
touch: cannot touch '/mnt/efs/test2': Read-only file system

可以看到不通过这个接入点访问时,这个角色 (FSWrite) 也就没有对文件系统的写入权限。

上述示例可以看到,通过将 IAM 策略与接入点进行结合,我们可以更细粒度的进行 NFS 客户端的权限设置,以便满足日常管理维护的安全需求。

 

通过上面的演示,我们可以看到,EFS 在 NFS 文件权限控制的基础上,结合安全组 (Security Group),身份与访问管理服务 (IAM) 和 EFS 独特的接入点 (Access Point) 机制,简化权限控制的配置工作,并进行细粒度的权限管理和审计。

 

相关文章