AWS KMS でのグラント - AWS Key Management Service

AWS KMS でのグラント

グラントはポリシーツールであり、AWS プリンシパルに暗号化オペレーションでの KMS キーの使用を許可します。また、KMS キー (DescribeKey) を表示して、グラントの作成、管理をできるようにします。KMS キーへのアクセスを認可する際、グラントはキーポリシーおよび IAM ポリシーと共に考慮されます。グラントは、作成してそのアクセス許可を使用し、キーポリシーまたは IAM ポリシーを変更することなく削除できるため、一時的なアクセス許可としてよく使用されます。

グラントは、一般的に、AWS KMS と統合された AWS サービスによって使用され、保管中のデータを暗号化します。サービスは、アカウント内のユーザーの代わりにグラントを作成し、そのアクセス許可を使用して、タスクが完了するとすぐにグラント廃止にします。AWS のサービス方法、グラントの使用方法の詳細については、AWS のサービスで AWS KMS を使用する方法 またはサービスのユーザーガイドあるいはデベロッパーガイドの保管時の暗号化トピックを参照してください。

複数のプログラミング言語による、グラントのオペレーション方法を示すコード例については、「許可の使用」を参照してください。

グラントについて

権限は、きわめて柔軟で便利なアクセス制御メカニズムです。KMS キーの権限を作成すると、権限で指定されたすべての条件が満たされている場合、権限の被付与者プリンシパルは、KMS キーに対して指定された権限オペレーションを呼び出すことができます。

  • 各グラントでは、正確に 1 つの KMS キーにアクセスできます。異なる AWS アカウント でKMS キーのグラントを作成できます。

  • グラントは KMS キーへのアクセスを許可できますが、アクセスを拒否することはできません。

  • 各グラントは、1 つ以上の被付与者プリンシパルを持つ必要があります。被付与者プリンシパルは、異なる AWS アカウント のアイデンティティである可能性があります。

  • グラントは、グラントオペレーションのみを許可することができます。グラントオペレーションは、グラントの KMS キーによってサポートされている必要があります。サポートされていないオペレーションを指定すると、ValidationError の例外により、CreateGrant リクエストは失敗します。

  • 被付与者プリンシパルは、アクセス許可がキーポリシーまたは IAM ポリシーから付与された場合と同様に、権限を指定せずに付与されたアクセス許可を使用できます。ただし、権限の作成、使用停止、取り消しの際、オペレーションが結果整合性を取得するまで短い遅延が発生することがあります (通常は 5 分未満)。権限でアクセス許可をすぐに使用するには、権限トークンを使用します

  • 認可されたプリンシパルはグラントを削除できます (グラントの廃止または失効)。グラントを削除すると、グラントが許可したすべてのアクセス許可が削除されます。グラントを取り消すために追加または削除するポリシーを特定する必要はありません。

  • AWS KMS は、各 KMS キーのグラント数を制限します。詳細については、「KMS キーあたりのグラント: 50,000」を参照してください。

グラントを作成するとき、およびグラントを作成する許可を他のユーザーに付与するときは注意が必要です。グラントを作成する許可にはセキュリティ上の影響があります。これは、kms:PutKeyPolicy 許可でポリシーを設定する場合と似ています。

  • KMS キー (kms:CreateGrant) のグラントを作成するためのアクセス許可を持つユーザーは、グラントを使用してユーザーとロール (AWS のサービスを含む) に KMS キーの使用を許可します。プリンシパルは独自の AWS アカウント、または異なるアカウントや組織のアイデンティティにすることができます。

  • グラントは、AWS KMS オペレーションのサブセットのみを許可します。グラントを使用して、プリンシパルに KMS キーの表示、暗号化オペレーションでの使用、グラントの作成、グラントの廃止を許可できます。詳細については、「グラントオペレーション」を参照してください。グラントの制約を使用して、対称暗号化キーに対するグラントにある許可を制限することもできます。

  • プリンシパルはアクセス許可を取得して、キーポリシーまたは IAM ポリシーからグラントを作成できます。ポリシーから kms:CreateGrant アクセス許可を取得したプリンシパルは、KMS キーの任意の付与オペレーションの許可を作成できます。これらのプリンシパルは、キーに対して付与している許可を持っている必要はありません。ポリシーで kms:CreateGrant アクセス許可を許可する場合は、ポリシー条件を使用してこの許可を制限します。

  • プリンシパルは、グラントからグラントを作成する許可を取得することもできます。これらのプリンシパルは、ポリシーからの他のアクセス許可を持っている場合でも、付与されたアクセス許可のみを委任できます。詳細については、「CreateGrant アクセス許可の付与」を参照してください。

グラントに関する概念については、Grant terminology を参照してください。

