特定システムに限定する運用者向けIAMユーザの最小権限について

## はじめに
「**最小特権アクセス許可を適用する**」
AWSでは[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)として、
このように定義されているためこの考えは一般的かと思います。

したがって、
アカウント内にシステムが混在している状況にて特定システムを対象にIAM権限を設定する状況では、
「ARN」や「リソースタグ」にてアクション対象を絞るといった検討になるのではないでしょうか。

本記事では最小特権というルールに準拠して、
管理者へIAM権限の払い出しを行う際の考慮(手順/注意点)に関する記事となります。

## 結論
全サービス全アクションを「リソースタグ」や「ARN」にて制限することは不可能であり、
特定のアクション実行を検知する方法の検討、もしくはアクションの実行をDenyする必要がある。

## 背景
今回はAWSアカウント内に複数のシステムが混在している中、
特定システムに対する作業者に対してGUI上での操作権限を付与する必要があると仮定する。

## 最小特権を洗い出すための手順
1：最小特権付与対象が使用予定のサービスの種類を確認
2：確認したサービスから実施したいアクションレベルを確認
3：確認した情報を元に、[サービス認証リファレンス](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference.html)から各サービスごとに必要なアクションを洗い出す
4：必要なアクションに対し「ARN」「リソースタグ」での制限を検討する
5：「ARN」や「リソースタグ」での制限不可のアクションについての検討

## 手順の詳細
ここからは各手順の実施方法についての確認

### 1：最小特権付与対象が使用予定のサービスの種類を確認
ここでは単純に利用者に対し、使用予定のサービス種類を伺う。
今回は例として「ECR」に関するサービスの最小特権を検討する。

### 2：確認したサービスから実施したいアクションレベルを確認
レベルは「リスト」「読み込み」「タグ付け」「書き込み」「アクセス権限の管理」の5分類で確認。
利用者の要望/付与した意見減に応じて「ECS：リスト,読み込み,書き込み」などサービスとアクションレベルをセットで確認する。

本記事では利用者の要望として「ECR：読み込み」権限の要望を受けたと仮定する。

### 3：確認した情報を元にサービス認証リファレンスから各サービスごとに必要なアクションを洗い出す
要望を受けた「ECR：読み込み」アクションの全量を[サービス認証リファレンス](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference.html)内から確認する。
※アクセスレベル列から「読み込み」があるアクションが全量となる。
![2023-02-11_09h18_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/9ec47bd9-eb18-ff3e-6b88-995a5a1cdccd.png)

### 4：必要なアクションに対し「ARN」「リソースタグ」での制限を検討する
[サービス認証リファレンス](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/reference.html)内の「リソースタイプ (* 必須)」「条件キー」列から制限方法を確認する。
確認のポイントとして、**「リソースタイプ (* 必須)」に何かしらの記載があるもしくは、「条件キー」欄に"ResourceTag/${TagKey}"の記載が存在することに注目する**。
つまり、「リソースタイプ (* 必須)」に記載があれば、ARNでアクションを限定することが可能である。
また、「条件キー」欄に"ResourceTag/${TagKey}"の記載があれば、
リソースに付与できるタグを元にアクション制限を行える。
上記いずれかの記載があるリソースについては「ARN」「リソースタグ」を元にアクション制限が可能となる。

※リソースタイプに記載があるアクション例(BatchCheckLayerAvailability)
![2023-02-12_23h32_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/de33b077-f46f-b893-af55-6483e3183070.png)

#### 4-1：「ARN」での制限方法
ARNでの制限方法はサービスリファレンス内にARNの記載方法があり、
ポリシー内Resorce句にて制御を行う。
本記載を元にポリシーを記載すると以下の通りになる。
![2023-02-12_23h36_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/0c4db5f4-39fd-3215-2402-0edabdc665da.png)
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ecr:BatchCheckLayerAvailability",
            "Resource": "arn:aws:ecr:ap-northeast-1:<AWSアカウントID>:repository/<リポジトリ名>"
        }
    ]
}
```

#### 4-2：「リソースタグ」での制限方法
リソースタグでの制限方法はサービスリファレンス内にリソースタグの記載方法があり、
ポリシー内Condition句にて制御を行う。
本記載を元にポリシーを記載すると以下の通りになる。

ECRにはタグ制御可能なアクションが存在しないため、ここでは[ElastiCacheサービス認証リファレンス](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonelasticache.html)を元に確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/8584a051-efcc-0d7a-30e3-4c3f24d64875.png)

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "elasticache:ModifyCacheSubnetGroup",
            "Resource": "*",
            "Condition":{
                "aws:ResourceTag/<タグのキー>":"<タグ値>"
            }
        }
    ]
}
```
### 5：「ARN」や「リソースタグ」での制限不可のアクションについての検討
リファレンスに「リソースタイプ (* 必須)」「条件キー」欄に記載がないアクションについては、
リソース単位での制御が不可能なため、全リソースに対する許可か全リソースに対する拒否のいずれかしか選択できない。

例えば、以下「DescribeRegistry」アクションは特定のECRに対してのみの許可ができず、
権限を与えるとしたら全ECRに対するの許可もしくは、全ECRに対する拒否しか設定できない。
　※今回例に「読み込み」アクションを記載しているが、書き込みアクションなども該当する場合がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/0c3f9b42-5ae7-7822-a9b2-08dbd8f88067.png)

上記のような制御困難なアクションを付与する必要がある場合は、
本アクションに対する監視を検討すべきであり、
「CloudTrail+CloudwatchLogs+Eventbritge+SNS」等のサービスの組み合わせを検討すべき。

## 終わりに
今回は特定の状況下において、IAM権限の制限検討を行う際のポイントを記載しました。
同様の検討で悩まれている方の手助けになれば幸いです。