ReadOnlyAccessは何を見るか？

MEGAZONE 株式会社 のテック陣「MEGAZONEのゆかいな仲間たち」がおくる、Megazone Japan Advent Calendar 2023 の12日目のエントリーです。

## はじめに
僕「あるAWSアカウントの環境をチェックしたいので**ReadOnlyAccess**のIAMユーザーを発行してください。」

管理者「必要となる権限の詳細を知りたい。対象のAWSサービスを絞れますか？」

僕 （利用中のAWSサービスは知っている...。そのAWSサービスの **〇〇ReadOnlyAccess** を全部アタッチしてもらおうかな:thinking:）

そんなふうに考えていた時期が私にもありました。

## 課題: 〇〇ReadOnlyAccessが存在しないAWSサービスもある
AWSが用意しているIAMポリシーである[AWSマネージドポリシー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies "AWS マネージドポリシー")
の中には、「AmazonEC2ReadOnlyAccess」や「AmazonS3ReadOnlyAccess」といった特定サービス向けのIAMポリシーがあります。

例えば以下のAWSサービスに対するReadOnlyAccessが必要だった場合、

* Amazon EC2
→AmazonEC2ReadOnlyAccess
* Amazon S3
→AmazonS3ReadOnlyAccess
* Amazon Route53
→AmazonRoute53ReadOnlyAccess
* AWS Key Management Service (AWS KMS)
→???

AWS KMSにはPowerUserはあるけどReadOnlyAccessが存在しない...。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/e33812f9-8c98-2b21-fd9f-15d542caee2c.png)

さてどうしたものか。無いなら自分で作ってしまおう！ということで[IAMポリシーの自作](https://qiita.com/Bibulous/items/8ab3eddb7c8760a0a99b)です。

## IAMポリシー作成(AWS KMS用のReadOnlyAccess)
まずどんなActionを許可すればよいか確認します。

* 何がしたいのか？
→AWS KMSをReadOnlyしたい。

* 作成するIAMポリシーにはどのAction許可が必要か？
→えーと...LISTとかDescribeの全部(でいいのかな？)

果たして、AWS KMSにはどんなActionがあるのだろうか。

■パターン1: Policy editorで許可Actionを判断する
IAM > Policies > Create policyへ移動。
Policy editor(Visual)で「KMS」と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/27cb0f49-7f64-d315-7e34-bfed830ce39b.png)

↓
Access levelを覗いてみるとLISTの中にLIST関連が、READの中にDescribeがいる。じゃあLISTとREADのAll Actionを選択でいいかな？
・Policy editor(Visual)での表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/5b4dfd70-d9c0-0213-2ca3-c6f36827e16d.png)
※ResourcesはAll(*)にしています

・Policy editor(JSON)での表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/1f595108-c39a-8b4f-5a68-9553127bee6e.png)

各ActionのInfoをクリックすると説明が表示されるので、何ができるのか確認することができます。必要か不要かはこれで判断。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/3b54ad67-a99c-b541-de6a-82fc04aaeef7.png)


■パターン2: ReadOnlyAccessから許可Actionを判断する
AWS公式であるReadOnlyAccessから、AWS KMS関連の許可Actionをコピーしようという方法です。

後述のJSONをコピーして作成する方法がお勧めですが、以下の手順で許可Actionを確認することができます。
IAM > Policies > ReadOnlyAccess へ移動し、Permissionsで「KMS」を検索してクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/3cc8ac0f-fa64-64b5-0798-56cd353bdcb8.png)

52個のActionのうち12個が許可されていますね。これ見ながらPolicy editor(Visual)でポチポチするのはちょっと嫌:sweat:
Excel等に許可Actionをまとめたい、といったケースでは役に立つかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/f0d0c6e8-bad8-7d88-774e-263d62adeefd.png)

・JSONをコピーする方法
ReadOnlyAccessのJSONの内容は、AWSドキュメントまたはIAMのページで確認できます。

https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/ReadOnlyAccess.html

パパッと調べたいならAWSドキュメントの方が楽ですが、更新遅れなどが不安な場合はIAMのページからでも。

IAM > Policies > ReadOnlyAccess へ移動しJSONを表示。
表示したJSONの中から「kms:」の行をコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/09cbbe3a-2f0c-2d54-a881-89fa63d88abb.png)
※自分のブラウザではJSON内を文字検索できなかったので、Copyをクリックしてテキストに移したほうが速いかも

[パターン1]同様にPolicy editorで「KMS」を選択し、JSONのActionパラーメータをコピーした内容に書き換えます。
```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "VisualEditor0",
			"Effect": "Allow",
			"Action": [
				"kms:Describe*",
				"kms:Get*",
				"kms:List*"
			],
			"Resource": "*"
		}
	]
}
```
※Action最後の「,」の位置に注意です

・Policy editor(Visual)での表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632907/3c5d98d5-8dda-8865-45d1-a4b2a74bd61b.png)

[パターン1]と同様にAccess levelのListとReadが全て許可されています。

■[パターン1],[パターン2]どちらも結果は同じ？
今回のAWS KMSではどちらの方法でも許可Actionは同じでしたが、他のAWSサービスでは一致しないことがあります。(主にGet関連)
とくに細かな要件がなければ、[パターン2]のほうが無難ですかね。AWS公式のReadOnlyAccessから抜粋しましたと言えますので。

## おわりに
ReadOnlyAccessならもらえるだろうと思っていたらもらえなかった話でした。ポリシー作成手順よりも、何をもって正しいと判断するかの基準が大切だと感じました。