고객 관리형 키를 사용하여 암호화된 스토리지 계정을 배포하는 Azure Managed Application 만들기

이 문서에서는 고객 관리형 키를 사용하여 암호화된 스토리지 계정을 배포하는 Azure Managed Application을 만드는 방법을 설명합니다. 스토리지 계정, Cosmos DB 및 Azure Database for Postgres는 고객 관리형 키 또는 Microsoft 관리 키를 사용하여 미사용 데이터 암호화를 지원합니다. 사용자 고유의 암호화 키를 사용하여 스토리지 계정에서 데이터를 보호할 수 있습니다. 고객 관리형 키를 지정하는 경우 해당 키는 데이터를 암호화하는 키에 대한 액세스를 보호하고 제어하는 데 사용됩니다. 고객 관리형 키를 사용하면 훨씬 더 유연하게 액세스 제어를 관리할 수 있습니다.

필수 조건

관리 ID

관리되는 애플리케이션에서 배포한 스토리지 계정에 대한 고객 관리형 키를 관리되는 리소스 그룹 내의 리소스로 구성하려면 사용자가 할당한 관리 ID가 필요합니다. 이 사용자가 할당한 관리 ID를 사용하여 다른 기존 리소스에 대한 액세스 권한을 관리되는 애플리케이션에 부여할 수 있습니다. 사용자가 할당한 관리 ID를 사용하여 관리 애플리케이션을 구성하는 방법을 알아보려면 관리 ID가 있는 Azure Managed Application을 참조하세요.

애플리케이션에 두 가지 형식의 ID를 부여할 수 있습니다.

  • 시스템이 할당한 관리 ID는 애플리케이션에 할당되고, 앱이 삭제되면 이 ID도 삭제됩니다. 앱에는 하나의 시스템 할당 관리 ID만 있을 수 있습니다.
  • 사용자 할당 관리 ID는 앱에 할당할 수 있는 독립 실행형 Azure 리소스입니다. 앱에는 여러 사용자 할당 관리 ID가 있을 수 있습니다.

기존 키 자격 증명 모음의 고객 키를 사용하여 암호화된 관리되는 애플리케이션의 관리되는 리소스 그룹에 스토리지 계정을 배포하려면 더 많은 구성이 필요합니다. 관리되는 애플리케이션으로 구성된 관리 ID에는 키 자격 증명 모음에 액세스할 수 있는 관리 ID에 대한 기본 제공 Azure 역할 기반 액세스 제어 관리 ID 운영자가 필요합니다. 자세한 내용은 관리 ID 운영자 역할을 참조하세요.

제거 방지가 있는 키 자격 증명 모음 만들기

  1. Azure Portal에 로그인합니다.
  2. Azure Portal 메뉴 또는 홈페이지에서 리소스 만들기를 선택합니다.
  3. 검색 상자에 Key Vault를 입력합니다.
  4. 결과 목록에서 Key Vault를 선택합니다.
  5. Key Vault 섹션에서 만들기를 선택합니다.
  6. Key Vault 만들기 섹션에 다음 정보를 입력합니다.
    • 구독: 구독을 선택합니다.
    • 리소스 그룹: 새로 만들기를 선택하고 이름(예: demo-cmek-rg)을 입력합니다.
    • 이름: 고유한 이름(예: demo-keyvault-cmek)이 필요합니다.
    • 지역: 위치(예: 미국 동부)를 선택합니다.
    • 가격 책정 계층: 드롭다운 목록에서 표준을 선택합니다.
    • 제거 방지: 제거 방지 사용을 선택합니다.
  7. 다음을 선택하고 액세스 정책 탭으로 이동합니다.
    • 액세스 구성: 역할 기반 액세스 제어를 선택합니다.
    • 다른 모든 옵션에 대해 기본값을 적용합니다.
  8. 검토 + 만들기를 선택합니다.
  9. 설정이 올바른지 확인하고 만들기를 선택합니다.