グラントの概念

グラントを効果的に使用するには、AWS KMS が使用する用語と概念を理解する必要があります。

グラントの制約

グラントのアクセス許可を制限する条件。現在、AWS KMS は、暗号化オペレーションのリクエストで、暗号化コンテキストに基づいてグラントの制約をサポートしています。詳細については、「グラントの制約の使用」を参照してください。

グラント ID

KMS キーのグラントの一意の識別子。キー識別子と共にグラント ID を使用し、RetireGrant または RevokeGrant リクエストでグラントを識別できます。

グラントオペレーション

グラントで許可できる AWS KMS オペレーションです。他のオペレーションを指定した場合、ValidationError の例外により、CreateGrant リクエストは失敗します。これらは、グラントトークンを承認するオペレーションでもあります。これらのアクセス許可の詳細については、AWS KMS アクセス権限 を参照してください。

これらのグラントオペレーションは、オペレーションを使用するアクセス許可を表します。したがって、ReEncrypt オペレーションの場合、ReEncryptFromReEncryptTo、または両方の ReEncrypt* を指定できます。

グラントオペレーション:

許可するグラントオペレーションは、許可の KMS キーでサポートされている必要があります。サポートされていないオペレーションを指定すると、ValidationError の例外により、CreateGrant リクエストは失敗します。例えば、対称暗号化 KMS キーのグラントは、SignVerifyGenerateMac または VerifyMac オペレーションを許可できません。非対称 KMS キーのグラントは、データキーまたはデータキーペアを生成するいかなるオペレーションも許可できません。

グラントトークン

グラントの作成時に、新しいグラントが AWS KMS 全体で利用可能になるまで (結果整合性を取得するまで)、通常は 5 分未満の短い遅延が発生する場合があります。グラントが結果整合性を取得する前にグラントを使用すると、アクセス拒否エラーが発生する可能性があります。グラントトークンを使用すると、グラントを参照し、グラントのアクセス許可をすぐに使用できます。

グラントトークンは、一意、非シークレット、可変長、base64 エンコードの、グラントを表す文字列です。グラントトークンを使用して、任意のグラントオペレーションでグラントを識別できます。ただし、トークン値はハッシュダイジェストであるため、グラントの詳細は明らかになりません。

グラントトークンは、グラントが結果整合性を取得するまでのみ使用されるように設計されています。その後、被付与者プリンシパルは、グラントトークンやその他のグラント限の証拠を提供することなく、グラントでアクセス許可を使用することができます。グラントトークンは常時使用できますが、グラントが最終的な整合性を取得した時点で、AWS KMS はグラントトークンではなく、グラントを使用してアクセス許可を決定します。

例えば、次のコマンドでは、GenerateDataKey オペレーションを呼び出します。これは、グラントトークンを使用して、発信者 (被付与者プリンシパル) に、指定した KMS キーで GenerateDataKey を呼び出す許可を付与します。

$ aws kms generate-data-key \ --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ --key-spec AES_256 \ --grant-token $token

また、グラントトークンを使用して、グラントを管理するオペレーションでグラントを識別することもできます。例えば、廃止プリンシパルは、RetireGrant オペレーションの呼び出し時に、グラントトークンを使用できます。

$ aws kms retire-grant \ --grant-token $token

CreateGrant は、グラントトークンを返す唯一のオペレーションです。その他の AWS KMS オペレーション、または CreateGrant オペレーションの CloudTrail ログイベントからグラントトークンを取得することはできません。ListGrants および ListRetirableGrants オペレーションは、グラントトークンではなくグラント ID を返します。

詳細については、「グラントトークンを使用する」を参照してください。

被付与者プリンシパル

グラントで指定されたアクセス許可を取得するアイデンティティ。グラントには 1 つ以上の被付与者プリンシパルが必要です。被付与者プリンシパルは、AWS アカウント (ルート)、IAM ユーザーIAM ロールフェデレーティッドロールまたはユーザー、引き受けたロールユーザーなどの、任意の AWS プリンシパルとすることができます。被付与者プリンシパルは、KMS キーと同じアカウントか、別のアカウントにすることができます。ただし、被付与者プリンシパルを、サービスプリンシパルIAM グループAWS 組織にすることはできません。

(グラント) を廃止にする

グラントを終了します。アクセス許可の使用が終了したら、グラントを廃止にします。

グラントの取り消しと使用停止のどちらも、グラント限を削除します。ただし、使用停止はグラントで指定されたプリンシパルによって行われます。通常、取り消しはキー管理者が行います。詳細については、「グラントの使用停止と取り消し」を参照してください。

プリンシパルを使用停止にする

