고객 관리형 키 사용

이 문서는 4부로 구성된 자습서 시리즈의 2부입니다. 1부에서는 레지스트리에서 키를 사용하도록 설정하기 전에 고객 관리형 키, 기능 및 고려 사항에 대한 개요를 제공합니다. 이 문서에서는 Azure CLI, Azure Portal 또는 Azure Resource Manager 템플릿을 사용하여 고객 관리형 키를 사용하도록 설정하는 단계를 안내합니다.

필수 조건

Azure CLI를 사용하여 고객 관리형 키 사용

리소스 그룹 만들기

az group create 명령을 실행하여 Key Vault, 컨테이너 레지스트리 및 기타 필요한 리소스를 포함할 리소스 그룹을 만듭니다.

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

사용자 할당 관리 ID 만들기

Key Vault에 액세스할 수 있도록 레지스트리에 대한 사용자 할당 관리 ID를 구성합니다.

  1. az identity create 명령을 사용을 실행하여 관리 ID를 만듭니다.

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. ​​Azure Key Vault를 사용한 레지스트리 액세스를 구성하려면 명령 출력에서 idprincipalId 값을 적어 둡니다.

    {
      "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)
    

키 자격 증명 모음 만들기

  1. az keyvault create 명령을 실행하여 레지스트리 암호화를 위한 고객 관리형 키를 저장할 수 있는 Key Vault를 만듭니다.

  2. 기본적으로 새 Key Vault는 자동으로 일시 삭제 설정을 사용하도록 설정합니다. 실수로 키 또는 Key Vault를 삭제하여 데이터가 손실되는 일을 방지하려면 제거 보호 설정을 사용하도록 설정하는 것이 좋습니다.

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. 편의를 위해 Key Vault 리소스 ID를 적어 두고 값을 환경 변수에 저장합니다.

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

신뢰할 수 있는 서비스가 Key Vault에 액세스하도록 설정

Key Vault이 방화벽 또는 가상 네트워크(프라이빗 엔드포인트)로 보호되는 경우 신뢰할 수 있는 Azure 서비스의 액세스를 허용하는 네트워크 설정을 사용하도록 설정해야 합니다. 자세한 내용은 Azure Key Vault 네트워킹 설정 구성을 참조하세요.

관리 ID가 Key Vault에 액세스하도록 설정

관리 ID가 Key Vault에 액세스할 수 있도록 설정하는 방법에는 두 가지가 있습니다.

첫 번째 옵션은 Key Vault에 대한 액세스 정책을 구성하고, 사용자가 할당한 관리 ID를 사용하여 액세스할 수 있는 키 권한을 설정하는 것입니다.

  1. az keyvault set policy 명령을 실행합니다. 이전에 만들어 저장한 환경 변수 값 principalID를 붙여넣습니다.

  2. 키 권한을 get, unwrapKeywrapKey로 설정합니다.

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

두 번째 옵션은 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

키 만들기 및 키 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. 편의를 위해 $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 명령을 실행하여 레지스트리를 프리미엄 서비스 계층에 만들고 고객 관리형 키를 사용하도록 설정합니다.

  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의 이름을 저장합니다.

Screenshot of the options for creating a user-assigned identity in the Azure portal.

키 자격 증명 모음 만들기

  1. 빠른 시작: Azure Portal을 사용하여 Key Vault 만들기의 단계를 따릅니다.

  2. 고객 관리형 키에 대한 Key Vault을 만들 때 기본 사항 탭에서 제거 보호 설정을 사용합니다. 이 설정을 사용하면 실수로 키 또는 Key Vault를 삭제하여 데이터가 손실되는 일을 방지할 수 있습니다.

    Screenshot of the options for creating a key vault in the Azure portal.

신뢰할 수 있는 서비스가 Key Vault에 액세스하도록 설정

Key Vault가 방화벽 또는 가상 네트워크(프라이빗 엔드포인트)로 보호되는 경우 신뢰할 수 있는 Azure 서비스의 액세스를 허용하는 네트워크 설정을 사용하도록 설정합니다. 자세한 내용은 Azure Key Vault 네트워킹 설정 구성을 참조하세요.

관리 ID가 Key Vault에 액세스하도록 설정

관리 ID가 Key Vault에 액세스할 수 있도록 설정하는 방법에는 두 가지가 있습니다.

첫 번째 옵션은 Key Vault에 대한 액세스 정책을 구성하고, 사용자가 할당한 관리 ID를 사용하여 액세스할 수 있는 키 권한을 설정하는 것입니다.

  1. Key Vault로 이동합니다.
  2. 설정>액세스 정책 > + 액세스 정책 추가를 차례로 선택합니다.
  3. 키 권한을 선택하고, 가져오기, 키 래핑 해제키 래핑을 선택합니다.
  4. 보안 주체 선택에서 사용자가 할당한 관리 ID의 리소스 이름을 선택합니다.
  5. 추가를 선택한 다음 저장을 선택합니다.

Screenshot of options for creating a key vault access policy.

다른 옵션은 Key Vault 범위에서 사용자가 할당한 관리 ID에 Key Vault Crypto Service Encryption User RBAC 역할을 할당하는 것입니다. 세부 단계에 대해서는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

키 만들기

키 자격 증명 모음에 키를 만들고, 이를 사용하여 레지스트리를 암호화합니다. 특정 키 버전을 고객 관리형 키로 선택하려면 다음 단계를 따릅니다. Key Vault 액세스가 프라이빗 엔드포인트 또는 선택한 네트워크로 제한된 경우 레지스트리를 만들기 전에 키를 만들어야 할 수도 있습니다.

  1. Key Vault로 이동합니다.
  2. 설정>를 차례로 선택합니다.
  3. + 생성/가져오기를 선택하고, 키에 대한 고유한 이름을 입력합니다.
  4. 나머지 기본값을 그대로 적용하고 만들기를 선택합니다.
  5. 만들어지면 키를 선택하고 현재 버전을 선택합니다. 키 버전의 키 식별자를 복사합니다.

컨테이너 레지스트리 만들기

  1. 리소스 만들기>컨테이너>컨테이너 레지스트리를 선택합니다.
  2. 기본 사항 탭에서 리소스 그룹을 선택하거나 만들고, 레지스트리 이름을 입력합니다. SKU에서 프리미엄을 선택합니다.
  3. 암호화 탭의 고객 관리형 키에서 사용을 선택합니다.
  4. ID에서 사용자가 만든 관리 ID를 선택합니다.
  5. 암호화에서 다음 옵션 중 하나를 선택합니다.
    • Key Vault에서 선택을 선택하고 기존 Key Vault 및 키 또는 새로 만들기를 선택합니다. 선택한 키는 버전이 지정되지 않으며 자동 키 순환을 사용하도록 설정합니다.
    • 키 URI 입력을 선택하고 기존 키의 식별자를 제공합니다. 버전이 지정된 키 URI(수동으로 순환해야 하는 키의 경우) 또는 버전이 지정되지 않은 키 URI(자동 키 순환을 사용하는 경우)를 제공할 수 있습니다. 키를 만드는 단계는 이전 섹션을 참조하세요.
  6. 검토 + 만들기를 선택합니다.
  7. 만들기를 선택하여 레지스트리 인스턴스를 배포합니다.

Screenshot that shows options for creating an encrypted registry in the 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 이름 및 만든 Key Vault 이름과 키 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>
    

다음 단계

다음 문서로 이동하여 고객 관리형 키를 순환하고, 키 버전을 업데이트하고, 고객 관리형 키를 해지하는 방법을 안내합니다.