本記事の概要
本記事は以下のことが記述されています。
- IAMポリシーで「最小権限」を手動で一つずつ設定していくのは大変
- 現実的には、AWS管理ポリシーをベースにして「そこそこ制限された権限」を設定する方が楽で良さそう
- 「そこそこ制限された権限」を設定する手順
IAMポリシーのベストプラクティス「最小権限を付与する」
AWSの「IAM のベストプラクティス」の「最小権限を付与する」によると https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#grant-least-privilege
IAM ポリシーを作成する場合、最小限のアクセス権を付与するという標準的なセキュリティアドバイスに従うか、タスクの実行に必要なアクセス許可のみ付与します。ユーザーが何をする必要があるのかを決定し、それらのタスクのみを実行できるようにユーザー用のポリシーを作成します。
当然と言えば当然なことなのだが、UserやRoleには必要最小限の権限を付与したポリシーを作成して、それをアタッチするべき。
「最小権限を付与する」手順
しかしながら、この「最小権限を付与する」ことを実際の作業に置き換えつつもう少し詳細に記述すると、
- アクセス可能なAWSリソースとそれに対するアクションを全て理解し、一つずつ確認していき、必要なものだけを付与する
ということになる。
IAMポリシーを設定する場合、AWSの各リソース毎にさらに分類されたリソースが定義されているため、これらの分類されたリソースについても把握が必要である。 例えば、DynamoDBの場合には、以下の分類されたリソースがある。
- table
- index
- backup
- global-table
- stream
上記の内容は、DynamoDBのドキュメント「DynamoDB API のアクセス権限: アクション、リソース、条件リファレンス」に記述されている。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/api-permissions-reference.html
ここで「特定のテーブルに対して、マネジメントコンソールから項目を閲覧可能な権限だけを付与したい」という権限を付与したIAMポリシーを作成したいとする。
この場合、対象のテーブルのARNを指定する他に、以下のアクションを指定する。
- ListTables
- DescribeTable
- Query
- Scan
ListTables と DescribeTableは、マネジメントコンソール上で画面遷移する際に必要となる。
また、ListTablesの対象リソースは全テーブルであるため、特定テーブルに対する権限は以下のようになる。
上記のケースでは、付与したリソースは2種類、アクションは4つだけで、おそらくこれが「最小権限」となる。
「最小権限を付与する」コスト
作業コストがそこそこ高い
今回の要件は「特定のテーブルに対して、マネジメントコンソールから項目を閲覧可能な権限だけを付与したい」である。 上記の手順をまとめると、以下のフローとなる。
- 特定テーブルをリソースとして指定する
- 必要そうな権限を指定していく
- 実際にポリシーを付与したIAMユーザーがマネジメントコンソール上で権限過不足を確認する
- 問題があれば2へ
権限の把握と、実際の動作確認まで必要になる。 DynamoDBだけであればあればまだしも、実際にこのようなポリシーを作成する場合には、例えば合わせて以下のような要件があったりする。
- Cloudwatch logsの特定のロググループの読み込み権限
- S3の特定のバケットの読み込み権限
- RDSの特定のデータベースの読み込み権限
これら全てに対して、先ほどのフローを適用していく必要があるとなると、コストは結構高くなる。 (あんまり楽しい作業ではないし)
EC2とかは作業コスト激高
また、例えばEC2に対するポリシー設定を考えた場合、アクション数274、リソース数13である。 これを全部確認していくなんて考えたくない。
ドキュメント参照コストも高い
IAMポリシーのアクションとリソースのリストもどこかにまとまってはおらず、各AWSリソースのドキュメントの「アクセス権限」的なページ(ページ名もバラバラ)に記載されているため、探すのもひと手間かかる。
再掲するがDynamoDBであれば、以下のページに記載されている。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/api-permissions-reference.html
一方、EC2の場合は以下。
こちらはドキュメントも膨大です。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html
ちなみに僕はこのようなドキュメントを探す際は、Google検索で「EC2 アクセス権限」のようにして探している。
(AWS のドキュメント内で探すよりも見つけやすいと思うが、皆さんどうしているのだろうか)
ドキュメントが纏まっていて、もう少し見やすければまだやりやすいかもしれないが、いずれにしても手間が大きい。
「最小権限」をちょっと緩く
「最小権限を付与する」は正しい。
AWSがベストプラクティスとしているのだから、間違いなく正しい。
しかし、そんなにコストをかけられないという現実的な問題がある。
「とりあえずPowerUser付与しちゃおう」
というのは、やってしまいがちなことではないかと思う。(僕も実際やってるし)
「最小権限」でなくとも、「ちょっと過剰ではあるけど、必要な制限はされている」くらいの「そこそこ制限された権限」をもう少し楽にできた方が良さそう。
AWS管理ポリシーを使用する
管理ポリシー
AWSには「管理ポリシー」が沢山用意されている。
用途別にアクセス権限が制限されたポリシーのテンプレートみたいなもの。
以下ドキュメントに記載されている以外にも、マネジメントコンソールのポリシー画面にはたくさん表示される。
https://docs.aws.amazon.com/jajp/IAM/latest/UserGuide/accesspolicies_job-functions.html
まずは、この管理ポリシーを適用するだけで解決できないかを考える。
管理ポリシーを適用する手順
管理ポリシーは汎用的なものであるため、「特定リソースへのアクセスだけを許可したい」という場合には、管理ポリシーをベースにした上で、リソースを別途指定する必要がある。
これには、「管理ポリシーのインポート」機能を使用できる。
管理ポリシーのインポート機能
例えばDynamoDBの読み込み権限を与えたい場合は、"AmazonDynamoDBReadOnlyAccess"が使えるかを検討する。
リソースとアクションを調整する
この管理ポリシーをベースにして、リソースを指定しようとすると、設定したいものとは関係のないリソースまで指定しろと言われることがある。
上記の例では、backupとかglobal-tableとか全然使う予定がないけど、リソース指定しろと表示される。
これは"AmazonDynamoDBReadOnlyAccess"に、"DescribedGlobalTable"とか"DescribeBackup"のアクションが含まれているためである。
この場合は、backupとかglobal-tableのリソース指定が必要なアクションを除外すると、元々制限したかった特定のテーブルだけをリソース指定するだけで良い。
「最小権限」よりは多くの権限が付与されているが、制限したいリソースを指定した上で「そこそこ制限された権限」を設定できている。
この手順であれば、「不要なアクションを除外する」を考えるだけなので、作業コストは低くなるし、場合によってはドキュメントも参照しなくていい。
まとめ
「そこそこ制限された権限」を低コストで実現するためには以下の手順を実施する。
- AWS管理ポリシーをインポートする
- 制限したいリソースを指定する
- 不要なアクションを除外する
確認はやはり必要にはなるが、随分楽な手順で要件を満たすことができる。
余談 (ViewOnlyAccess)
ドキュメントを読んでいて、ViewOnlyAccessという管理ポリシーを発見。
リソース指定まではできないが(というかすると多くのアクションを除外することになるので)、手っ取り早く読み込み・閲覧権限を与えたい場合は、これでいいかもしれない。