连接到 AWS Transfer for SFTP

Posted

技术标签:

【中文标题】连接到 AWS Transfer for SFTP【英文标题】:Connecting to AWS Transfer for SFTP 【发布时间】:2019-05-07 14:28:01 【问题描述】:

我无法连接到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 政策的问题,但我无法弄清楚。

【问题讨论】:

在解决同样的问题几天后,我发现在单个用户的值中硬编码代替 $transfer:X 变量似乎工作得很好。必须有一些技巧才能使变量起作用。 【参考方案1】:

我们在与 AWS Transfer 上的用户合作时遇到了类似的问题。对我们有用的解决方案是创建两种不同的策略。

附加到角色的策略,该角色对整个存储桶具有一般权限。 适用于用户的范围缩小策略,该策略使用 transfer:UserName 等传输服务变量。

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

查看转移用户详细信息时,它在我的控制台中的外观如下:

以下是我们使用的两个政策:附加到 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*"
        
    ]

【讨论】:

谢谢 - 文档没有说您需要同时指定角色和范围缩小策略,所以这很有用。 我也遇到了这个问题。官方文档:docs.aws.amazon.com/transfer/latest/userguide/users.html 相当混乱,但最终,我找到了一个有意义的句子“要进一步缩小用户对指定 S3 存储桶的主目录的访问范围,请参阅创建一个Scope-Down Policy。” 重要的词还有进一步,作者期望“使用基本策略并附加单独的范围缩小策略”。 太棒了!!为我工作!!但是..需要使用最新版本的范围向下策略配置。你可以在这里找到它docs.aws.amazon.com/transfer/latest/userguide/users.html @Marco 很高兴听到这个消息! :) 如果您有时间,请将我的帖子编辑为最新更改。希望有最新的。 变量仅在范围缩小策略中可用,根据此处的注意:docs.aws.amazon.com/transfer/latest/userguide/…:You can't use the variables listed preceding as policy variables in an IAM role definition. You create these variables in an IAM policy and supply them directly when setting up your user.【参考方案2】:

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

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

我希望这会有所帮助。 编辑:为 CloudWatch 角色的设置添加了图片:

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 问题。

【讨论】:

我认为您不能发布您的 IAM 角色示例?我对 AWS 有点陌生,我遇到了和 OP 一样的问题。我特别不知道如何去做关于 CloudWatch 的最后一个项目。谢谢! 谢谢!是信任关系把我搞砸了。你的回答对我有用。感谢您提供示例。我很感激。 transfer.amazonaws.com 信任关系是关键。我不需要设置日志记录角色。 “确保服务器本身具有 Cloudwatch 角色,并且与 transfer.amazonaws.com 具有信任关系!这就是我的解决方案。” - 这让我免于发疯。 谢谢! Cloudwatch 角色也是我唯一需要解决的问题。干杯!【参考方案3】:

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

来自本文档的第 24 页...https://docs.aws.amazon.com/transfer/latest/userguide/sftp.ug.pdf#page=28&zoom=100,0,776

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

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

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

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

【讨论】:

【参考方案4】:

无法发表评论,如果我发错了,请见谅。

注意 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

【讨论】:

【参考方案5】:

我们使用的是带有用户名和密码的 SFTP 更新版本,不得不花费相当长的时间来弄清楚所有细节。对于新版本,需要在 Secrets Manager 中将 Scope down 策略指定为“Policy”键。这对于整个流程的工作非常重要。

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

希望有帮助!

【讨论】:

以上是关于连接到 AWS Transfer for SFTP的主要内容,如果未能解决你的问题,请参考以下文章

对 Amazon S3 存储桶的 FTP/SFTP 访问 [关闭]

如何在 Cypress 测试中连接到 SFTP 服务器?

使用 pysftp 连接到 SFTP 服务器时出现“加载主机密钥失败”警告

使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”

使用 SFTP 连接到 z/OS 大型机

在 Heroku 上存储 SSH 密钥以通过 SFTP 将 Rails 应用程序连接到远程