성공적으로 배포되면 리소스로 이동을 선택합니다. 개요 탭에서 다음 속성을 적어 둡니다.

  • 자격 증명 모음 이름: 이 예에서 자격 증명 모음 이름은 demo-keyvault-cmek입니다. 이 이름은 다른 단계에서 사용됩니다.
  • 자격 증명 모음 URI: 이 예에서 자격 증명 모음 URI는 https://demo-keyvault-cmek.vault.azure.net/입니다.

사용자 할당 관리 ID 만들기

사용자가 할당한 관리 ID를 만들려면 계정에 관리 ID 기여자 역할 할당이 필요합니다.

  1. 검색 상자에서 관리 ID를 입력합니다.
  2. [서비스] 아래에서 관리 ID를 선택합니다.
  3. 만들기를 선택하고 기본 탭에 다음 값을 입력합니다.
    • 구독: 구독을 선택합니다.
    • 리소스 그룹: 이전 단계에서 만든 demo-cmek-rg 리소스 그룹을 선택합니다.
    • 지역: 지역(예: 미국 동부)을 선택합니다.
    • 이름: 사용자가 할당한 관리 ID의 이름(예: demokeyvaultmi)을 입력합니다.
  4. 검토 + 만들기를 선택합니다.
  5. 유효성 검사 통과가 표시되면 만들기를 선택합니다.

성공적으로 배포되면 리소스로 이동을 선택합니다.

역할 할당 만들기

키 자격 증명 모음에 대한 두 가지 역할 할당을 만들어야 합니다. 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

관리 ID에 키 자격 증명 모음에 대한 키 권한 부여

키를 래핑 및 래핑 해제할 수 있도록 demokeyvaultmi 키 자격 증명 모음 관리 ID에 대한 역할 할당을 만듭니다.

  1. demo-cmek-keyvault 키 자격 증명 모음으로 이동합니다.
  2. 액세스 제어(IAM) 를 선택합니다.
  3. 추가>역할 할당 추가를 선택합니다.
  4. 다음 역할을 할당합니다.
    • 역할: Key Vault 암호화 서비스 암호화 사용자
    • 액세스 할당 대상: 관리 ID
    • 멤버: demokeyvaultmi
  5. 검토 + 할당을 선택하여 설정을 확인합니다.
  6. 검토 + 할당을 선택하여 역할 할당을 만듭니다.

계정에 대한 역할 할당 만들기

계정에서 새 키를 키 자격 증명 모음에 만들 수 있도록 다른 역할 할당을 만듭니다.

  1. 다음 역할을 할당합니다.
    • 역할: 키 자격 증명 모음 암호화 책임자
    • 액세스 할당 대상: 사용자, 그룹 또는 서비스 주체
    • 멤버: Microsoft Entra 계정
  2. 검토 + 할당을 선택하여 설정을 확인합니다.
  3. 검토 + 할당을 선택하여 역할 할당을 만듭니다.

키 자격 증명 모음의 역할 할당은 액세스 제어(IAM)>역할 할당에서 확인할 수 있습니다.

키 만들기

키 자격 증명 모음에서 스토리지 계정을 암호화하는 데 사용하는 키를 만들어야 합니다.

  1. demo-cmek-keyvault 키 자격 증명 모음으로 이동합니다.
  2. 를 선택합니다.
  3. 생성/가져오기를 선택합니다.
  4. 키 만들기 페이지에서 다음 값을 선택합니다.
    • 옵션: 생성
    • 이름: demo-cmek-key
  5. 다른 옵션에 대해 기본값을 적용합니다.
  6. 만들기를 실행합니다.

키 이름을 적어 두세요. 관리되는 애플리케이션을 배포할 때 이 이름을 사용합니다.

관리되는 애플리케이션에 대한 사용자가 할당한 관리 ID 만들기

