Edited at

Laravel による S3 操作に必要な最小限の IAM ポリシー


背景

Laravel には S3 を操作できる便利なライブラリ Flysystem が備わっておりますが,これを使用するには AWS IAM ポリシー の設定が必要です。その設定方法を解説する記事は Qiita にも数多く見られますが,ほぼ揃って「AmazonS3FullAccess をアタッチする」と解説してます。

しかし AmazonS3FullAccess の権限内容を見てみると,実に多くの権限が設定されており,その数はなんと 84 個Laravel で行う S3 操作 はファイル取得/保存/削除くらいなので,ここまで大きな権限が必要とは考えられません。必要以上の権限を与えることは IAM のベストプラクティスに反します。

IAM のベストプラクティス: 最小権限を付与する


IAM ポリシーを作成する場合、最小限のアクセス権を付与するという標準的なセキュリティアドバイスに従うか、タスクの実行に必要なアクセス許可のみ付与します。ユーザー (およびロール) が何をする必要があるのかを決定し、それからそれらのタスクのみの実行を許可するポリシーを作成します。


そこで Laravel による S3 操作に必要な最小権限を与える IAM ポリシーについて調べてみました。


結論

とは言っても,公式ドキュメントにすべて書いてありました。

Flysystem: Aws S3 Adapter V3


The required IAM permissions are:

{

"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1420044805001",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:ReplicateObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
]
}
]
}

必要な権限は Actions 以下の 7 つの許可です。

Resource 以下を操作対象のバケット名とパスに書き換えれば,コピペでいけます。上記の IAM ポリシーを AmazonS3FlysystemAccess などの名前で作成し, IAM ユーザや IAM ロールにアタッチしましょう。

以上,権限の付与しすぎに注意しつつ,よい AWS ライフを!