次の方法で共有


カスタマー マネージド キーを有効にする

この記事は、4 部構成のチュートリアル シリーズのパート 4 です。 パート 1 では、カスタマー マネージド キーの概要、その機能、レジストリで有効にする前の考慮事項について説明します。 この記事では、Azure CLI、Azure portal、または Resource Manager テンプレートを使用してカスタマー マネージド キーを有効にする手順について説明します。

前提条件

Azure CLI を使用してカスタマー マネージド キーを有効にする

リソース グループを作成する

az group create コマンドを実行して、キー コンテナー、コンテナー レジストリ、その他の必要なリソースを保持するリソース グループを作成します。

az group create --name <resource-group-name> --location <location>

ユーザー割り当てマネージド ID を作成する

キー コンテナーにアクセスできるように、レジストリのユーザー割り当てマネージド ID を構成します。

  1. [az identity 作成] コマンドを実行してマネージド ID を作成します。

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. コマンド出力で、キー コンテナーを使用してレジストリ アクセスを構成するための id 値と principalId 値をメモします。

    {
      "clientId": "xxxx2bac-xxxx-xxxx-xxxx-192cxxxx6273",
      "clientSecretUrl": "https://control-eastus.identity.azure.net/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myidentityname/credentials?tid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&oid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&aid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myresourcegroup",
      "location": "eastus",
      "name": "myidentityname",
      "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "resourceGroup": "myresourcegroup",
      "tags": {},
      "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  3. 利便性を考えて、idprincipalId の値を環境変数に格納します。

    identityID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'id' --output tsv)
    
    identityPrincipalID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'principalId' --output tsv)
    

Key Vault を作成します

  1. az keyvault create コマンドを実行し、レジストリ暗号化用のカスタマー マネージド キーを格納するためのキー コンテナーを作成します。

  2. 既定で、新しいキー コンテナーでは論理的な削除設定が自動的に有効になります。 キーまたはキー コンテナーを誤って削除することによるデータ損失を防ぐために、[消去保護] 設定を有効にすることをお勧めします。

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. 便宜上、キー コンテナーのリソース ID をメモし、値を環境変数に格納します。

    keyvaultID=$(az keyvault show --resource-group <resource-group-name> --name <key-vault-name> --query 'id' --output tsv)
    

信頼されたサービスのキー コンテナーへのアクセスを有効にする

キー コンテナーがファイアウォールまたは仮想ネットワーク (プライベート エンドポイント) で保護されている場合は、信頼された Azure サービスによるアクセスを許可するネットワーク設定を有効にする必要があります。 詳細については、「Azure Key Vault のネットワーク設定を構成する」を参照してください。

キー コンテナーにアクセスするためにマネージド ID を有効にする

マネージド ID がキー コンテナーにアクセスできるようにするには、2 つの方法があります。

最初のオプションは、キー コンテナーのアクセス ポリシーを構成し、ユーザー割り当てマネージド ID を使用してアクセスするキーのアクセス許可を設定するためのものです。

  1. az keyvault set-policy コマンドを実行します。 以前に作成および格納された環境変数の principalID 値を渡します。

  2. キーのアクセス許可を getunwrapKeywrapKey に対して設定します。

    az keyvault set-policy \
      --resource-group <resource-group-name> \
      --name <key-vault-name> \
      --object-id $identityPrincipalID \
      --key-permissions get unwrapKey wrapKey
    
    

2 つ目のオプションは、Azure ロールベースのアクセス制御 (RBAC) を使用して、ユーザー割り当てマネージド ID にアクセス許可を割り当て、キー コンテナーにアクセスすることです。 az role assignment create コマンドを実行し、Key Vault Crypto Service Encryption User ロールをユーザー割り当てマネージド ID に割り当てます。

az role assignment create --assignee $identityPrincipalID \
  --role "Key Vault Crypto Service Encryption User" \
  --scope $keyvaultID

