困っていた内容
AWS Transfer Family で SFTP サーバーを立てていて、ストレージは S3 を使用しています。クライアントを使用してファイルの転送を行おうとすると Access denied.
と出力されてディレクトリのリスト取得に失敗します。
エラー内容から IAM 権限周りで失敗していると思いますが、確認するべき点を教えてください。
(※ 上記は Cyberduck をクライアントとした SFTP でのファイル転送に失敗した例)
どこを確認すればいいの?
考えられる原因
ユーザ毎にホームディレクトリを制限するためにユーザー作成時にポリシーとして「ホームフォルダに基づくポリシーの自動生成」を選択しているかと存じます。
AWS Transfer Family のユーザーに紐づけた IAM ロールと、ユーザーに適用されるこのセッションポリシーは異なるものです。
セッションポリシーを使用すると下記ドキュメントに記載のように、IAM ロールに付与された IAM ポリシーで許可された内容(アイデンティティベースのポリシー)およびセッションポリシーで許可された内容という共通部分にのみにアクセス許可が与えられます。
セッションポリシーは、ロールまたはフェデレーティッドユーザーの一時セッションをプログラムで作成する際にパラメータとして渡す高度なポリシーです。セッションのアクセス許可は、セッションの作成に使用する IAM エンティティ (ユーザーまたはロール) のアイデンティティベースのポリシーとセッションポリシーの共通部分です。
そのため、ユーザーが S3 バケットやフォルダを利用できるように IAM ロールに適切な権限が割り当てられているかをご確認ください。
対応方法
AWS Transfer Family のユーザーに紐づけた IAM ロールに、公式ドキュメントに記載の「Amazon S3 バケットへの読み書きアクセス権の付与」といった権限を割り当ててAccess denied.
のエラーが解消されるかお試しください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListingOfUserFolder",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET"
]
},
{
"Sid": "HomeDirObjectAccess",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObjectVersion",
"s3:GetObjectACL",
"s3:PutObjectACL"
],
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}
]
}
ここにも注意
対象バケットでバージョニングを有効化している場合は、IAM ロールに付与する IAM ポリシー内にGetObjectVersion と DeleteObjectVersion への許可を忘れずに入れましょう!
GetObjectVersion および DeleteObjectVersion ステートメントは、アクセスされている Amazon S3 バケットでバージョニングが有効になっている場合にのみ必要です。
バケットでバージョニングを有効にしたことがある場合はこれを忘れると Permission denied
のエラーが発生します。