本記事は以下のことが記述されています。ポリシーを作成する場合、最小限のアクセス権を付与するという標準的なセキュリティアドバイスに従うか、タスクの実行に必要なアクセス許可のみ付与します。ユーザーが何をする必要があるのかを決定し、それらのタスクのみを実行できるようにユーザー用のポリシーを作成します。当然と言えば当然なことなのだが、UserやRoleには必要最小限の権限を付与したポリシーを作成して、それをアタッチするべき。「最小権限を付与する」手順しかしながら、この「最小権限を付与する」ことを実際の作業に置き換えつつもう少し詳細に記述すると、アクセス可能なAWSリソースとそれに対するアクションを全て理解し、一つずつ確認していき、必要なものだけを付与するということになる。IAMポリシーを設定する場合、AWSの各リソース毎にさらに分類されたリソースが定義されているため、これらの分類されたリソースについても把握が必要である。DynamoDBの場合には、以下の分類されたリソースがある。アクション、リソース、条件リファレンス」に記述されている。https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/api-permissions-reference.htmlここで「特定のテーブルに対して、マネジメントコンソールから項目を閲覧可能な権限だけを付与したい」という権限を付与したIAMポリシーを作成したいとする。この場合、対象のテーブルのARNを指定する他に、以下のアクションを指定する。DescribeTableは、マネジメントコンソール上で画面遷移する際に必要となる。ListTablesの対象リソースは全テーブルであるため、特定テーブルに対する権限は以下のようになる。上記のケースでは、付与したリソースは2種類、アクションは4つだけで、おそらくこれが「最小権限」となる。「最小権限を付与する」コスト作業コストがそこそこ高い今回の要件は「特定のテーブルに対して、マネジメントコンソールから項目を閲覧可能な権限だけを付与したい」である。上記の手順をまとめると、以下のフローとなる。特定テーブルをリソースとして指定する必要そうな権限を指定していく実際にポリシーを付与したIAMユーザーがマネジメントコンソール上で権限過不足を確認する問題があれば2へ権限の把握と、実際の動作確認まで必要になる。DynamoDBだけであればあればまだしも、実際にこのようなポリシーを作成する場合には、例えば合わせて以下のような要件があったりする。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の場合は以下。こちらはドキュメントも膨大です。アクセス権限」のようにして探している。ドキュメント内で探すよりも見つけやすいと思うが、皆さんどうしているのだろうか)ドキュメントが纏まっていて、もう少し見やすければまだやりやすいかもしれないが、いずれにしても手間が大きい。「最小権限」をちょっと緩く「最小権限を付与する」は正しい。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という管理ポリシーを発見。リソース指定まではできないが(というかすると多くのアクションを除外することになるので)、手っ取り早く読み込み・閲覧権限を与えたい場合は、これでいいかもしれない。(ViewOnlyAccess)。