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

この記事は、4 部構成のチュートリアル シリーズのパート 2 です。 パート 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 create コマンドを実行してマネージド ID を作成します。

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

    {
      "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "clientSecretUrl": "https://control-eastus.identity.azure.net/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myidentityname/credentials?tid=aaaabbbb-0000-cccc-1111-dddd2222eeee&oid=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb&aid=00001111-aaaa-2222-bbbb-3333cccc4444",
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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. 利便性を考えて、id と principalId の値を環境変数に格納してください。

    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)
    

キー コンテナーを作成して構成する

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

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

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

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

信頼されたサービスに Key Vault へのアクセスを許可する

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

マネージド ID が Key Vault にアクセスできるようにする

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

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

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

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

    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 にアクセス許可を割り当て、Key Vault にアクセスすることです。 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

Key Vault にキーを作成し、キー ID を取得する

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

    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/\/[^/]*$//")

Managed HSM の作成と構成

キーを作成したり、データ プレーン ロールを割り当てたりするには、マネージド HSM をプロビジョニングしてアクティブ化する必要があります。 クイック スタート: Azure CLIを使用して Managed HSM をプロビジョニングしてアクティブ化に従ってから、この記事に戻ってください。

Managed HSM ファイアウォールが有効になっている場合は、レジストリを作成する前に、信頼されたサービスまたはその他のネットワーク アクセスを構成してください。 詳細については、「Managed HSM のネットワーク セキュリティ」を参照してください。

暗号化キーを作成するユーザーには、キーの作成を許可する Managed HSM Crypto User などの Managed HSM ロールが必要です。 詳細については、「 Managed HSM のデータ プレーン ロール管理」を参照してください。

キー ラップをサポートする RSA-HSM キーを作成します。

az keyvault key create \
  --hsm-name <managed-hsm-name> \
  --name <key-name> \
  --kty RSA-HSM \
  --ops wrapKey unwrapKey

Managed HSM では、Key Vault のアクセス ポリシーの代わりにローカル RBAC が使用されます。 Managed HSM Crypto Service Encryption ユーザー ロールをユーザー割り当て ID に割り当てます。 次の例では、レジストリが使用するキーへの割り当てを制限します。

az keyvault role assignment create \
  --hsm-name <managed-hsm-name> \
  --role "Managed HSM Crypto Service Encryption User" \
  --assignee-object-id $identityPrincipalID \
  --assignee-principal-type MSI \
  --scope /keys/<key-name>

手動ローテーション用にキー ID をそのバージョンとともに格納します。

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

キーの自動ローテーションを有効にするには、キー ID からバージョンを削除してください。

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

Note

Managed HSM キー URI では、 https://<managed-hsm-name>.managedhsm.azure.net/keys/<key-name>/<version>形式が使用されます。 DNS サフィックスは、Azureクラウドによって異なる場合があります。

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

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

  2. 前の手順で環境変数に格納されているマネージド ID の 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. identity の名前を保存して、後の手順で使用します。

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

Key Vault を作成

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

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

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

信頼されたサービスがキー コンテナーにアクセスできるようにする

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

Key Vault にアクセスするためにマネージド ID を有効にする

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

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

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

Key Vault アクセス ポリシーを作成するためのオプションのスクリーンショット。

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

Managed HSM の作成と構成

  1. クイック スタート: Azure ポータルを使用して Managed HSM をプロビジョニングしてアクティブ化する方法に従います。
  2. 暗号化キーを作成するユーザーが、キーの作成を許可する Managed HSM ロール ( Managed HSM Crypto User など) を持っていることを確認します。
  3. [設定] で [キー] を選択し、wrapKey 操作と unwrapKey 操作をサポートする RSA-HSM キーを作成またはインポートします。
  4. [ 設定] で、[ ローカル RBAC] を選択します。
  5. ユーザー割り当て ID の Managed HSM Crypto Service Encryption ユーザー ロールの割り当てを追加します。 最小権限のために、暗号化キーのスコープでロールを割り当てます。 詳細については、「 Managed HSM のデータ プレーン ロール管理」を参照してください。
  6. Managed HSM ファイアウォールが有効になっている場合は、信頼されたサービスまたはその他のネットワーク アクセスを構成します。 詳細については、「Managed HSM のネットワーク セキュリティ」を参照してください。

Important

Azure Container Registryは、Managed HSM ロールの割り当てを作成または更新しません。 レジストリを作成するか、その暗号化キーを変更する前に、ロールの割り当てを構成します。

Key Vault でキーを作成する

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

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

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

  1. [リソースの作成]>[コンテナー]>[コンテナー レジストリ] の順に選択します。

  2. [基本] タブで、リソース グループを選択または作成し、レジストリの名前を入力します。 [SKU] で [Premium] を選択します。

  3. [暗号化] タブの [顧客が管理するキー] で、[有効] を選択します。

  4. Identity に、作成したマネージド ID を選択します。

  5. 暗号化 で、次のいずれかのオプションを選択します。

    • [Key Vaultから選択] を選択し、既存のkey vaultまたは Managed HSM とキーを選択します。 [新規作成] を選択して、Key Vault とキーを作成します。 選択するキーはバージョン管理されておらず、キーの自動ローテーションを有効にします。
    • [キー URI の入力] を選択し、既存のKey Vaultまたは Managed HSM キーの識別子を指定します。 バージョン管理されたキー URI (手動でローテーションする必要があるキーの場合) またはバージョン管理されていないキー URI (キーの自動ローテーションを有効にする) のいずれかを指定できます。

    Managed HSM ファイアウォールによってポータルでキーを一覧表示できない場合は、クライアント IP アドレスを許可するか、[キー URI の入力] を選択します。 信頼されたサービスを許可すると、Azure Container Registry は Managed HSM に到達できますが、構成済みネットワーク境界外のクライアントにキー ピッカーの使用を許可するものではありません。

  6. Review + create を選択します。

  7. [作成] を選択して、レジストリ インスタンスをデプロイします。

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

暗号化の状態を表示する

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

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

Resource Manager テンプレートを使用してコンテナー レジストリを作成し、Key Vault または Managed HSM に格納されているカスタマー マネージド キーを使用して暗号化を有効にすることができます。

テンプレートをデプロイする前に、ユーザー割り当て ID を作成し、キーへのアクセス許可を構成します。

  • Key Vaultの場合は、アクセス ポリシーまたは unwrapKey Azure RBAC ロールを使用して、、get、wrapKey のアクセス許可を ID に付与します。
  • Managed HSM の場合は、キー スコープで ID エンティティに Managed HSM Crypto Service Encryption User ローカル RBAC ロールを割り当てます。

テンプレートは、レジストリがそれに依存できるように、既存の ID を宣言します。 ID エンティティと同じリソース グループにテンプレートをデプロイします。

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

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "registry_name": {
          "type": "String"
        },
        "identity_name": {
          "type": "String"
        },
        "kek_id": {
          "type": "String"
        }
      },
      "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.ManagedIdentity/userAssignedIdentities",
          "apiVersion": "2018-11-30",
          "name": "[parameters('identity_name')]",
          "location": "[resourceGroup().location]"
        }
      ]
    }
    
  2. 前のセクションの手順に従って、次のリソースを作成します。

    • 名前で識別されるユーザー割り当てマネージド ID
    • キー ID で識別されるKey Vaultまたはマネージド HSM キー
    • 必要なKey Vaultアクセス許可または Managed HSM ローカル RBAC ロールの割り当て
  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> \
        kek_id=<key-id>
    
  4. az acr encryption show コマンドを実行して、レジストリ暗号化の状態を表示します。

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

次のステップ

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