连接到适用于SFTP的AWS Transfer

时间:2018-12-05 23:04:06

标签: amazon-web-services amazon-s3 sftp amazon-iam

我无法连接到AWS Transfer for SFTP。我成功设置了服务器,并尝试使用WinSCP进行连接。

我设置了具有以下信任关系的IAM角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

我使用主目录homebucket和主目录homedir将范围调整策略与described in the documentation配对使用

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "ListHomeDir",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetBucketAcl"
        ],
        "Resource": "arn:aws:s3:::${transfer:HomeBucket}"
    },
    {
        "Sid": "AWSTransferRequirements",
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets",
            "s3:GetBucketLocation"
        ],
        "Resource": "*"
    },
    {
        "Sid": "HomeDirObjectAccess",
        "Effect": "Allow",
        "Action": [
            "s3:DeleteObjectVersion",
            "s3:DeleteObject",
            "s3:PutObject",
            "s3:GetObjectAcl",
            "s3:GetObject",
            "s3:GetObjectVersionAcl",
            "s3:GetObjectTagging",
            "s3:PutObjectTagging",
            "s3:PutObjectAcl",
            "s3:GetObjectVersion"
        ],
        "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
    }
]

}

我能够使用ssh密钥进行身份验证,但是在实际读取/写入文件时,我一直不断出现不透明的错误,如“错误查找homedir”和“ readdir”失败。这一切都非常像我的IAM政策问题,但我无法弄清楚。

5 个答案:

答案 0 :(得分:9)

我们在将范围缩小策略与AWS Transfer上的用户一起使用时遇到类似的问题。对我们有用的解决方案是创建两种不同的策略。

  • 附加到角色的政策,该角色在整个存储桶中具有一般权限。
  • 适用于用户的范围缩小策略,该策略利用了{transfer:UserName}之类的传输服务变量。

我们得出的结论是,也许只有附加的策略才能解析传输服务变量。我们不确定这是否正确以及这是否是最佳解决方案,因为这在允许附加范围缩小策略以创建一种“管理员”用户时会带来潜在的风险。因此,我很乐意得到进一步将其锁定的输入。

这是查看传输用户详细信息时在控制台中的外观: Transfer user detail view with extra policy attached

这是我们使用的两项政策:
附加到IAM角色的一般政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-s3-bucket"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3::: my-s3-bucket/*"
        }
    ]
}

适用于转移用户的范围缩小政策

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

答案 1 :(得分:6)

我有一个类似的问题,但是有不同的错误行为。我设法成功登录,但是随后几乎立即关闭了连接。 我做了以下事情:

  • 如果您的存储桶已加密,请确保允许存储桶访问的IAM角色也包含KMS访问。
  • 确保信任关系也是该角色的一部分。
  • 确保服务器本身也具有Cloudwatch角色,并且具有与transfer.amazonaws.com的信任关系!这是我的解决方案。我不明白为什么需要这样做,但是如果没有Cloudwatch角色的信任关系,我的连接就会关闭。

我希望能有所帮助。 编辑:为CloudWatch角色的设置添加了图片: enter image description here

IAM用户角色的存储桶策略如下所示:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::<your bucket>"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::<your bucket>/*"
        ]
    }
]

}

最后,还为用户IAM角色添加一个如上所示的信任关系。

如果您可以连接到sftp,但是在尝试列出内容时收到readdir错误,例如使用命令“ ls”,则表明您没有存储桶权限。如果您的连接立即关闭,则可能是信任关系问题或KMS问题。

答案 2 :(得分:1)

根据有点神秘的文档,@ limfinity是正确的。要缩小访问范围,您需要一个常规的角色/策略组合来授予访问权限以查看存储桶。该角色将应用于您创建的SFTP用户。另外,您需要一个自定义策略,该策略仅将CRUD权限授予用户的存储桶。自定义策略也适用于SFTP用户。

从本文档的第24页... wait(2) man page

要创建范围缩小策略,请在IAM策略中使用以下策略变量:

AWS Transfer for SFTP用户指南 创建范围缩小策略

• ${transfer:HomeBucket}
• ${transfer:HomeDirectory}
• ${transfer:HomeFolder}
• ${transfer:UserName}

注意 您不能在IAM角色定义中使用前面列出的变量作为策略变量。您可以在IAM策略中创建这些变量,并在设置用户时直接提供它们。另外,您不能在此范围缩小策略中使用$ {aws:Username}变量。此变量引用的是IAM用户名,而不是AWS SFTP所需的用户名。

答案 3 :(得分:0)

无法发表评论,对不起,如果我发帖不正确。

注意AWS的默认策略!

此解决方案确实对我有用,因为我能够按预期对SFTP用户使用范围缩小策略。但是,有一个问题:

{
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },

该部分的政策将使SFTP用户可以使用该政策将目录更改为root,并列出您帐户的所有存储桶。他们没有读取或写入的权限,但可以发现可能不必要的内容。我可以确认将以上内容更改为:

{
            "Sid": "AWSTransferRequirements",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": "${transfer:HomeBucket}"
        },
出现

...可以防止SFTP用户列出存储桶。但是,如果碰巧知道存在的存储桶,它们仍然可以cd到目录-再次,它们没有读/写功能,但这仍然是不必要的访问。我可能在我的保单中缺少一些东西来防止这种情况。

正确的jailing似乎是一个积压主题:https://forums.aws.amazon.com/thread.jspa?threadID=297509&tstart=0

答案 4 :(得分:0)

我们使用带有用户名和密码的SFTP的更新版本,并且不得不花费很多时间来找出所有详细信息。对于新版本,“范围缩小”策略需要在Secrets Manager中指定为“策略”键。这对于整个工作流程非常重要。

我们已经在我们的网站上记录了完整的设置-https://coderise.io/sftp-on-aws-with-username-and-password/

希望有帮助!