

# 控制客户端对 S3 Files 文件系统的访问权限
<a name="s3-files-access-point-policy-examples"></a>

本主题介绍如何使用文件系统策略、IAM 身份策略和网络控制来控制哪些客户端可以访问 S3 Files 文件系统以及通过哪些接入点进行访问。

## S3 Files 接入点
<a name="s3-files-access-point-policy-overview"></a>

S3 Files 接入点是文件系统的特定于应用程序的入口点，它简化了对大规模数据访问的管理。您可以使用接入点对通过接入点发出的所有文件系统请求强制执行用户身份和权限，并限制客户端只能访问指定根目录及其子目录内的数据。

接入点限定了客户端可以在文件系统上执行的操作。但没有限定哪些客户端可以使用它们。您的账户中任何具有 `s3files:ClientMount` 权限的角色都可以通过文件系统上的任何接入点进行挂载，除非文件系统策略对其进行限制。要控制哪些客户端可以使用哪个接入点，请组合使用以下三层：网络控制（阻止连接）、文件系统资源策略（在身份策略更改后继续有效的显式拒绝）和 IAM 身份策略（有关角色的最低权限）。

每次挂载时，S3 Files 都会根据文件系统策略评估 `s3files:ClientMount`、`s3files:ClientWrite` 和 `s3files:ClientRootAccess`。还会在每次挂载时评估 `s3files:AccessPointArn` 条件键，因此，您可以编写一条拒绝语句，用于阻止通过除您指定的接入点之外的任何接入点进行访问。如果任何必需的操作被拒绝或未获授权，则在进行任何文件操作之前，挂载将失败。以下两节涵盖了两个常见的要求：将工作负载限制为特定的接入点，以及完全拒绝工作负载访问文件系统。

## 将访问限制为特定的接入点
<a name="s3-files-access-point-policy-restrict"></a>

当一个角色（例如，EC2 实例角色或 ECS 任务角色）必须仅通过一个接入点挂载文件系统时，此模式适用。条件键为 `s3files:AccessPointArn`。该策略要求对于目标接入点使用 `Allow`，而对于每个其它接入点使用显式 `Deny`。IAM 允许授权是跨身份和资源策略的累加授权；如果没有显式拒绝，则单独的策略可以授予对不同接入点的访问权限。

**文件系统策略示例：**

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowComputeAOnlyViaSpecificAP",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::ACCOUNT:role/compute-a-role" },
      "Action": [
        "s3files:ClientMount",
        "s3files:ClientWrite"
      ],
      "Condition": {
        "StringEquals": {
          "s3files:AccessPointArn": "arn:aws:s3files:REGION:ACCOUNT:file-system/fs-ID/access-point/fsap-ID"
        }
      }
    },
    {
      "Sid": "DenyComputeAIfWrongAP",
      "Effect": "Deny",
      "Principal": { "AWS": "arn:aws:iam::ACCOUNT:role/compute-a-role" },
      "Action": "s3files:Client*",
      "Condition": {
        "StringNotEquals": {
          "s3files:AccessPointArn": "arn:aws:s3files:REGION:ACCOUNT:file-system/fs-ID/access-point/fsap-ID"
        }
      }
    }
  ]
}
```

只有当请求指向 `fsap-ID` 时，才支持角色 `compute-a-role` 进行挂载和写入，并且在该文件系统的所有其它接入点上都显式拒绝该角色。身份策略无法覆盖资源策略中的显式拒绝，因此，即使稍后将更宽泛的 IAM 策略附加到该角色，此限制仍然有效。

**挂载命令：**

```
sudo mount -t s3files -o accesspoint=fsap-ID fs-ID:/ /mnt/s3files
```

## 拒绝通过任何接入点访问工作负载
<a name="s3-files-access-point-policy-deny"></a>

当角色与 S3 Files 文件系统共享账户，但不得通过任何接入点或直接挂载该账户时，此模式适用。要阻止使用所有接入点，请按从最强到最弱的隔离保证顺序应用三个层级。

**1. 网络控制。**移除安全组规则，该规则向 `compute-b-role` 的实例授予访问 TCP 端口 2049 上的挂载目标的权限。网络控制是最具弹性的层，因为它们可以在发生任何凭证交换之前阻止挂载尝试。即使配置错误的策略授予了挂载权限，NFS 连接也无法到达挂载目标。

**2. 文件系统策略中的显式拒绝。**文件系统策略中的拒绝语句会拒绝挂载，即使稍后向该角色授予更宽泛的 IAM 权限也不例外。即使拥有 `iam:PutRolePolicy` 的某人修改了角色的身份策略，文件系统资源策略提供的拒绝也会持续存在。只有拥有 `s3files:PutFileSystemPolicy` 的主体才能更改此层。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyComputeBOnFileSystem",
      "Effect": "Deny",
      "Principal": { "AWS": "arn:aws:iam::ACCOUNT:role/compute-b-role" },
      "Action": "s3files:Client*",
      "Resource": "*"
    }
  ]
}
```

**3. IAM 身份策略。**请勿向角色授予 `s3files:Client*` 权限。这是最后一层，也是最容易发生配置错误的一层，因为任何拥有 `iam:PutRolePolicy` 的管理员都可以向角色授予挂载权限。

### 如果没有文件系统策略，任何角色都可以通过任何接入点进行挂载
<a name="s3-files-access-point-policy-deny-no-resource-policy"></a>

文件系统资源策略提供了拒绝，仅拥有修改身份策略的权限的人无法将其移除。如果没有文件系统策略，则其身份策略中具有 `s3files:ClientMount` 的任何角色都可以通过文件系统上的任何接入点进行挂载。我们建议您使用拒绝基准将文件系统策略附加到每个文件系统，然后为每个工作负载添加允许语句。

## 接入点隔离的最佳实践
<a name="s3-files-access-point-policy-best-practices"></a>

下表汇总了实现常见接入点隔离目标的推荐方法。


| 目标 | 推荐方法 | 
| --- | --- | 
| 将工作负载限制为单个接入点 | 在特定的接入点 ARN 上允许该角色，并在所有其它接入点上显式拒绝。请参阅“将访问限制为特定的接入点”。 | 
| 阻止同一个账户中的角色挂载文件系统 | 移除对端口 2049 的网络访问权限，在文件系统策略中拒绝，并且不要在 IAM 中授予权限。 | 
| 同一个文件系统上多个工作负载，每个工作负载都限于自己的接入点 | 在文件系统策略中为每个角色保留一个 allow \+ deny（允许 \+ 拒绝）对，每个角色限定为不同的接入点 ARN。 | 
| 通过接入点进行跨账户访问 | 使用文件系统策略在特定接入点 ARN 上授予跨账户角色。请勿仅依赖于身份策略。 | 