자습서: Azure Container Instances에서 기밀 컨테이너에 대한 배포 준비

Azure Container Instances에서 서버리스 플랫폼의 기밀 컨테이너를 사용하여 하드웨어 기반 및 TEE(신뢰할 수 있는 실행 환경)에서 컨테이너 애플리케이션을 실행할 수 있습니다. 이 기능은 사용 중인 데이터를 보호하고 보안 중첩 페이징을 통해 메모리 내 암호화를 제공할 수 있습니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 기밀 컨테이너 그룹에 대한 ARM 템플릿(Azure Resource Manager 템플릿)을 만듭니다.
  • CCE(기밀 컴퓨팅 적용) 정책을 생성합니다.
  • 기밀 컨테이너 그룹을 Azure에 배포합니다.

필수 조건

이 자습서를 완료하려면 다음 요구 사항을 충족해야 합니다.

  • Azure CLI: 로컬 컴퓨터에 Azure CLI 버전 2.44.1 이상이 설치되어 있어야 합니다. az --version를 실행하여 버전을 찾습니다. 설치 또는 업그레이드가 필요한 경우, Azure CLI 설치를 참조하세요.

  • Azure CLI confcom 확장: 기밀 컴퓨팅 적용 정책을 생성하려면 Azure CLI confcom 확장 버전 0.30 이상이 설치되어 있어야 합니다.

    az extension add -n confcom
    
  • Docker: 로컬에 Docker를 설치해야 합니다. Docker는 macOS, WindowsLinux에서 Docker 환경을 구성하는 패키지를 제공합니다.

    이 자습서에서는 컨테이너, 컨테이너 이미지 및 기본 명령과 같은 핵심 Docker 개념에 대한 기본적인 docker 이해를 가정합니다. Docker 및 컨테이너에 대한 기본 사항은 Docker 개요를 참조하세요.

Important

Azure Cloud Shell에는 Docker 디먼이 포함되어 있지 않으므로 이 자습서를 완료하려면 로컬 컴퓨터에 Azure CLI와 Docker 엔진을 모두 설치해야 합니다. 이 자습서에서는 Azure Cloud Shell을 사용할 수 없습니다.

Container Instances 컨테이너 그룹에 대한 ARM 템플릿 만들기

이 자습서에서는 하드웨어 증명 보고서를 생성하는 헬로 월드 애플리케이션을 배포합니다. 이 애플리케이션의 속성을 정의하기 위해 컨테이너 그룹 리소스가 포함된 ARM 템플릿을 만드는 것부터 시작합니다. 그런 다음 Azure CLI confcom 도구와 함께 이 ARM 템플릿을 사용하여 증명을 위한 CCE 정책을 생성합니다.

이 자습서에서는 이 ARM 템플릿을 예로 사용합니다. 이 애플리케이션의 소스 코드를 보려면 Azure Container Instances 기밀 헬로 월드 참조하세요.

예제 템플릿은 컨테이너 그룹을 기밀로 만들기 위해 Container Instances 리소스 정의에 두 개의 속성을 추가합니다.

  • sku: 기밀 및 표준 컨테이너 그룹 배포 중에서 선택할 수 있습니다. 이 속성을 리소스에 추가하지 않으면 컨테이너 그룹이 표준 배포가 됩니다.
  • confidentialComputeProperties: 컨테이너 그룹의 증명을 위해 사용자 지정 CCE 정책을 전달할 수 있습니다. 이 개체를 리소스에 추가하지 않으면 컨테이너 그룹 내에서 실행되는 소프트웨어 구성 요소의 유효성이 검사되지 않습니다.

참고 항목

ccePolicy 아래 confidentialComputeProperties 매개 변수가 비어 있습니다. 자습서의 뒷부분에서 정책을 생성한 후에 입력합니다.

기본 텍스트 편집기를 사용하여 이 ARM 템플릿을 로컬 컴퓨터에 template.json으로 저장합니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "name": {
        "type": "string",
        "defaultValue": "helloworld",
        "metadata": {
          "description": "Name for the container group"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "North Europe",
        "metadata": {
          "description": "Location for all resources."
        }
      },
      "image": {
        "type": "string",
        "defaultValue": "mcr.microsoft.com/aci/aci-confidential-helloworld:v1",
        "metadata": {
          "description": "Container image to deploy. Should be of the form repoName/imagename:tag for images stored in public Docker Hub, or a fully qualified URI for other registries. Images from private registries require additional registry credentials."
        }
      },
      "port": {
        "type": "int",
        "defaultValue": 80,
        "metadata": {
          "description": "Port to open on the container and the public IP address."
        }
      },
      "cpuCores": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The number of CPU cores to allocate to the container."
        }
      },
      "memoryInGb": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The amount of memory to allocate to the container in gigabytes."
        }
      },
      "restartPolicy": {
        "type": "string",
        "defaultValue": "Never",
        "allowedValues": [
          "Always",
          "Never",
          "OnFailure"
        ],
        "metadata": {
          "description": "The behavior of Azure runtime if container has stopped."
        }
      }
    },
    "resources": [
      {
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2023-05-01",
        "name": "[parameters('name')]",
        "location": "[parameters('location')]",
        "properties": {
          "confidentialComputeProperties": {
            "ccePolicy": ""
          },
          "containers": [
            {
              "name": "[parameters('name')]",
              "properties": {
                "image": "[parameters('image')]",
                "ports": [
                  {
                    "port": "[parameters('port')]",
                    "protocol": "TCP"
                  }
                ],
                "resources": {
                  "requests": {
                    "cpu": "[parameters('cpuCores')]",
                    "memoryInGB": "[parameters('memoryInGb')]"
                  }
                }
              }
            }
          ],
          "sku": "Confidential",
          "osType": "Linux",
          "restartPolicy": "[parameters('restartPolicy')]",
          "ipAddress": {
            "type": "Public",
            "ports": [
              {
                "port": "[parameters('port')]",
                "protocol": "TCP"
              }
            ]
          }
        }
      }
    ],
    "outputs": {
      "containerIPv4Address": {
        "type": "string",
        "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups', parameters('name'))).ipAddress.ip]"
      }
    }
  }

