网络文件系统(NFS)级别用户、组和权限
创建文件系统后,默认情况下,只有根用户 (UID 0) 具有读取、写入和执行权限。为了让其他用户也能修改文件系统,根用户必须明确授予他们访问权限。您可以使用访问点自动创建非根用户可从中写入的目录。有关更多信息,请参阅 使用 Amazon EFS 接入点工作。
Amazon EFS 文件系统对象具有关联的 Unix 风格模式。此模式值定义了对该对象执行操作的权限。熟悉 Unix 风格系统的用户可以轻松了解 Amazon EFS 在这些权限方面的行为。
此外,在 Unix 风格的系统上,用户和组被映射到数字标识符,Amazon EFS 使用这些标识符来表示文件所有权。对于 Amazon EFS,文件系统对象(即文件、目录等)由单个所有者和单个组拥有。当用户尝试访问文件系统对象时,Amazon EFS 使用映射的数字 ID 来检查权限。
注意
NFS 协议支持每个用户最多 16 个组 ID(GID),任何更多 GID 都会被从 NFS 客户端请求中截断。有关更多信息,请参阅 拒绝访问 NFS 文件系统上允许的文件。
下面,您可以找到权限示例以及有关 Amazon EFS 的 NFS 权限注意事项的讨论。
示例 Amazon EFS 文件系统使用案例和权限
创建 Amazon EFS 文件系统并在 VPC 中创建该文件系统的挂载目标后,您可以将远程文件系统本地挂载到您的 Amazon EC2 实例上。mount
命令可以挂载文件系统中的任何目录。不过,在您首次创建文件系统时,只有 /
处的一个根目录。根用户和根组拥有挂载的目录。
以下 mount
命令将由文件系统 DNS 名称标识的 Amazon EFS 文件系统的根目录挂载到 /efs-mount-point
本地目录中。
sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport
file-system-id
.efs.aws-region.amazonaws.com:/ efs-mount-point
初始权限模式可授予以下权限:
-
对所有者根目录的
read-write-execute
权限 -
对组根目录的
read-execute
权限 -
对其他目录的
read-execute
权限
只有根用户可以修改此目录。根用户还可以向其他用户授予对此目录的写入权限。例如:
-
创建可写的每用户子目录。如需分步指导,请参阅 教程:创建可写的每用户子目录。
-
允许用户写入 Amazon EFS 文件系统根目录。具有根用户权限的用户可以向其他用户授予访问该文件系统的权限。
-
要将 Amazon EFS 文件系统所有权更改为非根用户和组,请使用以下命令:
$ sudo chown
user
:group
/EFSroot
-
要更改文件系统的权限使其更加宽松,请使用以下命令:
$ sudo chmod 777 /
EFSroot
该命令为所有挂载了文件系统的 EC2 实例上的所有用户授予读写执行权限。
-
文件系统中文件和目录的用户和组 ID 权限
Amazon EFS 文件系统中的文件和目录支持 Unix 风格的标准读/写/执行权限,这些权限基于用户 ID 和组 ID。当 NFS 客户端在不使用访问点的情况下挂载 EFS 文件系统时,客户端提供的用户 ID 和组 ID 将受信任。可以使用 EFS 访问点覆盖 NFS 客户端所使用的用户 ID 和组 ID。当用户尝试访问文件和目录时,Amazon EFS 会检查其用户 ID 和组 ID,以验证用户是否有权访问对象。Amazon EFS 还使用这些 ID 指示用户创建的新文件和目录的所有者和组所有者。Amazon EFS 不会检查用户或组的名称,它仅使用数字标识符。
注意
在 EC2 实例上创建用户时,可为用户分配任何数字用户 ID (UID) 和组 ID (GID)。数字用户 ID 在 Linux 系统上的 /etc/passwd
文件中设置。数字组 ID 在 /etc/group
文件中。这些文件定义名称与 ID 之间的映射。除 EC2 实例外,Amazon EFS 不对这些 ID 执行任何身份验证,包括根 ID 0。
如果用户从两个不同的 EC2 实例访问 Amazon EFS 文件系统,根据用户的 UID 在这些实例上是相同还是不同,您会看到如下所示的不同行为:
-
如果两个 EC2 实例上的用户 ID 相同,Amazon EFS 会将其视为指明同一用户,而不考虑他们使用的 EC2 实例。从两个 EC2 实例访问文件系统的用户体验相同。
-
如果两个 EC2 实例上的用户 ID 不相同,则 Amazon EFS 会将其视为不同的用户。从两个不同的 EC2 实例访问 Amazon EFS 文件系统的用户体验不相同。
-
如果不同 EC2 实例上的两个不同用户共享一个 ID,则 Amazon EFS 会将其视为同一个用户。
您可以考虑以统一方式管理 EC2 实例间的用户标识映射。用户可以使用 id
命令检查其数字 ID。
$ id uid=502(joe) gid=502(joe) groups=502(joe)
关闭 ID 映射器
操作系统中的 NFS 实用软件包括一个名为 ID 映射器的守护程序,用于管理用户名与 ID 之间的映射。在 Amazon Linux 中,该守护程序称为 rpc.idmapd
,在 Ubuntu 中称为 idmapd
。它能将用户和组 ID 转换为名称,以及反向转换。但是,Amazon EFS 仅处理数字 ID。我们建议您在 EC2 实例上关闭此进程。在 Amazon Linux 上,ID 映射器通常处于禁用状态,且不启用它。要关闭 ID 映射器,请使用如下所示的命令。
$ service rpcidmapd status $ sudo service rpcidmapd stop
无根挤压
默认情况下,EFS 文件系统上禁用根挤压。Amazon EFS 的行为与 no_root_squash
的 Linux NFS 服务器类似。如果用户或组 ID 为 0,Amazon EFS 会将该用户视为 root
用户,并绕过权限检查(允许访问和修改所有文件系统对象)。当 Amazon Identity and Access Management(Amazon IAM)身份或资源策略不允许访问 ClientRootAccess
操作时,可以在客户端连接上启用根挤压。当根挤压处于启用状态时,根用户将被转换为在 NFS 服务器上具有有限权限的用户。
有关更多信息,请参阅 使用 IAM 控制文件系统数据访问。
使用 IAM 授权为 NFS 客户端启用根挤压
您可以配置 Amazon EFS 以防止所有 Amazon 主体(单个管理工作站除外)对 Amazon EFS 文件系统进行根访问。可以通过为网络文件系统(NFS)客户端配置 Amazon Identity and Access Management(IAM)授权来执行此操作。
为此,需要配置两个 IAM 权限策略,如下所示:
-
创建 EFS 文件系统策略,该策略明确允许对文件系统进行读取和写入访问,并隐式拒绝根访问。
-
使用 Amazon EC2 实例配置文件将 IAM 身份分配给需要对文件系统进行根访问的 Amazon EC2 管理工作站。有关 Amazon EC2 实例配置文件的更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的使用实例配置文件。
-
将
AmazonElasticFileSystemClientFullAccess
Amazon 托管策略分配给管理工作站的 IAM 角色。有关适用于 EFS 的 Amazon 托管策略的更多信息,请参阅Amazon EFS 的身份和访问管理。
要使用 IAM 授权为 NFS 客户端启用根挤压,请使用以下过程。
防止对文件系统进行根访问
访问 https://console.aws.amazon.com/efs/
,打开 Amazon Elastic File System 控制台。 选择文件系统。
从“文件系统”页面中选择要启用根挤压的文件系统。
-
在文件系统详细信息页面上,选择文件系统策略,然后选择编辑。此时将显示 File system policy (文件系统策略) 页面。
-
在策略选项下,选择默认阻止根访问*。策略 JSON 对象将显示在策略编辑器中。
选择 Save (保存) 以保存文件系统策略。
非匿名客户端可以通过基于身份的策略获得对文件系统的根访问权限。将 AmazonElasticFileSystemClientFullAccess
托管的策略附加到工作站的角色时,IAM 会根据工作站的身份策略授予对工作站的根访问权限。
从管理工作站启用根访问权限
通过 https://console.aws.amazon.com/iam/
打开 IAM 控制台。 为 Amazon EC2 创建一个名为
EFS-client-root-access
的角色。IAM 会创建一个与您创建的 EC2 角色同名的实例配置文件。将 Amazon 托管策略
AmazonElasticFileSystemClientFullAccess
分配给您创建的 EC2 角色。本策略的内容如下所示。{ "Version”: "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientRootAccess", "elasticfilesystem:ClientWrite", "elasticfilesystem:DescribeMountTargets" ], "Resource": "*" } ] }
将实例配置文件附加到您用作管理工作站的 EC2 实例,如下所述。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的将 IAM 角色附加到实例。
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 在导航窗格中,选择实例。
选择实例。对于 Actions (操作),选择 Instance Settings (实例设置),然后选择 Attach/Replace IAM role (附加/替换 IAM 角色)。
选择您在第一步中创建的 IAM 角色
EFS-client-root-access
,然后选择 Apply (应用)。
在管理工作站上安装 EFS 挂载帮助程序。有关 EFS 挂载帮助程序和 amazon-efs-utils 程序包的更多信息,请参阅安装 Amazon EFS 客户端。
通过使用带
iam
挂载选项的以下命令,在管理工作站上挂载 EFS 文件系统。$
sudo mount -t efs -o tls,iamfile-system-id
:/efs-mount-point
您可以将 Amazon EC2 实例配置为通过 IAM 授权自动挂载文件系统。有关使用 IAM 授权挂载 EFS 文件系统的更多信息,请参阅使用 IAM 授权挂载。
权限缓存
Amazon EFS 会将文件权限缓存一小段时间。因此,可能会有一个短暂的窗口,最近被吊销访问权限的用户仍然可以访问该对象。
更改文件系统对象所有权
Amazon EFS 强制实施 POSIX chown_restricted
属性。这意味着只有根用户可以更改文件系统对象的所有者。root 用户或所有者用户可以更改文件系统对象的所有者组。但是,除非用户是 root 用户,否则该组只能更改为所有者用户所属的组。
EFS 接入点
访问点 将操作系统用户、组和文件系统路径应用于使用访问点发出的任何文件系统请求。访问点的操作系统用户和组覆盖 NFS 客户端提供的任何身份信息。文件系统路径作为访问点的根目录向客户端公开。此方法可确保每个应用程序在访问共享的基于文件的数据集时始终使用正确的操作系统身份和正确的目录。使用访问点的应用程序只能访问其自己的目录及之下目录中的数据。有关接入点的更多信息,请参阅 使用 Amazon EFS 接入点工作。