管理访问控制 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

管理访问控制

您可以使用Amazon Identity and Access Management (IAM) 策略控制用户对Amazon Transfer Family资源的访问权限。IAM 策略是一种语句,通常采用 JSON 格式,允许对资源进行一定级别的访问。您可以使用 IAM 策略来定义您希望允许用户执行和不执行哪些文件操作。您也可以使用 IAM 策略来定义要向用户授予访问权限的 Amazon S3 存储桶或存储桶。要为用户指定这些策略,您需要为其创建一个 IAM 角色Amazon Transfer Family,该角色具有与之关联的 IAM 策略和信任关系。

为每个用户分配了一个 IAM 角色。当用户登录到您的服务器时,将Amazon Transfer Family假设映射到该用户的 IAM 角色。要了解如何创建 IAM 角色以向用户提供对 Amazon S3 存储桶的访问,请参阅以下内容。有关如何创建角色和委派权限的信息,请参阅《IAM 用户指南》中的创建向Amazon服务委派权限的角色

Amazon Transfer Family使用的 IAM 角色类型称为服务角色。

注意

如果您的 Amazon S3 存储桶使用Amazon Key Management Service(Amazon KMS)加密,您必须在策略中指定其他权限。有关详细信息,请参阅数据加密。此外,您可以在 IAM 用户指南中查看有关会话策略的更多信息。

允许对 Amazon S3 存储桶的读写访问

接下来,您可以了解如何创建 IAM 策略以允许对特定 Amazon S3 存储桶进行读写访问。为您的用户分配具有此 IAM 策略的 IAM 角色,将赋予该用户对指定 Amazon S3 存储桶的读/写访问权限。

以下策略提供对 Amazon S3 存储桶的编程读写访问。

{ "Version": "2012-10-17", "Statement": [ { "Sid":"ReadWriteS3", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::bucketname"] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:GetObjectVersion", "s3:GetObjectACL", "s3:PutObjectACL" ], "Resource": ["arn:aws:s3:::bucketname/*"] } ] }

ListBucket 操作需要对存储桶本身的权限。PUTGETDELETE 操作需要对象权限。由于这些是不同的实体,因此使用不同的 Amazon 资源名称 (ARN) 指定它们。

如果您的存储桶启用了 Amazon Key Management Service (Amazon KMS) 加密,则需要在策略中启用其他操作。有关的更多信息Amazon KMS,请参阅什么是Amazon密钥管理服务?

要进一步限制您的用户只能访问指定 Amazon S3 存储桶的home目录,请参阅为 Amazon S3 存储桶创建会话策略

为 Amazon S3 存储桶创建会话策略

会话策略是一种Amazon Identity and Access Management(IAM)策略,限制用户对 Amazon S3 存储桶的某些部分。它通过实时评估访问来做到这一点。

注意

会话策略仅用于 Amazon S3。对于 Amazon EFS,您可以使用 POSIX 文件权限来限制访问权限。

当您需要向一组用户授予对您的 Amazon S3 存储桶特定部分的相同访问权限时,您可以使用会话策略。例如,一组用户可能仅需访问 home 目录。该组用户共享相同的 IAM 角色。

注意

会话策略的最大长度是 2048 个字符。有关更多详细信息,请参阅 API 参考CreateUser操作的策略请求参数

要创建会话策略,请在您的 IAM 策略中使用以下策略变量:

  • ${transfer:HomeBucket}

  • ${transfer:HomeDirectory}

  • ${transfer:HomeFolder}

  • ${transfer:UserName}

重要

您不能使用前面在 “托管策略” 中列出的变量。您也不能在 IAM 角色定义中将它们用作 IAM 角色定义中的策略变量。您可以在 IAM 策略中创建这些变量,并在设置用户时直接提供这些变量。此外,您不能在此会话策略中使用该${aws:Username}变量。此变量指的是 IAM 用户名,而不是要求的用户名Amazon Transfer Family。

