AWS KMSのカスタマーマネージドキーの使用権限は、IAMロールとキーポリシーがある

# はじめに
S3やストレージの暗号化の際に利用できるAWS KMSというサービスがあります。
キーのタイプとして、AWSが作ったAWSマネージドキーと、自分で作るカスタマーマネージドキーがあります。

今回はカスタマーマネージドキーでEC2のストレージを暗号化する際に、キー使用の権限で勘違いしていたことがあったので、記事にしました。

# 概要
- カスタマーマネージドキー作成の際に、使用するユーザー・ロールを指定してキーポリシーに追加できる。
- キーポリシーでユーザー・ロールを指定しなくても、IAM側で対象のキーを使用できる権限があれば使える。
    - 正確には、キーポリシーに **IAMで許可されたら使える設定** がデフォルトで入っている。
- IAM側で使用可を明示していなくても、キーポリシーに指定すれば使える。
- IAM側で明示的に拒否されていると、キーポリシーに入れても使えない。

# 参考

https://techblog.nhn-techorus.com/archives/19100


# 困ったこと

EC2のストレージを暗号化するために、以下のキーを作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b164cf36-6eeb-125f-8957-f1c2695def11.png)
ただし、キーポリシーで使用できるユーザを誰も指定していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/2892e821-9028-cd92-955c-2bfc20da4740.png)

これを使って、ストレージを暗号化したEC2を作ってみます。キーポリシーで誰も指定していないから、失敗すると思っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/422a84dc-2610-2bb7-f6a0-de0ba0136291.png)

作れちゃいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/dca72d67-aa9b-08ac-67f7-524d855f94fc.png)
停止もできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e3cd61ff-307b-9a9e-de47-191a07a0e907.png)

キーの効果がないのかな、と思い、キーを無効にして、起動を試みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0ed4ec87-1b71-982c-df63-19b434df3256.png)
保留中にはなるのですが、すぐに停止済みになってしまいます。起動に失敗するということは、暗号化したストレージを復号できないということなので、ちゃんとキーを用いて暗号化しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9c5854e5-bbc3-52b1-590f-5df4638a01fc.png)

キーを再度有効にすると、ちゃんと起動します。
キーポリシーになにも指定していないのに、なぜ暗号化できるのか、わかりませんでした。

# 実際は
キーのポリシービューに答えがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/15bdcb9d-8756-422c-5978-93064d4e193a.png)

参考のページにもありますが、IAMで許可されたら使える設定になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e25c3e8e-04da-5c32-d9d3-4744fb25b08a.png)


# 試す

ではIAMでKMSの操作を持たないたユーザーを作って試してみます。
```yaml:createPu.yml
Resources:
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      LoginProfile:
        Password: myP@ssW0rd
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonEC2FullAccess
```
このユーザーで、先ほどのEC2を停止->開始を試みてみます。
KMSが使えないので、起動できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4478f78d-95ad-44b2-af8b-1e7e7ea82ef5.png)

ではキーポリシーに、このユーザーを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6a79b5dd-5d82-129f-8a74-33b5f0792cd9.png)

もう一度起動を試みると、起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fd9dfc5f-c67a-fe75-9336-aa0980b5bdf9.png)

なお以下のように、IAMポリシーで明確に拒否されていると、キーポリシーに追加しても起動できませんでした。

```yaml
Resources:
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      LoginProfile:
        Password: myP@ssW0rd
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/PowerUserAccess
      Policies:
      - PolicyName: denyKms
        PolicyDocument:
          Statement:
          - Effect: Deny
            Action:
            - kms:*
            Resource: '*'
```


# おわりに

今回はKMSでの暗号化で、自分の理解不足を記事にしました。
AWS認定のSCSの範囲とのことですので、次はSCSの取得を目指そうと思います。
この記事がどなたかのお役に立てれば幸いです。