사용자 지정 CCE 정책 만들기

만든 ARM 템플릿 및 Azure CLI confcom 확장을 사용하여 사용자 지정 CCE 정책을 생성할 수 있습니다. CCE 정책은 증명에 사용됩니다. 이 도구는 ARM 템플릿을 입력으로 사용하여 정책을 생성합니다. 정책은 특정 컨테이너 이미지, 환경 변수, 탑재 및 명령을 적용하며, 컨테이너 그룹이 시작될 때 유효성을 검사할 수 있습니다. Azure CLI confcom 확장에 대한 자세한 내용은 GitHub설명서를 참조하세요.

  1. CCE 정책을 생성하려면 ARM 템플릿을 입력으로 사용하여 다음 명령을 실행합니다.

    az confcom acipolicygen -a .\template.json --print-policy
    

    이 명령이 완료되면 출력으로 생성된 Base64 문자열이 다음 형식으로 표시됩니다. 이 문자열은 ARM 템플릿을 복사하여 속성 값 ccePolicy 으로 붙여넣는 CCE 정책입니다.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. ARM 템플릿의 로컬 복사본에 변경 내용을 저장합니다.

템플릿 배포

다음 단계에서는 Azure Portal을 사용하여 템플릿을 배포합니다. Azure PowerShell, Azure CLI 또는 REST API를 사용할 수도 있습니다. 다른 배포 방법에 대한 자세한 내용은 템플릿 배포를 참조 하세요.

  1. Azure에 배포 단추를 선택하여 Azure 에 로그인하고 Container Instances 배포를 시작합니다.

    Button to deploy the Resource Manager template to Azure.

  2. 편집기에서 사용자 고유의 템플릿을 빌드합니다.를 선택합니다.

    Screenshot of the button for building your own template in the editor.

    표시되는 템플릿 JSON은 대부분 비어 있습니다.

  3. 파일 로드를 선택하고 이전 단계에서 CCE 정책을 추가하여 수정한 template.json 업로드합니다.

    Screenshot of the button for loading a file.

  4. 저장을 선택합니다.

  5. 다음 값을 선택하거나 입력합니다.

    • 구독: Azure 구독을 선택합니다.
    • 리소스 그룹: 새로 만들기를 선택하고 리소스 그룹에 고유한 이름을 입력한 다음, 확인을 선택합니다.
    • 이름: 인스턴스에 대해 생성된 이름을 적용하거나 이름을 입력합니다.
    • 위치: 리소스 그룹의 위치를 선택합니다. 기밀 컨테이너가 지원되는 지역을 선택합니다. 예: 북유럽.
    • 이미지: 기본 이미지 이름을 적용합니다. 이 샘플 Linux 이미지는 하드웨어 증명을 표시합니다.

    다시 기본 속성에 대한 기본값을 적용한 다음 검토 + 만들기를 선택합니다.

    Screenshot of details for a custom ARM template deployment.

  6. 사용 약관을 검토합니다. 동의하는 경우 위에 명시된 사용 약관에 동의함을 선택합니다.

  7. 배포 성공 알림이 나타날 때까지 기다립니다. 인스턴스를 성공적으로 생성했음을 확인합니다.

    Screenshot of a portal notification for successful deployment.

배포된 리소스 검토

다음 단계에서는 Azure Portal을 사용하여 컨테이너 인스턴스의 속성을 검토합니다. Azure CLI와 같은 도구를 사용할 수도 있습니다.

  1. 포털에서 Container Instances를 검색한 다음, 만든 컨테이너 인스턴스를 선택합니다.

  2. 개요 페이지에서 인스턴스 및 해당 IP 주소의 상태 기록해 둡니다.

    Screenshot of the overview page for a container group instance.

  3. 인스턴스의 상태 실행 중이면 브라우저에서 IP 주소로 이동합니다.

    Screenshot of a browser view of an app deployed via Azure Container Instances.

    Azure Container Instances 로고 아래에 증명 보고서가 있으면 컨테이너가 TEE를 지원하는 하드웨어에서 실행되고 있음을 확인합니다.

    TEE를 지원하지 않는 하드웨어에 배포하는 경우(예: Container Instances 기밀을 사용할 수 없는 지역을 선택하면) 증명 보고서가 나타나지 않습니다.

이제 Container Instances에 기밀 컨테이너 그룹을 배포했으므로 정책이 적용되는 방법에 대해 자세히 알아볼 수 있습니다.