KMS権限の許可(create-grant)について

AWS各サービスを利用する前に、それぞれ必要な権限を事前に付与しないといけません。参照、更新、実行のような権限を付与するのはよく利用されると思います。一方で、KMSには権限授与という権限を持っています。これがどういう権限なのか、以前理解しきれなかったので、今回改めてドキュメントを読んで実際にやってみたら、より理解深くなるのでメモしときます。

KMSの許可って何?

公式ドキュメントに詳細記載しています。簡単にいうと、被付与者に一時的にKMSに対する利用権限を付与します。また、権限の付与停止もできます。

許可の使用

どうやって付与するの?

許可を作成するには、 CreateGrant オペレーションを呼び出します。公式ドキュメントにも以下の例があります。

次の CreateGrant コマンドは、指定された 対称 KMS キー で Decrypt オペレーションを呼び出し、exampleUser を許可する権限を作成します。許可では、RetiringPrincipal パラメータを使用して、許可を無効にできるプリンシパルを指定します。また、リクエスト内の 暗号化コンテキストに "Department": "IT" が含まれている場合にのみアクセス許可を許可する許可制約も含まれます。

aws kms create-grant \
   --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
   --grantee-principal arn:aws:iam::111122223333:user/exampleUser \
   --operations Decrypt \
   --retiring-principal arn:aws:iam::111122223333:role/adminRole \
   --constraints EncryptionContextSubset={Department=IT}

付与された権限の確認方法は?

以下のCLIでKMSキーのIDを指定して、対象KMSキーの権限付与状況を確認できます。

aws kms list-grants --key-id xxxxxxx

※以下はKMSキーを一時権限付与していない状態です

APIを利用してIAMユーザ等に権限付与するのは理解しやすいと思います。ただし、暗黙的にKMSキーの利用権限が付与されるパターンもあります。これを理解すれば、KMSを利用する時に、どういった権限を付与すべきか理解できます。そして、いくつ暗黙的にKMS権限付与される例をご紹介します。

EC2インスタンスを作成する時に、暗号化のEBSを付与する

セキュリティ許可するために、EC2インスタンスにアタッチされたEBSが全部暗号化されるのはお勧めです。
EBS暗号化するために、操作するIAMユーザが以下の権限を持っている必要があります。
EBS暗号化権限

kms:CreateGrant
kms:Decrypt
kms:DescribeKey
kms:GenerateDataKeyWithoutPlainText
kms:ReEncrypt

KMSキーの一覧を確認するために、KMSキーのリスト権限も付与します。また、EC2を作成するために、一応EC2フル権限を付与しますが、実際の業務には要件に従って適宜なEC2権限を付与しましょう。
IAMユーザ権限

詳細の作成手順を割愛させていただきますが、EBSを作成する時に、下記のように暗号化KMSキーを選択します。

EC2インスタンスを作成すると、EC2コンソールから下記のようにEC2が作成されたことを確認できます。
EC2 Running

また、再度KMSキーの権限授与を確認すると、特定なEBSに対してKMSキーに対する復号権限が授与されたことも確認できます。これで、実際にEC2に対して明示的に権限を付与してしないですが、操作ユーザが権限付与(CreteGrant)の権限が持っているので、EC2(EBS)に一時的にKMSキーを利用して復号権限を付与しました。
そして、EC2を停止する時に、一時付与された復号権限も回収されます。興味ある方は自分で試しましょう笑!

Lambdaの環境変数をKMSキーで暗号化する

Lambda関数を柔軟に利用するために、lambdaの環境変数がよく利用されていると思います。
セキュリティのため、環境変数は暗号化するのをお勧めです。
lambdaはKMSキーと統合されていてKMSキーを簡単に利用できます。
設定方法も簡単で下記のように、環境変数を追加する時にKMSキーを指定すればできます。

これで保存すると、Lambda関数に対してKMS権限を付与されたことも確認できます。
特にLambdaに対してKMSの使用権限を付与しなくても、KMSのcreate-grantを利用して適切な権限を自動的に付与してくれます。

ちなみに、AWSコンソールにログインしたIAMユーザがKMSの使用権限がない場合、下記のようにLambdaに設定した環境変数を確認できません。

纏め

いかがでしょうか。よく利用するAWSサービスが基本KMSと統合しているので、暗号化することは便利でしょう。
AWSのベストプラクティスでは、必要な最小権限を付与することなので、create-grantを理解した上で必要な権限のみ付与しましょう。

Last modified: 2021-11-28

Author