S3 の特定のフォルダのみにアクセス権限を与える

S3 の特定のフォルダのみにアクセス権限を与える

背景: 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 記事をしっかり読んでおくと、トラブルは少ないと思います。(私の場合、流し読みしてて重要な点を読み飛ばしていたため、余計な時間を食ってしまいました。)

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

それだとあんまりなので、個人的に参考になった情報を載せておきます。

AWS はドキュメントは充実してるんですが、機能が豊富すぎるので、必要な情報を探すのも一苦労です。

同じ事をするのに色々方法がある

前述の IAM ポリシー vs. バケットポリシーもそうですし、バケットポリシーを使う場合でも、色々やり方があります。

NotPrincipalを使う方法とか、

amazon web services – S3 Bucket Policy to Allow access to specific users and restrict all – Stack Overflow

Conditionsを使う方法とか、

Writing IAM Policies: Grant Access to User-Specific Folders in an Amazon S3 Bucket | AWS Security Blog

色々あります。

まとめ

AWS の権限設定は、機能豊富で色々選択肢があります。公式ドキュメントで基本をある程度押さえつつ、AWS blog や、その他サイトなどでやりたいことと近い例を探して、それをベースに設定していく、というのが初心者には良いと思います。

本記事では、S3 の権限設定に関する基本的な情報へのリンクを紹介すると共に、分かりにくい点をいくつか説明しました。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。