View a markdown version of this page

S3 Files 中的 POSIX 权限 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

S3 Files 中的 POSIX 权限

POSIX 文件系统要求对每个文件具有所有权和权限。Amazon S3 将数据存储为对象,其访问权限由 IAM 策略和存储桶策略控制,并且不以原生方式存储文件所有权或权限属性。S3 Files 通过将 POSIX 元数据(包括拥有者、组和文件权限)作为用户定义的元数据存储在每个 S3 对象上,来弥合这种差异。当您通过 S3 Files 创建或修改文件时,该服务会自动写入所有权限元数据。在将对象写入文件系统之外的 S3 存储桶时(例如通过 Amazon S3 控制台、Amazon CLI 或 Amazon 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 元数据,以确保从一开始就设置正确的所有权和权限。