View a markdown version of this page

S3 Files 中的 POSIX 权限 - Amazon Simple Storage Service

S3 Files 中的 POSIX 权限

POSIX 文件系统要求对每个文件具有所有权和权限。Amazon S3 将数据存储为对象,其访问权限由 IAM 策略和存储桶策略控制,并且不以原生方式存储文件所有权或权限属性。S3 Files 通过将 POSIX 元数据(包括拥有者、组和文件权限)作为用户定义的元数据存储在每个 S3 对象上,来弥合这种差异。当您通过 S3 Files 创建或修改文件时,该服务会自动写入所有权限元数据。在将对象写入文件系统之外的 S3 存储桶时(例如通过 Amazon S3 控制台、AWS CLI 或 AWS SDK),该对象上不存在 POSIX 元数据。S3 Files 为这些对象分配默认的 root:root 所有权值和 644 权限,这可让非根用户读取文件但不能写入文件。如果这些默认值符合您的访问要求,则无需执行任何操作。如果应用程序需要,可以覆盖有关这些对象的默认权限。本教程将逐步介绍如何应用自定义权限。

S3 Files 如何存储 POSIX 元数据

S3 Files 将 POSIX 信息作为用户定义的元数据存储在每个对象上。以下元数据键控制所有权和权限:

元数据键 说明 示例值
x-amz-meta-file-owner POSIX 用户 ID(UID) 1000
x-amz-meta-file-group POSIX 组 ID(GID) 1000
x-amz-meta-file-permissions 文件类型和权限位(八进制) 0100644

当对象没有 POSIX 元数据时,S3 Files 会应用以下默认值:

  • 文件:具有 0644 权限的 root:root 所有权 (-rw-r--r--)

  • 目录:具有 0755 权限的 root:root 所有权 (drwxr-xr-x)

在这些默认值下,所有用户都可以读取文件和遍历目录,但只有拥有者(根)可以写入。默认情况下,文件是不可执行的。

在现有对象上设置 POSIX 元数据

使用以下过程将 POSIX 所有权和权限应用于存储桶中已存在的对象。

步骤 1:确定目标用户的 UID 和 GID

在本示例中,目标用户为 ec2-user,UID 为 1000:

$ id ec2-user
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user)

步骤 2:使用 copy-object 更新对象元数据

aws s3api copy-object 命令使用更新的元数据将对象复制到位。将 BUCKET_NAMEOBJECT_KEY 替换为您的值。

--metadata-directive REPLACE 选项会替换对象上所有用户定义的元数据。包含 --content-type 可以保留对象的内容类型,因为 REPLACE 会将其重置为默认值 (binary/octet-stream)。如果您使用其它元数据字段,请将其包含在 --metadata 参数中。

aws s3api copy-object \ --bucket BUCKET_NAME \ --key OBJECT_KEY \ --copy-source BUCKET_NAME/OBJECT_KEY \ --metadata-directive REPLACE \ --content-type CONTENT_TYPE \ --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'

步骤 3:验证元数据是否已应用

运行以下命令以确认元数据:

aws s3api head-object --bucket BUCKET_NAME --key OBJECT_KEY

响应包含您的 POSIX 元数据:

{ "AcceptRanges": "bytes", "LastModified": "Mon, 18 May 2026 14:43:00 GMT", "ContentLength": 7214, "ETag": "\"abc123...\"", "ContentType": "image/png", "Metadata": { "file-owner": "1000", "file-group": "1000", "file-permissions": "0100644" } }

步骤 4:验证 S3 文件系统的权限

$ ls -ltr /mnt/s3files/
-rw-r--r--. 1 ec2-user ec2-user 7214 May 18 14:43 s3.png

该文件现在归 ec2-user 所有,不再需要根权限即可访问。

为新的上传设置 POSIX 元数据

在将对象上传到存储桶时,可以包含 POSIX 元数据。

使用 aws s3 cp

aws s3 cp localfile.txt s3://BUCKET_NAME/localfile.txt \ --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'

使用 aws s3api put-object

aws s3api put-object \ --bucket BUCKET_NAME \ --key localfile.txt \ --body localfile.txt \ --metadata '{"file-owner":"1000", "file-group":"1000", "file-permissions":"0100644"}'

验证已上传对象上的元数据

aws s3api head-object --bucket BUCKET_NAME --key localfile.txt

权限值参考

下表列出了常见的 POSIX 权限值及其使用案例。

八进制值 文件模式 使用案例
0100644 -rw-r--r-- 标准文件:拥有者读/写,其他用户只读
0100664 -rw-rw-r-- 共享文件:拥有者和组读/写,其他用户只读
0100755 -rwxr-xr-x 可执行:拥有者完全访问,其他用户读取和执行
0100666 -rw-rw-rw- 全局可写文件:所有用户都可以读写
0040755 drwxr-xr-x 标准目录:拥有者完全访问,其他用户读取和遍历

最佳实践

尽可能通过 S3 文件系统上传文件。S3 Files 会自动将文件的所有权和权限存储为对象元数据,因此无需执行额外的步骤。当直接上传到 S3 存储桶时,请在上传命令中包含 POSIX 元数据,以确保从一开始就设置正确的所有权和权限。