관리되는 애플리케이션에 대한 관리 ID로 사용할 사용자가 할당한 관리 ID를 만듭니다.

  1. 검색 상자에 관리 ID를 입력합니다.
  2. [서비스] 아래에서 관리 ID를 선택합니다.
  3. 만들기를 실행합니다.
    • 구독: 구독을 선택합니다.
    • 리소스 그룹: demo-cmek-rg 리소스 그룹을 선택합니다.
    • 지역: 지역(예: 미국 동부)을 선택합니다.
    • 이름: 사용자가 할당한 관리 ID의 이름(예: demomanagedappmi)을 입력합니다.
  4. 검토 + 만들기를 선택합니다.
  5. 유효성 검사 통과가 표시되면 만들기를 선택합니다.

성공적으로 배포되면 리소스로 이동을 선택합니다.

관리 ID에 역할 권한 할당

demokeyvaultmi라는 관리 ID 운영자 역할을 사용자가 할당한 관리 ID 범위의 관리 ID에 할당합니다.

  1. demokeyvaultmi라는 사용자가 할당한 관리 ID로 이동합니다.
  2. 액세스 제어(IAM) 를 선택합니다.
  3. 역할 할당 추가>를 선택하여 역할 할당 추가 페이지를 엽니다.
  4. 다음 역할을 할당합니다.
    • 역할: 관리 ID 운영자
    • 액세스 할당 대상: 관리 ID
    • 멤버: demomanagedappmi
  5. 검토 + 할당을 선택하여 설정을 확인합니다.
  6. 검토 + 할당을 선택하여 역할 할당을 만듭니다.

demokeyvaultmi에 대한 역할 할당은 액세스 제어(IAM)>역할 할당에서 확인할 수 있습니다.

관리되는 애플리케이션 템플릿 샘플

스토리지 계정을 관리되는 리소스 그룹에 배포하는 관리되는 애플리케이션을 만들고, 기존 키 자격 증명 모음의 키를 사용하여 스토리지 계정의 데이터를 암호화합니다.

관리되는 애플리케이션을 서비스 카탈로그에 게시하려면 다음 작업을 수행합니다.

  1. 이 문서의 샘플에서 creatUIDefinition.json 파일을 만듭니다. 이 템플릿은 관리되는 애플리케이션을 배포할 때 포털의 사용자 인터페이스 요소를 정의합니다.
  2. 이 문서의 Bicep 파일을 JSON으로 변환하여 mainTemplate.json이라는 Azure Resource Manager 템플릿을 만듭니다. 이 템플릿은 관리되는 애플리케이션에서 배포할 리소스를 정의합니다.
  3. 필요한 JSON 파일(createUiDefinition.jsonmainTemplate.json)이 포함된 .zip 패키지를 만듭니다.
  4. 서비스 카탈로그에서 사용할 수 있도록 관리형 애플리케이션 정의를 게시합니다. 자세한 내용은 빠른 시작: Azure Managed Application 정의 만들기 및 게시를 참조하세요.

createUiDefinition.json 템플릿 만들기

