背景: S3の権限設定は色々難しい
Amazon S3 は、(お金さえ出せば)容量を気にせず色んなファイルを置いておける便利なストレージで、様々な用途に使われています。
特定のフォルダを特定のユーザー(※)のみに使わせたいというのも一般的な要望かと思いますが、Windows や Linux サーバーのユーザー権限設定とは考え方が大きく異なる部分も大きく、色々な概念を理解しないと思った通りの結果になりません。
私自身、AWS の権限関連やポリシー関連はそこそこ業務で使っていたにも関わらず、いざやってみると上手く行かない事も結構あったため、ここでは S3 の権限設定に関する情報を色々まとめていきたいと思います。
なお、本記事の想定読者としては、AWS に関する基本的な知識は持っていることを前提とします。
※ここでの「ユーザー」は広い意味での言葉で、IAM のユーザーに限定されません
やりたいこと
- S3バケットが1つある (
example-bucket
) - ある IAM ユーザー
tom
に対して、以下のような権限を与える- 同バケットの特定のディレクトリ(
dir-a
)配下に、ファイルの読み書きが可能 - 同バケットの他の場所は、読み書き不可
- 同バケットの特定のディレクトリ(
- 他の IAM ユーザーは、全てのファイルを読み書き可能
- (全て、同一AWSアカウント内での話)
こうやった
バケットポリシーの設定
{
"Version": "2012-10-17",
"Id": "foo",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:user/tom"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example-bucket"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:user/tom"
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::example-bucket/dir-a/*"
}
]
}
ユーザーに対しては何の権限も与えていない
今回、対象の IAM ユーザー(tom)に対しては、policy, role など何も付与していません。
他のシステム(Windows, Linux, Oracle, etc.)でユーザー権限とかを管理している人からすると、直感的には
- 対象ユーザーに対して S3 への読み書きの権限を与える
- その上でバケットの当該フォルダーのみアクセスを許可する(あるいは、当該フォルダー以外はアクセスを禁止する)
という感じにするかと思いますが、AWS の権限関連は色々複雑です。
次の項で、分かりにくい部分・ハマりやすい点などを、分かる範囲に説明していきます。
分かりにくい点を雑多に説明
事前に読むべき情報
具体的な説明の前に1点。以下の AWS の blog 記事をしっかり読んでおくと、トラブルは少ないと思います。(私の場合、流し読みしてて重要な点を読み飛ばしていたため、余計な時間を食ってしまいました。)
- How to Restrict Amazon S3 Bucket Access to a Specific IAM Role | AWS Security Blog
- IAM Policies and Bucket Policies and ACLs! Oh, My! (Controlling Access to S3 Resources) | AWS Security Blog
IAM ポリシーと S3 バケットポリシー
今回の目的を達成するためには、(今回やったように)S3 のバケットポリシーを使っても良いですし、IAM ポリシーを使っても実現できます。複雑なユースケースでは、両方併用することがあるかもしれません。
それらをどう使い分けるべきかは、上の2つ目のブログ記事に書いてあるので、興味のある方は参照してみて下さい。
最初から用意されている AmazonS3ReadOnlyAccess
というポリシーがありますが、中身を見てみると以下のような JSON の定義になっています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
]
}
これは、全てのリソース(S3バケット)に対して読み込み系の権限を与えているので、今回、このポリシーを当該ユーザーに当ててしまうと、設定が面倒くさくなってしまいます。
ID とかが色々ある
AWS の権限周りを触っていると色んな用語が出てきて、慣れていないと混乱します。
IAM のユーザー、ロール、グループ、ポリシーについては基本的なことなので別のエントリーで説明しようと思いますが、ID っぽいものにも何種類かあります。
例えば、ユーザーに関して言うと以下のようなものがあります。
- ユーザー名:
tom
とか - ユーザーID:
AIDA
から始まる英数字の羅列 - ARN:
arn:aws:iam::アカウントID:user/ユーザー名
という形式のもの
ロールに関しても同様です。
Deny が常に Allow より優先される
上の方で紹介した 2つめの AWS blog の後半に詳しく説明されていますが、あるアクセスに対して適用可能なポリシーの中に Deny と Allow が両方あった場合、Deny が優先されます。
Condition の設定の仕方が分かりにくい
「XXユーザー以外のアクセスを許可したい」とかそういう場合に、ポリシーに Condition
というものを記載する事が出来ます。が、JSON でどう書けばいいかが分かりにくいです。出来ることが沢山あるのが原因の一つだとは思いますが。
以下のページに概要は書いてあり、また、そこからリンクされているページなども全部見れば良いのかもしれません。
IAM JSON Policy Elements: Condition – AWS Identity and Access Management
それだとあんまりなので、個人的に参考になった情報を載せておきます。
- オペレーターの一覧(
StringLike
とか) - Condition に使える “key”
- 使える変数(
aws:username
とか)
AWS はドキュメントは充実してるんですが、機能が豊富すぎるので、必要な情報を探すのも一苦労です。
同じ事をするのに色々方法がある
前述の IAM ポリシー vs. バケットポリシーもそうですし、バケットポリシーを使う場合でも、色々やり方があります。
NotPrincipal
を使う方法とか、
Conditions
を使う方法とか、
色々あります。
まとめ
AWS の権限設定は、機能豊富で色々選択肢があります。公式ドキュメントで基本をある程度押さえつつ、AWS blog や、その他サイトなどでやりたいことと近い例を探して、それをベースに設定していく、というのが初心者には良いと思います。
本記事では、S3 の権限設定に関する基本的な情報へのリンクを紹介すると共に、分かりにくい点をいくつか説明しました。