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_NAME 和 OBJECT_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 元数据,以确保从一开始就设置正确的所有权和权限。