グラントを廃止にするプリンシパル。グラントで使用停止プリンシパルを指定できますが、必須ではありません。使用停止プリンシパルは、AWS アカウント、IAM ユーザー、IAM ロール、フェデレーティッドユーザー、引き受けたロールユーザーを含む AWS プリンシパルのいずれかにすることができます。使用停止プリンシパルは、KMS キーと同じアカウントか、別のアカウントにすることができます。

グラントで指定された廃止プリンシパルに加えて、グラントが作成された AWS アカウント によっても、グラントを廃止にできます。グラントで RetireGrant オペレーションが許可されている場合は、被付与者プリンシパルがグラントを廃止にできます。また、廃止プリンシパルの AWS アカウント または AWS アカウント は、グラントを廃止にする許可を、同じ AWS アカウント で IAM プリンシパルに委任できます。詳細については、「グラントの使用停止と取り消し」を参照してください。

(グラント) を取り消す

グラントを終了します。グラントを取り消して、グラントが許可するアクセス許可をアクティブに拒否します。

権限の取り消しと使用停止のどちらも、権限を削除します。ただし、使用停止はグラントで指定されたプリンシパルによって行われます。通常、取り消しはキー管理者が行います。詳細については、「グラントの使用停止と取り消し」を参照してください。

結果整合性 (グラント用)

グラントの作成、廃止、取り消しの際、変更が AWS KMS 全体で利用可能になるまで短い遅延が発生する場合があります (通常は 5 分未満)。この遅延が終了すると、オペレーションが結果整合性を取得したとみなされます。

想定外のエラーが発生する場合は、この短い遅延に注意する必要があります。例えば、新しいグラントを管理したり、グラントが AWS KMS 全体で認識される前に新しいグラントを使用したりすると、アクセス拒否エラーが表示される可能性があります。グラントを廃止にするか取り消す場合でも、被付与者プリンシパルは、グラントが完全に削除されるまで、そのアクセス許可を短い期間使用できる可能性があります。典型的な戦略は、リクエスト、および自動バックオフと再試行ロジックを含む一部の AWS SDK を再試行することです。

AWS KMS には、この短い遅延を軽減する機能があります。

注記

サービスのすべてのエンドポイントが新しいグラント状態で更新されるまで、グラントトークンはグラントの有効性を優先します。ほとんどの場合、結果整合性は 5 分以内に取得されます。

AWS KMS グラントのベストプラクティス

AWS KMS では、グラントの作成、使用、管理を行う際に、以下のベストプラクティスを推奨します。

  • グラントのアクセス許可を、被付与者プリンシパルに必要なアクセス許可に制限します。最小限の特権アクセスの原則を使用します。

  • IAM ロールなどの特定の被付与者プリンシパルを使用し、被付与者プリンシパルに、必要な API オペレーションのみを使用するアクセス許可を付与します。

  • 暗号化コンテキストのグラントの制約を使用して、発信者が意図した目的のために KMS キーを使用していることを保証します。リクエストで暗号化コンテキストを使用してデータを保護する方法の詳細については、AWS セキュリティブログAWS Key Management Service および EncryptionContext を使用して暗号化されたデータの整合性を保護する方法を参照してください。

    ヒント

    可能な限り、EncryptionContextEqual のグラントの制約を使用します EncryptionContextSubset のグラントの制約は、正しく使用するのが困難です。使用する必要がある場合は、ドキュメントをよく読み、グラントの制約をテストして、意図したとおりに動作することを確認してください。

  • 重複するグラントを削除します。重複するグラントには、同じキー ARN、API アクション、被付与者プリンシパル、暗号化コンテキスト、名前などがあります。元のグラントを廃止にしたか取り消したにも関わらず、重複したグラントが残った場合、残った重複グラントは意図しない特権エスカレーションを構成します。CreateGrant リクエストの再試行時にグラントが重複しないようにするには、Name パラメータを使用します。重複するグラントを検出するには、ListGrants オペレーションを使用します。誤って重複するグラントを作成した場合は、できるだけ早く廃止にするか、取り消します。

    注記

    AWS マネージドキーのグラントは重複しているようにみえますが、異なる被付与者プリンシパルを持っています。

    通常、ListGrants レスポンスの GranteePrincipal フィールドには、グラントの被付与者プリンシパルが含まれます。ただし、グラントの被付与者プリンシパルが AWS のサービスの場合、GranteePrincipal フィールドにはサービスプリンシパルが含まれます。これは、複数の異なる被付与者プリンシパルを表す場合があります。

  • グラントは、自動的に期限切れにならないことに注意してください。アクセス許可が不要になったら、すぐにグラントの廃止または取り消しをします。削除されないグラントは、暗号化されたリソースに対してセキュリティ上のリスクを引き起こす可能性があります。