

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# グラントの作成
<a name="create-grant-overview"></a>

グラントを作成する前に、グラントをカスタマイズするためのオプションを確認します。グラントの制約を使用して、グラントのアクセス許可を制限することができます。`CreateGrant` アクセス許可の付与も参照してください。グラントからグラントを作成する許可を取得したプリンシパルは、作成できるグラントが制限されます。

**Topics**
+ [

## グラントの作成
](#grant-create)
+ [

## CreateGrant アクセス許可の付与
](#grant-creategrant)

## グラントの作成
<a name="grant-create"></a>

許可を作成するには、 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) オペレーションを呼び出します。KMS キー、[被付与者プリンシパル](grants.md#terms-grantee-principal)、許可された[グラントオペレーション](grants.md#terms-grant-operations)のリストを指定します。オプションの[使用停止プリンシパル](grants.md#terms-retiring-principal)を指定することもできます。許可をカスタマイズするには、オプションの `Constraints` パラメータを使用して[許可の制約](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)を定義します。

グラントの作成、廃止、取り消しの際、変更が AWS KMS全体で利用可能になるまで短い遅延が発生する場合があります (通常は 5 分未満)。詳細については、「[結果整合性 (グラント用)](grants.md#terms-eventual-consistency)」を参照してください。

例えば、次の `CreateGrant` コマンドは、`keyUserRole` ロールを引き受ける権限を持つユーザーに、指定された[対称 KMS キー](symm-asymm-choose-key-spec.md#symmetric-cmks)で [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) オペレーションを呼び出すことを許可するグラントを作成します。グラントでは、`RetiringPrincipal` パラメータを使用して、グラントを廃止できるプリンシパルを指定します。また、リクエスト内の[暗号化コンテキスト](encrypt_context.md)に `"Department": "IT"` が含まれている場合にのみアクセス許可を付与する許可制約も含まれます。

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

コードが `CreateGrant` オペレーションを再試行するか、[AWS リクエストを自動的に再試行する SDK](https://docs.aws.amazon.com/general/latest/gr/api-retries.html) を使用する場合は、オプションの[名前](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html#KMS-CreateGrant-request-Name)パラメータを使用して、重複グラントの作成を防止します。が既存のグラントと同じプロパティを持つグラントの`CreateGrant`リクエスト AWS KMS を取得した場合、リクエストは再試行として認識され、新しいグラントは作成されません。`Name` 値を使用して、任意の AWS KMS オペレーションでグラントを識別することはできません。

**重要**  
グラント名には、機密情報や重要情報を含めないでください。これは、CloudTrail ログやその他の出力にプレーンテキストで表示される場合があります。

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

複数のプログラミング言語でのグラントの作成方法を示すコード例については、「[AWS SDK または CLI `CreateGrant`で を使用する](example_kms_CreateGrant_section.md)」を参照してください。

### グラントの制約の使用
<a name="grant-constraints"></a>

[グラントの制約](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)は、グラントが被付与者プリンシパルに付与するアクセス許可の条件を設定します。グラントの制約は、[キーポリシー](key-policies.md)または [IAM ポリシー](iam-policies.md)で、[条件キー](policy-conditions.md)の代わりになります。各グラントの制約値には、最大 8 個の暗号化コンテキストペアを含めることができます。各グラントの制約の暗号化コンテキスト値は、384 文字を超えることはできません。

**重要**  
このフィールドには、機密情報や重要情報を含めないでください。このフィールドは、CloudTrail ログやその他の出力にプレーンテキストで表示される場合があります。

AWS KMS は、 `EncryptionContextEquals`と の 2 つの許可制約をサポートしています。どちらも`EncryptionContextSubset`、暗号化オペレーションのリクエストで暗号化[コンテキスト](encrypt_context.md)の要件を確立します。

暗号化コンテキストのグラントの制約は、暗号化コンテキストパラメータを持つ[グラントペレーション](grants.md#terms-grant-operations)で使用されるように設計されています。
+ 暗号化コンテキストの制約は、対称暗号化 KMS キーのグラントのみで有効です。他の KMS キーを使用する暗号化オペレーションは、暗号化コンテキストをサポートしません。
+ 暗号化コンテキストの制約は、`DescribeKey` および `RetireGrant` オペレーションでは無視されます。`DescribeKey` および `RetireGrant` には暗号化コンテキストパラメータはありませんが、暗号化コンテキストの制約を持つグラントにこれらのオペレーションを含めることができます。
+ `CreateGrant` オペレーションのグラントで、暗号化コンテキストの制約を使用することができます。暗号化コンテキストの制約では、`CreateGrant` 許可で作成された任意のグラントが、同様に厳密またはより厳密な暗号化コンテキストの制約を持っている必要があります。

AWS KMS では、次の暗号化コンテキスト許可の制約がサポートされています。

**EncryptionContextEquals**  
`EncryptionContextEquals` を使用して、許可されたリクエストの正確な暗号化コンテキストを指定します。  
`EncryptionContextEquals` では、リクエストの暗号化コンテキストペアが、グラントの制約の暗号化コンテキストペアと、大文字と小文字の区別で完全に一致することを要求します。このペアは任意の順序で表示できますが、各ペアのキーと値を変更することはできません。  
例えば、`EncryptionContextEquals` のグラントの制約が `"Department": "IT"` 暗号化コンテキストペアを要求する場合、グラントはリクエストの暗号化コンテキストが完全に `"Department": "IT"` である場合にのみ、指定されたタイプのリクエストを許可します。

**EncryptionContextSubset**  
`EncryptionContextSubset` を使用して、リクエストに特定の暗号化コンテキストペアを含めるように要求します。  
`EncryptionContextSubset` では、リクエストにグラントの制約 (完全な大文字と小文字を区別する一致) のすべての暗号化コンテキストペアを含むことを要求しますが、リクエストが追加の暗号化コンテキストペアを持っている可能性もあります。このペアは任意の順序で表示できますが、各ペアのキーと値を変更することはできません。  
例えば、`EncryptionContextSubset` のグラントの制約が、`Department=IT` の暗号化コンテキストペアを要求する場合、グラントはリクエストの暗号化コンテキストが `"Department": "IT"` の場合、またはリクエストが `"Department": "IT","Purpose": "Test"` のような他の暗号化コンテキストペアと共に `"Department": "IT"` を含む場合に、指定されたタイプのリクエストを許可します。

対称暗号化 KMS キーのグラントで暗号化コンテキストの制約を指定するには、[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) オペレーションの `Constraints` パラメータを使用します。このコマンドが作成する許可では、`keyUserRole` ロールを引き受ける権限を持つユーザーに、[Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) オペレーションを呼び出すためのアクセス許可を付与します。ただし、そのアクセス許可は `Decrypt` リクエストの暗号化コンテキストが、`"Department": "IT"` 暗号化コンテキストペアである場合にのみ有効です。

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

したがって、グラントは以下のようになります。`keyUserRole` ロールに付与されるアクセス許可は、`Decrypt` リクエストがグラントの制約で指定された同じ暗号化コンテキストペアを使用する場合にのみ有効です。KMS キーでグラントを見つけるには、[ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) オペレーションを使用します。

```
$ aws kms list-grants --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Grants": [
        {
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "Decrypt"
            ],
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
            "CreationDate": 1568565290.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole"
        }
    ]
}
```

`EncryptionContextEquals` のグラントの制約を満たすために、`Decrypt` オペレーションのリクエストの暗号化コンテキストは、`"Department": "IT"` ペアである必要があります。被付与者プリンシパルからの次のようなリクエストは、`EncryptionContextEquals` のグラントの制約を満たします。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

グラントの制約が `EncryptionContextSubset` の場合、リクエストの暗号化コンテキストペアは、グラントの制約の暗号化コンテキストペアを含む必要がありますが、リクエストは他の暗号化コンテキストペアを含んでいる可能性もあります。次のグラントの制約は、リクエスト内の暗号化コンテキストペアの 1 つが `"Deparment": "IT"` であることを要求します。

```
"Constraints": {
   "EncryptionContextSubset": {
       "Department": "IT"
   }
}
```

被付与者プリンシパルからの次のリクエストは、この例の `EncryptionContextEqual` および `EncryptionContextSubset` のグラントの制約両方を満たします

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT
```

ただし、被付与者プリンシパルからの次のようなリクエストは、`EncryptionContextSubset` のグラントの制約を満たしますが、`EncryptionContextEquals` のグラントの制約は満たしません。

```
$ aws kms decrypt \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab \
    --ciphertext-blob fileb://encrypted_msg \
    --encryption-context Department=IT,Purpose=Test
```

AWS サービスは、多くの場合、 で KMS キーを使用するアクセス許可を付与する許可で暗号化コンテキスト制約を使用します AWS アカウント。例えば、Amazon DynamoDB では、次のようなグラントを使用して、アカウントで DynamoDB の [AWS マネージドキー](concepts.md#aws-managed-key) を使用するアクセス許可を取得します。このグラント内の `EncryptionContextSubset` のグラントの制約により、要求内の暗号化コンテキストに `"subscriberID": "111122223333"` と `"tableName": "Services"` ペアが含まれる場合にのみ、グラントの許可が有効になります。このグラントの制約は、DynamoDB が AWS アカウントの特定のテーブルに対してのみ、指定された KMS キーを使用することをグラントが許可することを意味します。

この出力を取得するには、アカウントの AWS マネージドキー for DynamoDB で [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) オペレーションを実行します。

```
$ aws kms list-grants --key-id 0987dcba-09fe-87dc-65ba-ab0987654321

{
    "Grants": [
        {
            "Operations": [
                "Decrypt",
                "Encrypt",
                "GenerateDataKey",
                "ReEncryptFrom",
                "ReEncryptTo",
                "RetireGrant",
                "DescribeKey"
            ],
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "Constraints": {
                "EncryptionContextSubset": {
                    "aws:dynamodb:tableName": "Services",
                    "aws:dynamodb:subscriberId": "111122223333"
                }
            },
            "CreationDate": 1518567315.0,
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321",
            "GranteePrincipal": "dynamodb.us-west-2.amazonaws.com",
            "RetiringPrincipal": "dynamodb.us-west-2.amazonaws.com",
            "Name": "8276b9a6-6cf0-46f1-b2f0-7993a7f8c89a",
            "GrantId": "1667b97d27cf748cf05b487217dd4179526c949d14fb3903858e25193253fe59"
        }
    ]
}
```

## CreateGrant アクセス許可の付与
<a name="grant-creategrant"></a>

グラントには、`CreateGrant` オペレーションを呼び出す許可を含めることができます。ただし、[被付与者プリンシパル](grants.md#terms-grantee-principal)が `CreateGrant` を呼び出す許可をポリシーからではなくグラントから取得すると、その許可は制限されます。
+ 被付与者プリンシパルは、親グラントで一部またはすべてのオペレーションを許可するグラントのみを作成できます。
+ 作成されたグラントの[グラントの制約](#grant-constraints)は、少なくとも親グラントの制約と同じくらい厳密である必要があります。

これらの制限は、`CreateGrant` 許可をポリシーから取得するプリンシパルには適用されませんが、プリンシパルの許可は[ポリシー条件](grant-authorization.md)によって制限されます。

例えば、被付与者プリンシパルが `GenerateDataKey`、`Decrypt`、および `CreateGrant` オペレーションを呼び出せるようにする許可について考えてみます。`CreateGrant` 許可、親グラントを許可するグラントを呼び出します。

```
# The original grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572216195.0,
            "GrantId": "abcde1237f76e4ba7987489ac329fbfba6ad343d6f7075dbd1ef191f0120514a",
            "Operations": [
                "GenerateDataKey",
                "Decrypt",
                "CreateGrant
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:role/adminRole",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:role/keyUserRole",
            "Constraints": {
                "EncryptionContextSubset": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

被付与者プリンシパル、exampleUser はこのアクセス許可を使用して、`CreateGrant` や `Decrypt` などの元のグラントで、指定されたオペレーションのサブセットを含むグラントを作成できます。子グラントに `ScheduleKeyDeletion` または `ReEncrypt` などの他のオペレーションを含めることはできません。

また、子グラントの[グラントの制約](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)は、親グラントの制約と同じか、より厳密である必要があります。例えば、子グラントは親グラントの `EncryptionContextSubset` 制約にペアを追加できますが、削除することはできません。子グラントは `EncryptionContextSubset` 制約を `EncryptionContextEquals` 制約に変更することはできますが、その逆はできません。

IAM ベストプラクティスでは、長期の認証情報を持つ IAM ユーザーの使用は推奨されていません。可能な限り、一時的な認証情報を提供する IAM ロールを使用してください。詳細については、「IAM ユーザーガイド」の「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

例えば、被付与者プリンシパルは、親グラントから取得した `CreateGrant` 許可を使用して、次の子グラントを作成します。子グラントのオペレーションは、親グラントのオペレーションのサブセットであり、グラントの制約がより限定的です。

```
# The child grant in a ListGrants response.
{
    "Grants": [
        {
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1572249600.0,
            "GrantId": "fedcba9999c1e2e9876abcde6e9d6c9b6a1987650000abcee009abcdef40183f",
            "Operations": [
                "CreateGrant"
                "Decrypt"
            ]
            "RetiringPrincipal": "arn:aws:iam::111122223333:user/exampleUser",
            "Name": "",
            "IssuingAccount": "arn:aws:iam::111122223333:root",
            "GranteePrincipal": "arn:aws:iam::111122223333:user/anotherUser",
            "Constraints": {
                "EncryptionContextEquals": {
                    "Department": "IT"
                }
            },
        }
    ]
}
```

子グラントの被付与者プリンシパル、`anotherUser` は `CreateGrant` 許可を使用してグラントを作成できます。ただし、`anotherUser` が作成したグラントは親グラントまたはサブセット内のオペレーションを含める必要があり、グラントの制約は同じか、より厳密である必要があります。