背景
Laravel には S3 を操作できる便利なライブラリ Flysystem が備わっていますが,これを使用するには AWS IAM ポリシー の設定が必要です。その設定方法を解説する記事は Qiita にも数多く見られますが,ほぼ揃って「AmazonS3FullAccess
をアタッチする」と解説してます。
しかし AmazonS3FullAccess
の権限内容を見てみると,実に多くの権限が設定されており,その数はなんと 84 個 。Laravel で行う S3 操作 はファイル取得/保存/削除くらいなので,ここまで大きな権限が必要とは考えられません。必要以上の権限を与えることは IAM のベストプラクティスに反します。
IAM ポリシーを作成する場合、最小限のアクセス権を付与するという標準的なセキュリティアドバイスに従うか、タスクの実行に必要なアクセス許可のみ付与します。ユーザー (およびロール) が何をする必要があるのかを決定し、それからそれらのタスクのみの実行を許可するポリシーを作成します。
そこで Laravel による S3 操作に必要な最小権限を与える IAM ポリシーについて調べてみました。
結論
とは言っても,公式ドキュメントにすべて書いてありました。
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 ライフを!