连接到AWS Transfer for SFTP

问题描述 投票:8回答:4

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

我设置了一个具有信任关系的IAM角色,如下所示:

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

我使用主目录described in the documentation和主目录homebucket将其与范围向下策略配对为homedir

{
"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政策问题非常相似,但我无法弄明白。

amazon-web-services amazon-s3 sftp amazon-iam
4个回答
11
投票

我们遇到了类似的问题,使得范围缩减政策与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}*"
        }
    ]
}

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


1
投票

根据有点神秘的文件@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所需的用户名。


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

© www.soinside.com 2019 - 2024. All rights reserved.