You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform配置AWS Transfer Family SFTP逻辑目录通用IAM策略问题

问题描述

我正在通过Terraform创建AWS Transfer Family的SFTP服务器,已将home_directory_type设置为logical。根据AWS官方说明:若使用逻辑目录(即用户的homeDirectoryType为LOGICAL),则不支持HomeBucket、HomeDirectory和HomeFolder这些策略参数。

我的需求是为该SFTP的所有租户创建通用的IAM策略,因此需要使用策略变量(例如${transfer:UserName}),在Terraform中用$${transfer:UserName}转义后配置如下:

"Resource": "arn:aws:s3:::${local.bucket_name}/$${transfer:UserName}/output/*"

但该配置无法生效,硬编码具体用户名时则正常。推测是变量不支持或转义方式错误,请问如何解决?是否有其他可用参数?

相关Terraform代码:

resource "aws_iam_role_policy" "ftp-file-import" {
  name = "${local.name}-ftp-import-policy"
  role = aws_iam_role.ftp-user.name
  policy = <<POLICY
  {
    "Version": "2012-10-17",
    "Statement": [
        {
           "Sid": "AllowListingOfUserFolder",
           "Action": [
               "s3:ListBucket",
               "s3:GetObject",
               "s3:GetBucketLocation"
           ],
           "Effect": "Allow",
           "Resource": [
               "arn:aws:s3:::${local.bucket_name}"
           ]
         },
         {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
               "s3:ListBucket",
               "s3:GetObject",
               "s3:GetObjectVersion",
               "s3:GetObjectACL",
               "s3:GetObjectVersion",
               "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::${local.bucket_name}/*"
         },
         {
            "Sid": "OutputFolderAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetObjectVersion",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::${local.bucket_name}/$${transfer:UserName}/output/*"
       }  
     ] 
    }
  POLICY
}
解决方案

1. 确认转义正确性

你用$${transfer:UserName}的转义方式是对的,Terraform会将其输出为${transfer:UserName}到最终的IAM策略中。可以通过terraform plan查看生成的策略内容,确认变量是否正确保留。如果转义没问题,问题出在策略逻辑适配逻辑目录模式上。

2. 调整IAM策略适配逻辑目录

逻辑目录模式下,用户的访问路径是映射后的逻辑路径,原策略的ListBucket权限没有限制前缀,且资源路径的匹配逻辑需要优化。修改后的策略如下:

resource "aws_iam_role_policy" "ftp-file-import" {
  name = "${local.name}-ftp-import-policy"
  role = aws_iam_role.ftp-user.name
  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListOwnDirectory",
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::${local.bucket_name}"],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "${transfer:UserName}/",
            "${transfer:UserName}/output/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAccessOwnFiles",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:GetObjectACL"
      ],
      "Resource": [
        "arn:aws:s3:::${local.bucket_name}/${transfer:UserName}/*"
      ]
    }
  ]
}
POLICY
}
  • 给ListBucket操作添加s3:prefix条件,限制用户只能列出自己目录下的内容
  • 合并了重复的权限项,避免冗余
  • 确保资源路径和变量的匹配逻辑正确

3. 可用的AWS Transfer内置变量

除了${transfer:UserName},还可以使用以下内置变量:

  • ${transfer:HomeDirectory}:用户的逻辑主目录路径
  • ${transfer:SessionId}:SFTP会话的唯一ID
  • ${transfer:ServerId}:Transfer Family服务器的ID
  • ${transfer:SourceIp}:用户连接的源IP地址

4. 验证策略生效

  • 执行terraform apply应用修改后的策略
  • 使用SFTP用户登录,尝试访问自己的output目录,确认权限正常
  • 如果仍有问题,查看AWS CloudTrail中的AccessDenied事件,检查资源路径和变量替换是否符合预期

内容的提问来源于stack exchange,提问作者Niklas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:24:58