배포 데이터 암호화
사용자가 클라우드에서 ACI(Azure Container Instances) 리소스를 실행할 때 ACI 서비스는 컨테이너와 관련된 데이터를 수집하고 저장합니다. ACI는 이 데이터가 클라우드에 저장될 때 자동으로 암호화합니다. 이 암호화는 데이터를 보호하여 조직의 보안 및 규정 준수 약정을 준수하는 데 도움이 됩니다. 또한 ACI는 고유한 키로 이 데이터를 암호화하여 ACI 배포와 관련된 데이터를 더 효율적으로 제어할 수 있는 옵션도 제공합니다.
ACI 데이터 암호화
ACI의 데이터는 256비트 AES 암호화를 사용하여 암호화되고 암호 해독됩니다. 이 암호화는 모든 ACI 배포에서 사용하도록 설정되어 있으므로 배포나 컨테이너를 수정하지 않아도 이용할 수 있습니다. 이 적용 범위에는 배포에 대한 메타데이터, 환경 변수, 컨테이너에 전달되는 키, 컨테이너가 중지된 후에도 계속 볼 수 있는 로그가 포함됩니다. 암호화는 컨테이너 그룹 성능에 영향을 주지 않으며 추가 비용이 들지 않습니다.
Microsoft 관리형 키를 컨테이너 데이터 암호화에 사용할 수도 있고 자체 키를 사용하여 암호화를 관리할 수도 있습니다. 다음 표에서는 해당 옵션을 비교합니다.
Microsoft 관리형 키 | 고객 관리형 키 | |
---|---|---|
암호화/암호 해독 작업 | Azure | Azure |
키 스토리지 | Microsoft 키 저장소 | Azure Key Vault |
키 회전 책임 | Microsoft | 고객 |
키 액세스 | Microsoft 전용 | Microsoft, 고객 |
이 문서에서는 고객 관리형 키를 사용하여 데이터를 암호화하는 두 가지 흐름을 검토합니다.
- 표준 Azure Key Vault에 저장된 고객 관리형 키로 데이터 암호화
- 신뢰할 수 있는 서비스를 사용하도록 설정한 네트워크로 보호되는 Azure Key Vault에 저장된 고객 관리형 키를 사용하여 데이터를 암호화합니다.
표준 Azure Key Vault에 저장된 고객 관리형 키로 데이터 암호화
사전 요구 사항
Azure Cloud Shell에서 Bash 환경을 사용합니다. 자세한 내용은 Azure Cloud Shell의 Bash에 대한 빠른 시작을 참조하세요.
CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
az version을 실행하여 설치된 버전과 종속 라이브러리를 찾습니다. 최신 버전으로 업그레이드하려면 az upgrade를 실행합니다.
ACI의 서비스 주체 만들기
첫 번째 단계에서는 Azure 테넌트에 Azure Container Instances 서비스에 대한 사용 권한을 부여하기 위한 서비스 주체가 할당되어 있는지 확인합니다.
Important
다음 명령을 실행하여 서비스 주체를 만들려면 테넌트에서 서비스 주체를 만들 수 있는 권한이 있는지 확인하세요.
다음 CLI 명령은 Azure 환경에서 ACI SP를 설정합니다.
az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9
이 명령을 실행한 출력에는 “displayName”: “Azure Container Instance 서비스”로 설정된 서비스 주체가 표시됩니다.
서비스 주체를 만들 수 없는 경우 다음을 수행합니다.
- 테넌트에서 이 작업을 수행할 수 있는 권한이 있는지 확인
- ACI에 배포할 서비스 주체가 테넌트에 이미 있는지 확인. 이렇게 하려면
az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9
를 실행하고 대신 해당 서비스 주체를 사용합니다.
Key Vault 리소스 만들기
Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 Azure Key Vault를 만듭니다.
키 자격 증명 모음의 속성은 다음 지침을 따릅니다.
- Name: 고유 이름은 필수입니다.
- 구독: 구독을 선택합니다.
- 리소스 그룹에서 기존 리소스 그룹을 선택하거나, 새로 만들고 리소스 그룹 이름을 입력합니다.
- 위치 풀 다운 메뉴에서 위치를 선택합니다.
- 다른 옵션은 기본값으로 두거나 추가 요구 사항에 따라 선택할 수 있습니다.
Important
고객 관리형 키를 사용하여 ACI 배포 템플릿을 암호화할 때는 키 자격 증명 모음에서 일시 삭제와 제거 안 함의 두 가지 속성을 설정하는 것이 좋습니다. 두 속성은 기본적으로 설정되어 있지 않지만 새로운 또는 기존 키 자격 증명 모음에서 PowerShell 또는 Azure CLI를 사용하여 설정할 수 있습니다.
새로운 키 생성
키 자격 증명 모음을 만든 후 Azure Portal에서 리소스로 이동합니다. 리소스 블레이드의 왼쪽 탐색 메뉴에 있는 설정에서 키를 선택합니다. “키”의 보기에서 “생성/가져오기”를 선택하여 새 키를 생성합니다. 이 키의 고유한 이름을 사용하고 요구 사항에 따라 기타 기본 설정을 지정합니다.
액세스 정책 설정
ACI 서비스에서 키에 액세스할 수 있도록 하는 새 액세스 정책을 만듭니다.
- 키를 생성한 후, 키 자격 증명 모음 리소스 블레이드로 돌아가 설정에서 액세스 정책을 선택합니다.
- 키 자격 증명 모음의 “액세스 정책” 페이지에서 액세스 정책 추가를 선택합니다.
- 가져오기 및 키 래핑 해제를 포함하도록 키 권한 설정
- ‘보안 주체 선택’에서 Azure Container Instance 서비스를 선택합니다.
- 아래쪽에서 추가 선택
이제 액세스 정책이 키 자격 증명 모음의 액세스 정책에 표시됩니다.
JSON 배포 템플릿 수정
Important
고객 관리형 키로 배포 데이터 암호화는 현재 출시 중인 최신 API 버전(2019-12-01)에서 사용할 수 있습니다. 배포 템플릿에 이 API 버전을 지정합니다. 관련하여 문제가 있는 경우 Azure 지원에 문의하세요.
키 자격 증명 모음 키와 액세스 정책을 설정했으면 ACI 배포 템플릿에 다음 속성을 추가합니다. 템플릿을 사용하여 ACI 리소스를 배포하는 방법에 대한 자세한 내용은 Tutorial: Deploy a multi-container group using a Resource Manager template(자습서: 에서 Resource Manager 템플릿을 사용하여 다중 컨테이너 그룹 배포)을 참조하세요.
resources
에서apiVersion
을2019-12-01
로 설정합니다.- 배포 템플릿의 컨테이너 그룹 속성 섹션에서 다음 값을 포함하는
encryptionProperties
를 추가합니다.vaultBaseUrl
: 키 자격 증명 모음의 DNS 이름이며, Portal에서 키 자격 증명 모음 리소스의 개요 블레이드에서 확인할 수 있습니다.keyName
: 이전에 생성된 키의 이름keyVersion
: 키의 현재 버전. 이 필드는 키 자체로 이동하여 확인할 수 있습니다(키 자격 증명 모음 리소스의 설정 섹션에 있는 “키” 선택).
- 컨테이너 그룹 속성 아래에
Standard
값을 사용하여sku
속성을 추가합니다.sku
속성은 API 버전 2019-12-01에서 필수입니다.
다음 템플릿 코드 조각에서는 배포 데이터를 암호화하는 이러한 추가 속성을 보여 줍니다.
[...]
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx"
},
"sku": "Standard",
"containers": {
[...]
}
}
}
]
다음은 Tutorial: Deploy a multi-container group using a Resource Manager template(자습서: Resource Manager 템플릿을 사용하여 다중 컨테이너 그룹 배포)에서 가져온 전체 템플릿입니다.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"containerGroupName": {
"type": "string",
"defaultValue": "myContainerGroup",
"metadata": {
"description": "Container Group name."
}
}
},
"variables": {
"container1name": "aci-tutorial-app",
"container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
"container2name": "aci-tutorial-sidecar",
"container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
},
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx"
},
"sku": "Standard",
"containers": [
{
"name": "[variables('container1name')]",
"properties": {
"image": "[variables('container1image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
},
"ports": [
{
"port": 80
},
{
"port": 8080
}
]
}
},
{
"name": "[variables('container2name')]",
"properties": {
"image": "[variables('container2image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
}
}
}
],
"osType": "Linux",
"ipAddress": {
"type": "Public",
"ports": [
{
"protocol": "tcp",
"port": "80"
},
{
"protocol": "tcp",
"port": "8080"
}
]
}
}
}
],
"outputs": {
"containerIPv4Address": {
"type": "string",
"value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
}
}
}
리소스 배포
데스크톱에서 템플릿 파일을 만들고 편집했으면 파일을 끌어서 Cloud Shell 디렉터리로 업로드할 수 있습니다.
az group create 명령을 사용하여 리소스 그룹을 만듭니다.
az group create --name myResourceGroup --location eastus
az deployment group create 명령을 사용하여 템플릿을 배포합니다.
az deployment group create --resource-group myResourceGroup --template-file deployment-template.json
몇 초 정도 지나면 Azure에서 초기 응답이 수신됩니다. 배포가 완료되면 ACI 서비스에서 유지하는 배포와 관련된 모든 데이터가 사용자가 제공한 키로 암호화됩니다.
신뢰할 수 있는 서비스를 사용하도록 설정한 네트워크로 보호되는 Azure Key Vault의 고객 관리형 키를 사용하여 데이터를 암호화합니다.
Key Vault 리소스 만들기
Azure Portal, Azure CLI 또는 Azure PowerShell을 사용하여 Azure Key Vault를 만듭니다. 시작하려면 네트워크 제한 사항을 적용하지 마세요. 그래야 자격 증명 모음에 필요한 키를 추가할 수 있습니다. 이후 단계에서 네트워크 제한 사항이 추가되고 신뢰할 수 있는 서비스가 활성화됩니다.
키 자격 증명 모음의 속성은 다음 지침을 따릅니다.
- Name: 고유 이름은 필수입니다.
- 구독: 구독을 선택합니다.
- 리소스 그룹에서 기존 리소스 그룹을 선택하거나, 새로 만들고 리소스 그룹 이름을 입력합니다.
- 위치 풀 다운 메뉴에서 위치를 선택합니다.
- 다른 옵션은 기본값으로 두거나 추가 요구 사항에 따라 선택할 수 있습니다.
Important
고객 관리형 키를 사용하여 ACI 배포 템플릿을 암호화할 때는 키 자격 증명 모음에서 일시 삭제와 제거 안 함의 두 가지 속성을 설정하는 것이 좋습니다. 두 속성은 기본적으로 설정되어 있지 않지만 새로운 또는 기존 키 자격 증명 모음에서 PowerShell 또는 Azure CLI를 사용하여 설정할 수 있습니다.
새로운 키 생성
키 자격 증명 모음을 만든 후 Azure Portal에서 리소스로 이동합니다. 리소스 블레이드의 왼쪽 탐색 메뉴에 있는 설정에서 키를 선택합니다. “키”의 보기에서 “생성/가져오기”를 선택하여 새 키를 생성합니다. 이 키의 고유한 이름을 사용하고 요구 사항에 따라 기타 기본 설정을 지정합니다. 후속 단계를 위해 키 이름 및 버전을 캡처해야 합니다.
컨테이너 그룹에 대한 사용자 할당 관리 ID 만들기
az identity create 명령을 사용하여 구독에서 ID를 만듭니다. 키 자격 증명 모음을 만드는 데 사용한 동일한 리소스 그룹을 사용하거나 다른 리소스 그룹을 사용할 수 있습니다.
az identity create \
--resource-group myResourceGroup \
--name myACIId
다음 단계에서 ID를 사용하려면 az identity show 명령을 사용하여 ID의 서비스 주체 ID 및 리소스 ID를 변수에 저장합니다.
# Get service principal ID of the user-assigned identity
spID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query principalId --output tsv)
액세스 정책 설정
사용자 할당 ID가 암호화를 위해 키에 액세스하고 래핑을 해제할 수 있도록 하는 새 액세스 정책을 만듭니다.
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $spID \
--key-permissions get unwrapKey
Azure Key Vault 네트워크 권한 수정
다음 명령은 Azure Key Vault에 대한 Azure Firewall을 설정하고 ACI 액세스와 같은 Azure 신뢰할 수 있는 서비스를 허용합니다.
az keyvault update \
--name mykeyvault \
--resource-group myResourceGroup \
--default-action Deny
az keyvault update \
--name mykeyvault \
--resource-group myResourceGroup \
--bypass AzureServices
JSON 배포 템플릿 수정
Important
고객 관리형 키를 사용하여 배포 데이터를 암호화하는 작업은 2022-09-01 API 버전 이상에서 사용할 수 있습니다. 2022-09-01 API 버전은 ARM 또는 REST를 통해서만 사용할 수 있습니다. 관련하여 문제가 있는 경우 Azure 지원에 문의하세요. 키 자격 증명 모음 키와 액세스 정책을 설정했으면 ACI 배포 템플릿에 다음 속성을 추가합니다. 템플릿을 사용하여 ACI 리소스를 배포하는 방법에 대한 자세한 내용은 Tutorial: Deploy a multi-container group using a Resource Manager template(자습서: 에서 Resource Manager 템플릿을 사용하여 다중 컨테이너 그룹 배포)을 참조하세요.
resources
에서apiVersion
을2022-09-01
로 설정합니다.- 배포 템플릿의 컨테이너 그룹 속성 섹션에서 다음 값을 포함하는
encryptionProperties
를 추가합니다.vaultBaseUrl
: Key Vault의 DNS 이름입니다. 이 속성은 Portal에서 키 자격 증명 모음 리소스의 개요 블레이드에서 확인할 수 있습니다.keyName
: 이전에 생성된 키의 이름keyVersion
: 키의 현재 버전. 이 속성은 키 자체를 클릭하여 확인할 수 있습니다(키 자격 증명 모음 리소스의 설정 섹션에 있는 “키” 선택).identity
: 이 속성은 이전에 만든 관리 ID 인스턴스의 리소스 URI입니다.
- 컨테이너 그룹 속성 아래에
Standard
값을 사용하여sku
속성을 추가합니다.sku
속성은 API 버전 2022-09-01에서 필수입니다. - 리소스 아래에서 다음 값을 포함하는 ACI에서 관리 ID를 사용하는 데 필요한
identity
개체를 추가합니다.type
: 사용 중인 ID 유형(사용자 할당 또는 시스템 할당)입니다. 이 경우 "UserAssigned"로 설정됩니다.userAssignedIdentities
:encryptionProperties
개체에서 사용한 것과 동일한 사용자 할당 ID의 resourceURI입니다.
다음 템플릿 코드 조각에서는 배포 데이터를 암호화하는 이러한 추가 속성을 보여 줍니다.
[...]
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
}
},
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx",
"identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
},
"sku": "Standard",
"containers": {
[...]
}
}
}
]
다음은 Tutorial: Deploy a multi-container group using a Resource Manager template(자습서: Resource Manager 템플릿을 사용하여 다중 컨테이너 그룹 배포)에서 가져온 전체 템플릿입니다.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"containerGroupName": {
"type": "string",
"defaultValue": "myContainerGroup",
"metadata": {
"description": "Container Group name."
}
}
},
"variables": {
"container1name": "aci-tutorial-app",
"container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
"container2name": "aci-tutorial-sidecar",
"container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
},
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2022-09-01",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
}
},
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx",
"identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
},
"sku": "Standard",
"containers": [
{
"name": "[variables('container1name')]",
"properties": {
"image": "[variables('container1image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
},
"ports": [
{
"port": 80
},
{
"port": 8080
}
]
}
},
{
"name": "[variables('container2name')]",
"properties": {
"image": "[variables('container2image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
}
}
}
],
"osType": "Linux",
"ipAddress": {
"type": "Public",
"ports": [
{
"protocol": "tcp",
"port": "80"
},
{
"protocol": "tcp",
"port": "8080"
}
]
}
}
}
],
"outputs": {
"containerIPv4Address": {
"type": "string",
"value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
}
}
}
리소스 배포
데스크톱에서 템플릿 파일을 만들고 편집했으면 파일을 끌어서 Cloud Shell 디렉터리로 업로드할 수 있습니다.
az group create 명령을 사용하여 리소스 그룹을 만듭니다.
az group create --name myResourceGroup --location eastus
az deployment group create 명령을 사용하여 템플릿을 배포합니다.
az deployment group create --resource-group myResourceGroup --template-file deployment-template.json
몇 초 정도 지나면 Azure에서 초기 응답이 수신됩니다. 배포가 완료되면 ACI 서비스에서 유지하는 배포와 관련된 모든 데이터가 사용자가 제공한 키로 암호화됩니다.