다음 템플릿은 관리되는 애플리케이션에 대한 사용자가 할당한 관리 ID를 만듭니다. 다음 예제에서는 키 자격 증명 모음의 관리 ID에 대한 관리 ID 운영자 권한을 사용하여 사용자가 할당한 관리 ID를 미리 구성해야 하므로 시스템이 할당한 관리 ID를 사용하지 않도록 설정합니다.

  1. Visual Studio Code에서 creatUIDefinition.json이라는 새 파일을 만듭니다.
  2. 다음 코드를 복사하여 파일에 붙여 넣습니다.
  3. 파일을 저장합니다.
{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings and Managed Identity for the application",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings - Config",
        "elements": [
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration for the Application (Needs Managed Identity Operator permissions over KV Managed Identity).",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": true,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": true
            },
            "visible": true
          }
        ]
      },
      {
        "name": "configuration",
        "type": "Microsoft.Common.Section",
        "label": "Configuration",
        "elements": [
          {
            "name": "cmek",
            "type": "Microsoft.Common.Section",
            "label": "Customer Managed Encryption Key (CMEK)",
            "elements": [
              {
                "name": "cmekEnable",
                "type": "Microsoft.Common.CheckBox",
                "label": "Enable CMEK",
                "toolTip": "Enable to provide a CMEK",
                "constraints": {
                  "required": false
                }
              },
              {
                "name": "cmekKeyVaultUrl",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Vault URL",
                "toolTip": "Specify the CMEK Key Vault URL",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyName",
                "type": "Microsoft.Common.TextBox",
                "label": "Key Name",
                "toolTip": "Specify the key name from your key vault.",
                "defaultValue": "",
                "constraints": {
                  "required": "[steps('configuration').cmek.cmekEnable]",
                  "regex": ".*",
                  "validationMessage": "The value must not be empty."
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              },
              {
                "name": "cmekKeyIdentity",
                "type": "Microsoft.ManagedIdentity.IdentitySelector",
                "label": "Managed Identity Configuration for Key Vault Access",
                "toolTip": {
                  "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
                  "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
                },
                "defaultValue": {
                  "systemAssignedIdentity": "Off"
                },
                "options": {
                  "hideSystemAssignedIdentity": true,
                  "hideUserAssignedIdentity": false,
                  "readOnlySystemAssignedIdentity": true
                },
                "visible": "[steps('configuration').cmek.cmekEnable]"
              }
            ],
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
      "cmekConfig": {
        "kvUrl": "[if(empty(steps('configuration').cmek.cmekKeyVaultUrl), '', steps('configuration').cmek.cmekKeyVaultUrl)]",
        "keyName": "[if(empty(steps('configuration').cmek.cmekKeyName), '', steps('configuration').cmek.cmekKeyName)]",
        "identityId": "[if(empty(steps('configuration').cmek.cmekKeyIdentity), '', steps('configuration').cmek.cmekKeyIdentity)]"
      }
    }
  }
}

mainTemplate.json 템플릿 만들기

다음 Bicep 파일은 mainTemplate.json의 소스 코드입니다. 이 템플릿은 createUiDefinition.json 파일에 정의된 사용자가 할당한 관리 ID를 사용합니다.

  1. Visual Studio Code에서 mainTemplate.bicep이라는 새 파일을 만듭니다.
  2. 다음 코드를 복사하여 파일에 붙여 넣습니다.
  3. 파일을 저장합니다.
param cmekConfig object = {
  kvUrl: ''
  keyName: ''
  identityId: {}
}
@description('Specify the Azure region to place the application definition.')
param location string = resourceGroup().location
/////////////////////////////////
// Common Resources Configuration
/////////////////////////////////
var commonproperties = {
  name: 'cmekdemo'
  displayName: 'Common Resources'
  storage: {
    sku: 'Standard_LRS'
    kind: 'StorageV2'
    accessTier: 'Hot'
    minimumTlsVersion: 'TLS1_2'

  }
}
var identity = items(cmekConfig.identityId.userAssignedIdentities)[0].key

resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
  name: '${commonproperties.name}${uniqueString(resourceGroup().id)}'
  location: location
  sku: {
    name: commonproperties.storage.sku
  }
  kind: commonproperties.storage.kind
  identity: cmekConfig.identityId
  properties: {
    accessTier: commonproperties.storage.accessTier
    minimumTlsVersion: commonproperties.storage.minimumTlsVersion
    encryption: {
      identity: {
        userAssignedIdentity: identity
      }
      services: {
        blob: {
          enabled: true
        }
        table: {
          enabled: true
        }
        file: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: '${cmekConfig.keyName}'
        keyvaulturi: '${cmekConfig.kvUrl}'
      }
    }
  }
}

PowerShell 또는 Azure CLI를 사용하여 mainTemplate.json 파일을 빌드합니다. Bicep 파일을 저장한 디렉터리로 이동하여 build 명령을 실행합니다.

