IAMポリシーを触るならポリシーバージョン系アクションは基本全て許可するべし！

# はじめに
`AdministratorAccess`権限では権限が強すぎるので、AWSのインフラ運用者に`PowerUserAccess`権限や`SystemAdministrator`権限を与えて、それらの権限で触ることができないIAM系の権限を追加で設定してインフラ運用者側でIAMロールやIAMポリシーを管理・運用しているシステムは多いのではないかと思います。

そんなシステムで私が経験した問題を共有しようと思います。

## IAMポリシーバージョンとは
IAMポリシーは過去のIAMポリシー設定をバージョン管理しており、IAMポリシー画面の、「**ポリシーのバージョン**」のタブより、過去５世代前までのバージョンの設定に戻すことができるようになっています。

IAMポリシーを作成する権限となる`CreatePolicy`などと比べると分かりづらい権限とはなりますが、IAMポリシーを運用するためには必要な権限となります。

IAMポリシーバージョンのアクションは全部で以下５つとなりますのでAWSマネジメントコンソール上から操作する際にどの部分の設定に当たるかをそれぞれ紹介します。

|アクション|内容|
|:--|:--|
|[ListPolicyVersions](#listpolicyversions)|IAMポリシーバージョンのリストを表示するのに必要|
|[GetPolicyVersion](#getpolicyversion)|IAMポリシー内容の表示に必要|
|[CreatePolicyVersion](#createpolicyversion)|新しいIAMポリシーバージョンを作成する場合に必要|
|[DeletePolicyVersion](#deletepolicyversion)|IAMポリシーバージョンを削除する場合に必要|
|[SetDefaultPolicyVersion](#setdefaultpolicyversion)|デフォルトのIAMポリシーバージョンを変更する場合に必要|

### ListPolicyVersions
「**ポリシーのバージョン**」から存在するポリシーバージョン一覧を確認するために必要な権限となります。

![Monosnap_20250208_153104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/172b1ec0-55a6-92e4-c3ba-e7e630cbab2c.png)

### GetPolicyVersion
「**許可**」から現在のポリシー設定を表示させるために必要な権限となります。

また、権限がない場合、ポリシー設定の「**編集**」画面にも遷移できなくなるため、AWSマネジメントコンソール上でIAMポリシーを設定するためには必須となる権限となります。

![Monosnap_20250208_153939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/2a5dd644-5375-f3e8-4238-56b6acaaa227.png)

### CreatePolicyVersion
IAMポリシーを更新する際に必要な権限となります。

なお、`CreatePolicyVersion`の権限が必要となるのはIAMポリシーを更新する場合であり、IAMポリシーを新規作成する際には不要となります。

### DeletePolicyVersion
「**ポリシーのバージョン**」から古いバージョンを削除する場合に必要な権限となります。

![Monosnap_20250208_153258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/060e6104-52d4-28e2-86c8-18e9b9b20cce.png)

### SetDefaultPolicyVersion
「**ポリシーのバージョン**」から最新以外のバージョンをデフォルトとして設定する場合に必要な権限となります。

![Monosnap_20250208_153209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/563aba21-59fa-0b31-8a8f-57fad9422ea2.png)

## IAMポリシーを管理・運用していくために最低限必要なIAMポリシーバージョン権限
AWSマネジメントコンソールでIAMポリシーの作成・更新を行うことを前提とした最低限の権限としては最低限以下２つあれば、ある程度のIAMポリシーの運用を行うことが可能となります。

- `CreatePolicyVersion`
- `GetPolicyVersion`

最低限の権限で運用したい方は上記のみの権限でも可能ですが、後述の問題が発生することを理解したうえで検討してください。

## 最低限の権限での問題
最低限の権限でもIAMポリシーの作成・更新ができますが、以下のような問題が発生します。

- [許可画面で表示されるIAMポリシー設定と編集画面で表示されるIAMポリシーが異なる](#許可画面で表示されるiamポリシー設定と編集画面で表示されるiamポリシーが異なる)
- [IAMポリシーを５回更新したら更新できなくなる](#iamポリシーを５回更新したら更新できなくなる)

### 許可画面で表示されるIAMポリシー設定と編集画面で表示されるIAMポリシーが異なる
`ListPolicyVersions`のアクションは「**ポリシーのバージョン**」タブのバージョン一覧の表示に必要となる権限となりますが、バージョン一覧の表示だけではなく、IAMポリシーの編集にも関わってくる問題となります。

「**許可**」タブで表示されるIAMポリシーの設定は、前述の通り`GetPolicyVersion`の権限があれば以下のように画面表示され、<font color="red">**デフォルトのポリシーバージョン**</font>の設定が表示されます。

![Monosnap_20250208_131401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3bd7f534-ec01-0c09-7eb4-985126df2977.png)

IAMポリシーの編集画面に遷移するとポリシー設定が以下のように表示されますが、`ListPolicyVersions`の権限が無いと、<font color="red">**デフォルトのポリシーバージョンの設定ではなく、最初のポリシーバージョン**</font>の設定（つまりバージョン１の設定）が表示されます。

![Monosnap_20250208_131612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/835b2281-0f6b-3894-ebb8-bf51c2e5a894.png)

推測となりますが、おそらく編集画面でIAMポリシーの設定を表示する際、`ListPolicyVersions`権限で、存在するポリシーバージョンを取得し、デフォルトとなるIAMポリシーの設定を画面表示していると思われます。

その際、`ListPolicyVersions`権限が無いと、存在するポリシーバージョンが分からないため、IAMポリシー新規作成時に作られるバージョン１の設定が読み込まれます。
※編集画面の設定には最新バージョンに存在する「`s3:*`」の設定が無い

![policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/398ed3c1-70fe-6e66-8358-e44f40d9e399.png)

ちなみに`ListPolicyVersions`権限が無く、５世代以上更新していて最初のバージョン１が削除されている場合は以下のようにv1が無いと表示されることからバージョン１を読み込みに行っていることが確認できます。

![Monosnap_20250208_161302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/3b238634-8bde-7221-21a4-b36483ef4f3e.png)

編集画面で`ListPolicyVersions`に関するエラーが表示されるのであれば気づくことができますが、バージョン１のポリシー設定を読み込む際の権限は`GetPolicyVersion`権限で読み込まれ、もちろんポリシーの編集画面までたどり着けているのであれば`GetPolicyVersion`権限は付与されていることからエラーも表示されません。

エラーも表示されないことから気づくのが困難なので個人的にこの問題が一番事故につながる問題だと感じています。

### IAMポリシーを５回更新したら更新できなくなる
IAMポリシーのバージョンは過去５世代分しか保持できないため、IAMポリシー更新時に５世代を超える場合、一番古いバージョンの削除が行われます。

そのため`ListPolicyVersions`と`DeletePolicyVersion`権限が付与されていない場合、古いバージョンの削除が行えず、以下のようにIAMポリシーの更新ができなくなります。

![Monosnap_20250208_143154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/a1be2dbc-0dcf-a7a4-6a37-1bdff9304601.png)

`DeletePolicyVersion`権限だけではなく`ListPolicyVersions`の権限も必要となる理由としては、前述の「[許可画面で表示されるIAMポリシー設定と編集画面で表示されるIAMポリシーが異なる](#許可画面で表示されるiamポリシー設定と編集画面で表示されるiamポリシーが異なる)」と同様の理由で必要となると思われます。

## SetDefaultPolicyVersion権限は無くても何とかなる？
「全て許可するべし！」とタイトルをつけていますが、他の権限に比べれば`SetDefaultPolicyVersion`の権限は無くても何とかなります。

`SetDefaultPolicyVersion`権限が使われる場面としては、別バージョンに変更する場合となるため、常に最新バージョンを使う限りは影響ありません。

あるとすればIAMポリシー更新時に「**この新しいバージョンをデフォルトとして設定します。**」のチェックを外して更新した後、バージョン変更するときには多少影響がありますが、`SetDefaultPolicyVersion`以外の権限が許可されていれば、「**この新しいバージョンをデフォルトとして設定します。**」のチェックを行ったうえで再度ポリシーを更新し直すことでデフォルトバージョンが最新バージョンに切り替わるので、無くても何とかなります。

ただ、`SetDefaultPolicyVersion`以外の権限を付与しているのであれば、あえて`SetDefaultPolicyVersion`だけ除外する必要もないかと思うので、全て許可しておいたほうが良いでしょう。

# おわりに
ポリシーバージョン系のアクションは、`SetDefaultPolicyVersion`以外は、どれを抜いたとしても運用に大きく支障が出てしまうものとなります。

許可画面と編集画面のポリシー設定差異の問題については知っていないと大事故に繋がる可能性があり、さらに過去の設定に戻ってしまっている（デグレード）ことで作業品質や作業ミスを疑われてしまう可能性もあるため、IAMポリシーを運用する立場の場合、ポリシーバージョン系アクションは全て許可するようにしましょう。