下面的代码示例显示了会话策略的示例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::${transfer:HomeBucket}" ], "Condition": { "StringLike": { "s3:prefix": [ "${transfer:HomeFolder}/*", "${transfer:HomeFolder}" ] } } }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObjectVersion", "s3:DeleteObject", "s3:GetObjectVersion", "s3:GetObjectACL", "s3:PutObjectACL" ], "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*" } ] }
注意

在上述策略中,假设用户的主目录设置为包含尾部斜杠,以表示它是一个目录。另一方面,如果您将用户设置为HomeDirectory没有尾部斜杠,则应将其作为政策的一部分。

在前面的示例策略中,记下transfer:HomeFoldertransfer:HomeBucket、和transfer:HomeDirectory策略参数的使用。这些参数是为为HomeDirectory用户配置的设置的,如HomeDirectory和中所述实现 API Gateway 方法。这些参数具有以下定义:

  • transfer:HomeBucket参数由的第一个分量替换HomeDirectory

  • transfer:HomeFolder参数将替换为HomeDirectory参数的其余部分。

  • transfer:HomeDirectory参数删除了前导正斜杠 (/),因此可以在Resource语句中将其用作 S3 Amazon 资源名称 (ARN) 的一部分。

注意

如果您使用的是逻辑目录(即用户的逻辑目录LOGICAL),homeDirectoryType则不支持这些策略参数(HomeBucketHomeDirectory、和HomeFolder)。

例如,假设为 Transfanser FTransfer Family 用户配置的HomeDirectory参数是/home/bob/amazon/stuff/

  • transfer:HomeBucket设置为/home

  • transfer:HomeFolder设置为/bob/amazon/stuff/

  • transfer:HomeDirectory变成home/bob/amazon/stuff/

第一个"Sid"允许用户列出从开始的所有目录/home/bob/amazon/stuff/

第二个"Sid"限制了用户put对同一路径的get访问权限,/home/bob/amazon/stuff/

实施上述策略后,当用户登录时,他们只能访问其主目录中的对象。在连接时,Amazon Transfer Family 会将这些变量替换为用户的适当值。这样做可以更轻松地将相同的策略文档应用于多个用户。这种方法减少了管理用户对 Amazon S3 存储桶的访问的 IAM 角色和策略管理的开销。

您还可以使用会话策略根据您的业务需求自定义每个用户的访问权限。有关更多信息,请参阅 IAM 用户指南 AssumeRoleWithWebIdentity中的权限、S AssumeRoleWith AM L 和。 AssumeRole

注意

Amazon Transfer Family存储桶存储桶存储 JSON,而不是策略的 Amazon 资源名称 (ARN)。因此,当您在 IAM 控制台中更改策略时,您需要返回Amazon Transfer Family控制台并向您的用户更新最新的策略内容。您可以在 “用户配置” 部分的 “策略信息” 选项卡下更新用户。有关更多信息,请参阅管理访问控制

如果您使用的是Amazon CLI,您可以使用以下命令更新策略。

aws transfer update-user --server-id server --user-name user --policy \ "$(aws iam get-policy-version --policy-arn policy --version-id version --output json)"

防止用户在 S3 存储桶mkdir中运行

您可以限制用户在 Amazon S3 存储桶中创建目录的能力。为此,您可以创建一个 IAM 策略,该策略允许该s3:PutObject操作,但在密钥以 “/”(正斜杠)结尾时也会拒绝该操作。以下示例策略允许用户将文件上传到 Amazon S3 存储桶,但拒绝 Amazon S3 存储桶中的mkdir命令。

{ "Sid":"DenyMkdir", "Action":[ "s3:PutObject" ], "Effect":"Deny", "Resource":"arn:aws:s3:::my-sftp-bucket/*/" }

授予仅写入和列出文件的能力

在某些情况下,客户只希望提供对其 Amazon S3 对象的写入权限。他们希望提供写入/上传和列出存储桶中对象的权限,但不想提供读取/下载的权限。这转化为 Amazon S3 权限PutOjbectListObjectsls以及使用文件传输客户端执行和mkdir命令。但是,当 Transfer Family 需要HeadObject调用写入或列出文件时,它会失败并显示 “访问被拒绝” 错误,因为此调用需要GetObject权限。

在这种情况下,您可以通过添加一个策略条件来授予访问GetObject权限,该条件为任何以/结尾的对象添加权限。这样可以防止GetObject文件无法读取,同时允许用户列出和遍历文件夹。以下示例策略仅提供对其 Amazon S3 存储桶的写入和列出访问权限(将 DOC-EXAMPLE-B UCKET 替换为存储桶的实际名称)。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListing", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" }, { "Sid": "AllowReadWrite", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetobjectVersion" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "DenyIfNotFolder", "Effect": "Deny", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "NotResource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*/" ] } ] }
注意

此策略不允许追加到文件中。也就是说,分配了此策略的用户无法打开文件向其添加内容或对其进行修改。此外,如果您的用例涉及在上传文件之前发出HeadObject呼叫,则此政策对您不起作用。