bicep build mainTemplate.bicep

Bicep 파일이 JSON으로 변환되면 mainTemplate.json 파일이 다음 예와 일치해야 합니다. versiontemplateHash에 대한 metadata 속성에 다른 값이 있을 수 있습니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.16.2.56959",
      "templateHash": "1234567891234567890"
    }
  },
  "parameters": {
    "cmekConfig": {
      "type": "object",
      "defaultValue": {
        "kvUrl": "",
        "keyName": "",
        "identityId": {}
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specify the Azure region to place the application definition."
      }
    }
  },
  "variables": {
    "commonproperties": {
      "name": "cmekdemo",
      "displayName": "Common Resources",
      "storage": {
        "sku": "Standard_LRS",
        "kind": "StorageV2",
        "accessTier": "Hot",
        "minimumTlsVersion": "TLS1_2"
      }
    },
    "identity": "[items(parameters('cmekConfig').identityId.userAssignedIdentities)[0].key]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-05-01",
      "name": "[format('{0}{1}', variables('commonproperties').name, uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('commonproperties').storage.sku]"
      },
      "kind": "[variables('commonproperties').storage.kind]",
      "identity": "[parameters('cmekConfig').identityId]",
      "properties": {
        "accessTier": "[variables('commonproperties').storage.accessTier]",
        "minimumTlsVersion": "[variables('commonproperties').storage.minimumTlsVersion]",
        "encryption": {
          "identity": {
            "userAssignedIdentity": "[variables('identity')]"
          },
          "services": {
            "blob": {
              "enabled": true
            },
            "table": {
              "enabled": true
            },
            "file": {
              "enabled": true
            }
          },
          "keySource": "Microsoft.Keyvault",
          "keyvaultproperties": {
            "keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
            "keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
          }
        }
      }
    }
  ]
}

관리되는 애플리케이션 배포

서비스 카탈로그 정의가 만들어지면 관리되는 애플리케이션을 배포할 수 있습니다. 자세한 내용은 빠른 시작: 서비스 카탈로그 관리되는 애플리케이션 배포를 참조하세요.

배포하는 동안 사용자가 할당한 관리 ID, 키 자격 증명 모음 이름, 키 자격 증명 모음 URL, 키 자격 증명 모음의 키 이름을 사용합니다. createUiDefinition.json 파일은 사용 인터페이스를 만듭니다.

예를 들어 포털 배포의 애플리케이션 설정 탭에서 demomanagedappmi를 추가합니다.

Screenshot of the Application Settings tab to add a user-assigned managed identity.

구성 탭에서 고객 관리형 키를 사용하도록 설정하고, demokeyvaultmi 키 자격 증명 모음에 대한 사용자가 할당한 관리 ID를 추가합니다. 또한 만든 키 자격 증명 모음의 URL과 키 이름을 지정합니다.

Screenshot of the Configuration to enable the customer-managed key, add key vault URL and key name, and add a user-assigned managed identity.

배포 확인

배포가 완료되면 관리되는 애플리케이션의 ID 할당을 확인할 수 있습니다. 사용자가 할당한 demomanagedappmi 관리 ID가 관리되는 애플리케이션에 할당됩니다.

  1. 관리되는 애플리케이션을 배포한 리소스 그룹으로 이동합니다.
  2. 설정>ID 아래에서 사용자 할당(미리 보기)을 선택합니다.

관리되는 애플리케이션에서 배포한 스토리지 계정을 확인할 수도 있습니다. 암호화 탭에는 사용자가 할당한 관리 ID에 대한 demo-cmek-key 키와 리소스 ID가 표시됩니다.

  1. 관리되는 애플리케이션의 스토리지 계정이 배포된 관리되는 리소스 그룹으로 이동합니다.
  2. 보안 + 네트워킹 아래에서 암호화를 선택합니다.

다음 단계