キーを作成してキー ID を取得する

  1. az keyvault key create コマンドを実行して、キー コンテナーにキーを作成します。

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. コマンドの出力で、キーの ID (kid) を記録しておきます。

    [...]
      "key": {
        "crv": null,
        "d": null,
        "dp": null,
        "dq": null,
        "e": "AQAB",
        "k": null,
        "keyOps": [
          "encrypt",
          "decrypt",
          "sign",
          "verify",
          "wrapKey",
          "unwrapKey"
        ],
        "kid": "https://mykeyvault.vault.azure.net/keys/mykey/<version>",
        "kty": "RSA",
    [...]
    
  3. 後で使用できるように、キー ID に選択した形式を $keyID 環境変数に格納します。 バージョンありのキー ID またはバージョンなしのキー ID を使用できます。

キーの交換

手動または自動のキーのローテーションを選択できます。

キー バージョンありのカスタマー マネージド キーを使用してレジストリを暗号化した場合は、Azure Container Registry で手動のキー ローテーションのみが許可されます。 次の例では、キーの kid プロパティを格納します。

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

キーのバージョンを省略してカスタマー マネージド キーを使用してレジストリを暗号化した場合は、Azure Key Vault で新しいキー バージョンを検出するための自動キー ローテーションが有効になります。 次の例では、キーの kid プロパティからバージョンを削除します。

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

keyID=$(echo $keyID | sed -e "s/\/[^/]*$//")

カスタマー マネージド キーを使用してレジストリを作成する

  1. az acr create コマンドを実行して Premium サービス レベルでレジストリを作成し、カスタマー マネージド キーを有効にします。

  2. 前の手順で環境変数に格納されているマネージド ID (id) とキー ID (kid) 値を渡します。

    az acr create \
      --resource-group <resource-group-name> \
      --name <container-registry-name> \
      --identity $identityID \
      --key-encryption-key $keyID \
      --sku Premium
    

暗号化の状態を表示する

カスタマー マネージド キーによるレジストリ暗号化の状態を表示するには、az acr encryption show コマンドを実行します。

az acr encryption show --name <container-registry-name>

レジストリの暗号化に使用されるキーに応じて、出力は次のようになります。

{
  "keyVaultProperties": {
    "identity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "keyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
    "keyRotationEnabled": true,
    "lastKeyRotationTimestamp": xxxxxxxx
    "versionedKeyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
  },
  "status": "enabled"
}

Azure portal を使用してカスタマー マネージド キーを有効にする

ユーザー割り当てマネージド ID を作成する

Azure portal で、ユーザー割り当てによる Azure リソース用マネージド ID を作成するには、次の操作を実行します。

  1. ユーザー割り当て ID を作成する」の手順に従ってください。

  2. ID の名前を保存して、後の手順で使用します。

Azure portal でユーザー割り当て ID を作成するためのオプションのスクリーンショット。

Key Vault を作成します

  1. クイック スタート: Azure portal を使用してキー コンテナーを作成する」の手順に従います。

  2. カスタマー マネージド キー用のキー コンテナーを作成する場合は、[基本] タブで、[消去保護] 設定を有効にします。 この設定は、キーまたはキー コンテナーが誤って削除された場合のデータ損失を防ぐのに役立ちます。

    Azure portal でキー コンテナーを作成するためのオプションのスクリーンショット。

信頼されたサービスのキー コンテナーへのアクセスを有効にする

キー コンテナーがファイアウォールまたは仮想ネットワーク (プライベート エンドポイント) で保護されている場合は、信頼された Azure サービスによるアクセスを許可するネットワーク設定を有効にします。 詳細については、「Azure Key Vault のネットワーク設定を構成する」を参照してください。

キー コンテナーにアクセスするためにマネージド ID を有効にする

マネージド ID がキー コンテナーにアクセスできるようにするには、2 つの方法があります。

最初のオプションは、キー コンテナーのアクセス ポリシーを構成し、ユーザー割り当てマネージド ID を使用してアクセスするキーのアクセス許可を設定するためのものです。

  1. キー コンテナーに移動します。
  2. [設定]>[アクセス ポリシー] > [+ アクセス ポリシーの追加] を選択します。
  3. [キーのアクセス許可] を選択し、[取得][キーの折り返しを解除][キーを折り返す] を順に選択します。
  4. [プリンシパルの選択] で、ユーザー割り当てマネージド ID のリソース名を選択します。
  5. [追加][保存] の順に選択します。

キー コンテナー アクセス ポリシーを作成するためのオプションのスクリーンショット。

もう 1 つの選択肢は、Key Vault Crypto Service Encryption User RBAC ロールを、キー コンテナー スコープでユーザー割り当てマネージド ID に割り当てることです。 詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

キーの作成

キー コンテナーにキーを作成し、それをレジストリの暗号化に使用します。 特定のキー バージョンをカスタマー マネージド キーとして選択する場合は、これらの手順に従います。 キー コンテナーへのアクセスがプライベート エンドポイントまたは選択されたネットワークに制限されている場合は、レジストリを作成する前に、キーの作成も必要になる場合があります。

  1. キー コンテナーに移動します。
  2. [設定]>[キー] の順に選択します。
  3. [+ 生成/インポート] を選択し、キーの一意の名前を入力します。
  4. それ以外については既定値をそのまま使用し、[作成] を選択します。
  5. 作成後、そのキーを選択し、次に現在のバージョンを選択します。 そのキー バージョンのキー識別子をコピーします。

コンテナー レジストリの作成

  1. [リソースの作成]>[コンテナー]>[コンテナー レジストリ] の順に選択します。
  2. [基本] タブで、リソース グループを選択または作成し、レジストリ名を入力します。 [SKU][Premium] を選択します。
  3. [暗号化] タブの [顧客が管理するキー] で、[有効] を選択します。
  4. [ID] に、作成したマネージド ID を選択します。
  5. [暗号化] で、次のいずれかのオプションを選択します。
    • [キー コンテナーから選ぶ] を選択し、既存のキー コンテナーとキー、または [新規作成] のいずれかを選択します。 選択するキーはバージョン管理されておらず、キーの自動ローテーションが有効になります。
    • [キー URI を入力] を選択し、既存のキーの識別子を指定します。 バージョン管理されたキー URI (手動でローテーションする必要があるキーの場合) またはバージョン管理されていないキー URI (キーの自動ローテーションが有効になる) のいずれかを指定できます。 キーを作成する手順については、前のセクションを参照してください。
  6. [Review + create](レビュー + 作成) を選択します。
  7. [作成] を選択して、レジストリ インスタンスをデプロイします。

Azure portal で暗号化されたレジストリを作成するためのオプションを示すスクリーンショット。

暗号化の状態を表示する

ポータルでレジストリの暗号化状態を確認するには、お使いのレジストリに移動します。 [設定] で、[暗号化] を選択します。

Resource Manager テンプレートを使用してカスタマー マネージド キーを有効にする

Resource Manager テンプレートを使用して、コンテナー レジストリを作成し、カスタマー マネージド キーによる暗号化を有効にできます。

  1. Resource Manager テンプレートの次の内容を新しいファイルにコピーし、CMKtemplate.json として保存します。

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "vault_name": {
          "defaultValue": "",
          "type": "String"
        },
        "registry_name": {
          "defaultValue": "",
          "type": "String"
        },
        "identity_name": {
          "defaultValue": "",
          "type": "String"
        },
        "kek_id": {
          "type": "String"
        }
      },
      "variables": {},
      "resources": [
        {
          "type": "Microsoft.ContainerRegistry/registries",
          "apiVersion": "2019-12-01-preview",
          "name": "[parameters('registry_name')]",
          "location": "[resourceGroup().location]",
          "sku": {
            "name": "Premium",
            "tier": "Premium"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
              "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]": {}
            }
          },
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "adminUserEnabled": false,
            "encryption": {
              "status": "enabled",
              "keyVaultProperties": {
                "identity": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').clientId]",
                "KeyIdentifier": "[parameters('kek_id')]"
              }
            },
            "networkRuleSet": {
              "defaultAction": "Allow",
              "virtualNetworkRules": [],
              "ipRules": []
            },
            "policies": {
              "quarantinePolicy": {
                "status": "disabled"
              },
              "trustPolicy": {
                "type": "Notary",
                "status": "disabled"
              },
              "retentionPolicy": {
                "days": 7,
                "status": "disabled"
              }
            }
          }
        },
        {
          "type": "Microsoft.KeyVault/vaults/accessPolicies",
          "apiVersion": "2018-02-14",
          "name": "[concat(parameters('vault_name'), '/add')]",
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "accessPolicies": [
              {
                "tenantId": "[subscription().tenantId]",
                "objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').principalId]",
                "permissions": {
                  "keys": [
                    "get",
                    "unwrapKey",
                    "wrapKey"
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
          "apiVersion": "2018-11-30",
          "name": "[parameters('identity_name')]",
          "location": "[resourceGroup().location]"
        }
      ]
    }
    
  2. 前のセクションの手順に従って、次のリソースを作成します。

    • キー コンテナー、名前で識別されます
    • キー コンテナー キー、キー ID で識別されます
  3. az deployment group create コマンドを実行し、前述のテンプレート ファイルを使用してレジストリを作成します。 要求されたら、新しいレジストリ名とユーザー割り当てマネージド ID 名、作成したキー コンテナー名とキー ID を指定します。

    az deployment group create \
      --resource-group <resource-group-name> \
      --template-file CMKtemplate.json \
      --parameters \
        registry_name=<registry-name> \
        identity_name=<managed-identity> \
        vault_name=<key-vault-name> \
        key_id=<key-vault-key-id>
    
  4. az acr encryption show コマンドを実行して、レジストリ暗号化の状態を表示します。

    az acr encryption show --name <registry-name>
    

次のステップ

次の記事のカスタマー マネージド キーのローテーション、キー バージョンの更新、カスタマー マネージド キーの取り消しについての説明に進んでください。