web-dev-qa-db-ja.com

SFTPのAWS Transferへの接続

SFTPのAWS転送 への接続に問題があります。サーバーを正常にセットアップし、WinSCPを使用して接続しようとしました。

次のような信頼関係を持つIAMロールを設定しました。

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

ドキュメントで説明 ホームディレクトリ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 up homedir」や「readdir」の失敗などの不透明なエラーが表示され続けました。これはすべてIAMポリシーの問題に非常によく似ていますが、私はそれを理解することができませんでした。

13
ChristopherTull

AWS Transferでユーザーと連携するスコープダウンポリシーを取得する際にも、同様の問題がありました。私たちのために働いた解決策は、2種類のポリシーを作成することでした。

  • ロールにアタッチするポリシーこれは、バケット全体に対する一般的な権限を持ちます。
  • ユーザーに適用するスコープダウンポリシーは、{transfer:UserName}などの転送サービス変数を使用します。

おそらく、追加の添付ポリシーのみが転送サービス変数を解決できると結論付けました。これが正しいかどうか、またこれが最良のソリューションであるかどうかはわかりません。これは、スコープダウンポリシーをアタッチして一種の「管理者」ユーザーを作成することを許すときに、リスクを招く可能性があるためです。それで、これをもう少しロックダウンするための入力ができてうれしいです。

転送ユーザーの詳細を見ると、コンソールでどのように見えるかを以下に示します。 Transfer user detail view with extra policy attached

使用する2つのポリシーは次のとおりです。
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}*"
        }
    ]
}
14
limfinity

同様の問題が発生しましたが、エラーの動作が異なります。何とかログインに成功しましたが、その後すぐに接続が閉じられました。私は次のことをしました:

  • バケットが暗号化されている場合、バケットアクセスを許可するIAMロールにもKMSアクセスが含まれていることを確認してください。
  • 信頼関係もその役割の一部であることを確認してください。
  • サーバー自体にも、transfer.amazonaws.comとの信頼関係を持つCloudwatchロールがあることを確認してください。これが私にとっての解決策でした。これが必要な理由はわかりませんが、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の問題のようです。

6

やや不可解なドキュメントによると、@ 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}

Note前にリストした変数は、IAMロール定義のポリシー変数として使用できません。 IAMポリシーでこれらの変数を作成し、ユーザーをセットアップするときにそれらを直接指定します。また、このスコープダウンポリシーでは$ {aws:Username}変数を使用できません。この変数は、AWS SFTPで必要なユーザー名ではなく、IAMユーザー名を参照します。

1
mojomatt

コメントできません。間違って投稿していると申し訳ありません。

AWSのデフォルトポリシーに注意してください!

このソリューションは、期待どおりにSFTPユーザーにスコープダウンポリシーを使用できるという点で、私にとってはうまくいきました。ただし、キャッチがあります。

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

ポリシーのこのセクションでは、このポリシーを使用するSFTPユーザーがディレクトリをルートに変更し、アカウントのすべてのバケットを一覧表示できるようにします。読み書きすることはできませんが、おそらく不要なものを発見できます。上記を次のように変更することを確認できます。

{
            "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
mars64