다음을 통해 공유


Azure 로컬 VM에 대한 신뢰할 수 있는 시작에 대한 게스트 증명(미리 보기)

적용 대상: Azure Local 2509 이상

이 문서에서는 Azure Arc에서 사용하도록 설정된 Azure 로컬 VM(가상 머신)에 대해 신뢰할 수 있는 시작에 게스트 증명을 사용하도록 설정하는 방법을 설명합니다. 부팅 무결성 확인이라고도 하는 게스트 증명은 Azure 로컬 버전 2509부터 미리 볼 수 있는 새로운 기능입니다.

게스트 증명을 사용하면 VM이 잘 알려진 정상 상태에서 시작되었는지, 특히 전체 부팅 체인의 무결성을 확인할 수 있는지 확인할 수 있습니다. 이렇게 하면 부팅 체인(펌웨어, OS 부팅 로더 및 드라이버)에 대한 예기치 않은 변경 내용을 감지하여 부팅 체인이 손상된 경우 수정 작업을 수행할 수 있습니다.

게스트 증명을 사용하도록 설정하면 게스트 증명 확장이라는 Azure Arc 확장이 VM에 배포됩니다. 게스트 증명 확장은 부팅 무결성 확인을 지원하기 위해 Microsoft Azure Attestation 서비스와 같은 Azure 서비스와 상호 작용합니다.

필수 조건

Azure Portal을 사용하여 게스트 증명 사용

Azure Portal을 통해 신뢰할 수 있는 시작 Azure 로컬 VM을 만들 때 게스트 증명을 사용하도록 설정할 수 있습니다.

  1. Azure Portal을 통해 신뢰할 수 있는 시작 Azure 로컬 VM을 만드는 일반적인 지침은 Azure Arc에서 사용하도록 설정된 Azure 로컬 가상 머신 만들기 를 참조하세요.

    비고

    VM을 만들 때 네트워크 인터페이스를 지정합니다. 신뢰할 수 있는 시작에는 증명을 위해 네트워크 연결이 필요합니다.

  2. VM을 만들 때 보안 유형을 신뢰할 수 있는 시작으로 선택합니다.

  3. 보안 기능 구성을 선택하고 무결성 모니터링(미리 보기)을 선택합니다.

    보안 기능 섹션의 스크린샷

  4. 가상 머신이 만들어지면 VM 리소스 페이지를 통해 게스트 증명 상태를 볼 수 있습니다.

    가상 머신 만들기 페이지의 스크린샷.

    게스트 증명 상태 Meaning
    Healthy 보안 부팅을 사용하도록 설정하고, 가상 TPM을 사용하도록 설정하고, 부팅 무결성 확인에 성공했습니다.
    건강에 해로운 보안 부팅이 활성화되지 않았거나 가상 TPM이 활성화되지 않았거나 부팅 무결성 모니터링에 성공하지 못했습니다.
    알 수 없음 일시적인 네트워크 또는 통신 문제로 인해 상태를 사용할 수 없습니다.

    타임스탬프는 게스트 증명 상태가 마지막으로 확인된 시기를 보여 줍니다. 상태는 일반적으로 약 8시간마다 새로 고쳐집니다. VM이 실행 중 상태이지만 게스트 증명 상태가 8시간 이상 업데이트되지 않은 경우 게스트 증명 확장이 작동을 중지했거나 VM이 손상되었을 수 있습니다.

  5. 확장 페이지에서 게스트 증명 확장의 상태를 볼 수 있습니다.

    VM 확장 페이지를 보여 주는 스크린샷.

    게스트 증명 확장의 상태가 실패로 보고된 경우 자세한 오류 상태를 볼 수 있습니다.

    오류 세부 정보 페이지를 보여 주는 스크린샷.

Azure CLI를 사용하여 게스트 증명 사용

신뢰할 수 있는 시작 VM 만들기

Azure CLI를 통해 신뢰할 수 있는 시작 Azure 로컬 VM을 만드는 일반적인 지침은 Azure Arc에서 사용하도록 설정된 Azure 로컬 가상 머신 만들기 를 참조하세요.

Azure Arc 게스트 증명 확장 설치

  1. 다음과 같이 확장 설정을 생성합니다.

    • 증명 서비스 엔드포인트
    • 수신자 서비스 엔드포인트
    • 클러스터 ID
    • AAD(Azure Active Directory) 테넌트 ID

    비고

    확장 설정은 대/소문자를 구분합니다.

    예제는 다음과 같습니다.

    # To connect to your Azure Local via Az CLI, see https://learn.microsoft.com/en-us/azure/azure-local/azure-arc-vm-management-prerequisites.md?#azure-command-line-interface-cli-requirements.
    
    # Login to Azure
    [host1]: PS C:\Users\HCIDeploymentUser> az login --use-device-code
    
    # Set your subscription
    [host 1]: PS C:\Users\HCIDeploymentUser> az account set --subscription "<subscription>"
    
    [host1]: PS C:\Users\HCIDeploymentUser> $cluster = (az stack-hci cluster show --subscription  "<subscription>" --resource-group "<resource group>" --name "<Azure Local instance name>") | ConvertFrom-Json
    
    [host1]: PS C:\Users\HCIDeploymentUser> $extensionSettings= '"{\"AttestationConfig\":{\"MaaSettings\":{\"maaEndpoint\": \"' + $cluster.isolatedVmAttestationConfiguration.attestationServiceEndpoint + '\",\"maaTenantName\": \"DUMMY_Tenant_NewConfig\"},\"AscSettings\":{\"ascReportingEndpoint\": \"' + $cluster.isolatedVmAttestationConfiguration.relyingPartyServiceEndpoint + '\",\"ascReportingFrequency\": \"4H\"},\"AzureStackSettings\":{\"clusterId\": \"'+$cluster.id+'\",\"clusterAadTenantId\": \"'+$cluster.aadTenantId+'\"},\"useCustomToken\": \"true\",\"disableAlerts\": \"false\",\"isAzureStack\": \"true\"}}"'
    
  2. 다음 예제와 같이 Azure Arc 게스트 증명 확장을 배포합니다.

    # Check if "connectedmachine" extension is already installed. If it is installed, it should be in the extensions list in the output of the command below. 
    
    [host1]: PS C:\Users\HCIDeploymentUser> az version 
    
    { 
    
    "azure-cli": "2.60.0", 
    "azure-cli-core": "2.60.0", 
    "azure-cli-telemetry": "1.1.0", 
    "extensions": { 
      "aksarc": "1.2.20", 
      "arcappliance": "1.1.1", 
      "connectedk8s": "1.6.2", 
      "customlocation": "0.1.3", 
      "k8s-extension": "1.4.5", 
      "stack-hci-vm": "1.1.11" 
    } 
    } 
    
    
    # if "connectedmachine" extension is not already installed, add "connectedmachine" extension. 
    
    [host1]: PS C:\Users\HCIDeploymentUser> az extension add --name connectedmachine 
    
    az : WARNING: Default enabled including preview versions for extension installation now. Disabled in May 2024. Use '--allow-preview true' 
    
    to enable it specifically if needed. Use '--allow-preview false' to install stable version only. 
    
    + CategoryInfo          : NotSpecified: (WARNING: Defaul... version only. :String) [], RemoteException 
    
    + FullyQualifiedErrorId : NativeCommandError 
    
    WARNING: The installed extension 'connectedmachine' is in preview. 
    
    
    # Run the command below to install the Azure Arc guest attestation extension. 
    
    [host1]: PS C:\Users\HCIDeploymentUser> az connectedmachine extension create --subscription "<subscription>" --resource-group "<resource group>" --machine-name "<name of VM>" --___location "<Azure region of your Azure Local instance>" --publisher "Microsoft.Azure.Security.WindowsAttestation" --type "GuestAttestation" --name "GuestAttestation" --settings $extensionSettings --enable-automatic-upgrade 
    
    { 
    
    "id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.HybridCompute/machines/myTVM/extensions/GuestAttestation", 
    
    "___location": "eastus", 
    "name": "GuestAttestation", 
    "properties": { 
    
        "autoUpgradeMinorVersion": false, 
        "enableAutomaticUpgrade": true, 
        "instanceView": { 
    
        "name": "GuestAttestation", 
    
        "status": { 
    
            "code": "0", 
    
            "level": "Information", 
    
            "message": "Extension Message: Command: None, Status: has successfully completed. Details: [ Running Extension:GuestAttestation Operation:None ], Enable: Starting Enabling Step., Enable: Starting Client. Details: AszAttestationClient -a https://clustxxxxxxxxxx.eus2e.attest.azure.net -r https://dp.stackhci.azure.com/eastus/igvmAttestation/validxxxxx -l C:\\ProgramData\\GuestConfig\\extension_logs\\Microsoft.Azure.Security.WindowsAttestation.GuestAttestation -h C:\\Packages\\Plugins\\Microsoft.Azure.Security.WindowsAttestation.GuestAttestation\\1.0.1.30\\status\\HeartBeat.Json -s C:\\Packages\\Plugins\\Microsoft.Azure.Security.WindowsAttestation.GuestAttestation\\1.0.1.30\\status\\0.status -e events -v 1.0.1.30 -c /subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.AzureStackHCI/clusters/<cluster name> -d xxxxxxxx--a9d3-41ba-88c3-796a643e3edd, Enable: Client : AszAttestationClient Started Successfully" 
    
        }, 
    
        "type": "GuestAttestation", 
        "typeHandlerVersion": "1.0.1.30" 
    
        }, 
    
        "provisioningState": "Succeeded", 
        "publisher": "Microsoft.Azure.Security.WindowsAttestation", 
        "settings": { 
    
        "AttestationConfig": { 
    
            "AscSettings": { 
    
            "ascReportingEndpoint": "https://dp.stackhci.azure.com/eastus/igvmAttestation/validxxxxx", 
    
            "ascReportingFrequency": "4H" 
    
            }, 
    
            "AzureStackSettings": { 
    
            "clusterAadTenantId": "xxxxxxxx--a9d3-41ba-88c3-796a643e3edd", 
    
            "clusterId": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.AzureStackHCI/clusters/<cluster name>" 
    
            }, 
    
            "MaaSettings": { 
    
            "maaEndpoint": "https://clustxxxxxxxxxxxxx.eus2e.attest.azure.net", 
    
            "maaTenantName": "My_Tenant_NewConfig" 
    
            }, 
    
            "disableAlerts": "false", 
            "isAzureStack": "true", 
            "useCustomToken": "true" 
    
        } 
    
        }, 
    
        "type": "GuestAttestation", 
        "typeHandlerVersion": "1.0.1.30" 
    
    }, 
    
    "resourceGroup": "<resource group name>", 
    "type": "Microsoft.HybridCompute/machines/extensions" 
    
    } 
    

게스트 증명 상태 보기

Azure CLI를 사용하여 게스트 증명 상태를 볼 수 있습니다. 게스트 증명 상태는 출력의 다음 속성에 의해 나열됩니다.

  • "attestSecureBootEnabled": "Enabled",
  • "attestationCertValidated": "Valid",
  • "bootIntegrityValidated": "Valid",
  • "errorMessage": null,
  • "healthStatus": "Healthy",
  • "linuxKernelVersion": "0",
  • "provisioningState": "Succeeded",

Az CLI 명령 및 샘플 출력은 다음과 같습니다.

# To connect to your Azure Local via Az CLI, see https://learn.microsoft.com/en-us/azure/azure-local/azure-arc-vm-management-prerequisites.md?#azure-command-line-interface-cli-requirements.

# Login to Azure
PS C:\WINDOWS\system32>az login --use-device-code

# Set your subscription
[host 1]: PS C:\Users\HCIDeploymentUser> az account set --subscription "<subscription>"

# Get list of installed extensions 
PS C:\WINDOWS\system32>az version 
{ 

  "azure-cli": "2.61.0", 
  "azure-cli-core": "2.61.0", 
  "azure-cli-telemetry": "1.1.0", 
  "extensions": { 

    "azure-iot": "0.11.0", 
    "stack-hci-vm": "1.1.11" 
  } 

} 


# If “stack-hci-vm” extension version isn't “1.1.12” or above, install the latest version of the extension. 

PS C:\WINDOWS\system32>az extension remove --name stack-hci-vm 
PS C:\WINDOWS\system32>az extension add --name stack-hci-vm 
PS C:\WINDOWS\system32>az version 

{ 

  "azure-cli": "2.61.0", 
  "azure-cli-core": "2.61.0", 
  "azure-cli-telemetry": "1.1.0", 
  "extensions": { 

    "azure-iot": "0.11.0", 
    "stack-hci-vm": "1.1.14" 

  } 

} 

 
# Check guest attestation status. 

PS C:\WINDOWS\system32> az stack-hci-vm show --subscription "<subscription id>" --resource-group "<resource group name>" --name "<name of VM>" 

Command group 'stack-hci-vm' is experimental and under development. Reference and support levels: https://aka.ms/CLI_refstatus 
{ 

  "attestationStatus": { 

    "id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.HybridCompute/machines/<vm name>/providers/Microsoft.AzureStackHCI/virtualMachineInstances/default/AttestationStatus/default", 

    "name": "default", 
    "properties": { 

      "attestSecureBootEnabled": "Enabled", 
      "attestationCertValidated": "Valid", 
      "bootIntegrityValidated": "Valid", 
      "errorMessage": null, 
      "healthStatus": "Healthy", 
      "linuxKernelVersion": "0", 
      "provisioningState": "Succeeded", 
      "timestamp": "6/12/2024 8:49:33 PM" 
    }, 

    "resourceGroup": "<resource group name>", 
    "systemData": { 

      "createdAt": "2024-06-12T20:49:33.545606+00:00", 
      "createdBy": "1412d89f-b8a8-4111-b4fd-e82905cbd85d", 
      "createdByType": "Application", 
      "lastModifiedAt": "2024-06-12T20:49:33.545606+00:00", 
      "lastModifiedBy": "1412d89f-b8a8-4111-b4fd-e82905cbd85d", 
      "lastModifiedByType": "Application" 
    }, 

    "type": "microsoft.azurestackhci/virtualmachineinstances/attestationstatus" 
  }, 

  "virtualmachineinstance": { 

    "extendedLocation": { 

      "name": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.ExtendedLocation/customLocations/cluster-customlocation", 

      "type": "CustomLocation" 

    }, 

    "id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.HybridCompute/machines/myTVM/providers/Microsoft.AzureStackHCI/virtualMachineInstances/default", 

    "identity": null, 
    "name": "default", 
    "properties": { 

      "guestAgentInstallStatus": null, 
      "hardwareProfile": { 

        "dynamicMemoryConfig": { 

          "maximumMemoryMb": null, 
          "minimumMemoryMb": null, 
          "targetMemoryBuffer": null 

        }, 

        "memoryMb": 2048, 
        "processors": 4, 
        "vmSize": "Custom" 

      }, 

      "httpProxyConfig": null, 
      "instanceView": { 

        "vmAgent": { 

          "statuses": [ 

            { 

              "code": "ProvisioningState/succeeded", 
              "displayStatus": "Connected", 
              "level": "Info", 
              "message": "Successfully established connection with mocguestagent", 
              "time": "2024-06-12T20:10:37+00:00" 

            }, 

            { 

              "code": "ProvisioningState/succeeded", 
              "displayStatus": "Connected", 
              "level": "Info", 
              "message": "New mocguestagent version detected 'v0.14.0-2-g5c6a4b32'", 
              "time": "2024-06-12T20:10:36+00:00" 

            } 

          ], 

          "vmConfigAgentVersion": "v0.14.0-2-g5c6a4b32" 

        } 

      }, 

      "isHydration": null, 
      "networkProfile": { 
        "networkInterfaces": [ 

          { 

            "id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.AzureStackHCI/networkinterfaces/my-nic-static", 

            "resourceGroup": "<resource group name>" 

          } 

        ] 

      }, 

      "osProfile": { 

        "adminPassword": null, 
        "adminUsername": "<admin username>", 
        "computerName": "<computer name>", 
        "linuxConfiguration": { 

          "disablePasswordAuthentication": null, 
          "provisionVmAgent": true, 
          "provisionVmConfigAgent": true, 
          "ssh": { 

            "publicKeys": null 
          } 

        }, 

        "windowsConfiguration": { 

          "enableAutomaticUpdates": null, 
          "provisionVmAgent": true, 
          "provisionVmConfigAgent": true, 
          "ssh": { 

            "publicKeys": null 

          }, 

          "timeZone": null 

        } 

      }, 

      "provisioningState": "Succeeded", 
      "resourceUid": null, 
      "securityProfile": { 

        "enableTpm": true, 
        "securityType": "TrustedLaunch", 
        "uefiSettings": { 

          "secureBootEnabled": true 

        } 

      }, 

      "status": { 

        "errorCode": "", 
        "errorMessage": "", 
        "powerState": "Running", 
        "provisioningStatus": null 

      }, 

      "storageProfile": { 

        "dataDisks": [], 
        "imageReference": { 

          "id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/microsoft.azurestackhci/marketplacegalleryimages/Win11EntMulti23H2", 

          "resourceGroup": "<resource group name>" 

        }, 

        "osDisk": { 

          "id": null, 
          "osType": "Windows" 
        }, 

        "vmConfigStoragePathId": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.AzureStackHCI/storagecontainers/UserStorage2-7d0fdc06e3ef4c9d808ceb31379d0916"      }, 

      "vmId": "85b8849e-2965-4c82-b7fa-637796d22199" 

    }, 

    "resourceGroup": "<resource group name>", 

    "systemData": { 

      "createdAt": "2024-06-12T20:03:18.171067+00:00", 
      "createdBy": "69be5a28-cb3c-4916-98c3-7e4ab37a83e0", 
      "createdByType": "Application", 
      "lastModifiedAt": "2024-06-12T20:11:55.649002+00:00", 
      "lastModifiedBy": "319f651f-7ddb-4fc6-9857-7aef9250bd05", 
      "lastModifiedByType": "Application" 
    }, 

    "type": "microsoft.azurestackhci/virtualmachineinstances" 

  } 

} 

안내

  • 게스트 증명 지원은 Microsoft Azure 증명 서비스를 기반으로 사용합니다. 게스트 증명이 지원되면 Azure 로컬 인스턴스는 Microsoft Azure Attestation 서비스 엔드포인트 및 증명 정책을 사용하여 자동으로 설정됩니다. 게스트 증명이 제대로 작동하려면 Microsoft Azure 증명 서비스에 대한 아웃바운드 네트워크 액세스가 필요합니다. Azure 로컬 인스턴스에 대한 관련 정책 또는 네트워크 방화벽 규칙이 Microsoft Azure Attestation 서비스에 대한 아웃바운드 네트워크 액세스를 허용하는지 확인합니다.

    예를 들어 Azure Policy를 사용하여 Azure 로컬 인스턴스의 보안 상태를 관리하는 경우 리소스 유형을 Microsoft.Attestation/attestationProviders허용하지 않아야 합니다. 자세한 내용은 클라우드 환경에서 리소스 종류 허용을 참조하세요. 특히 정책을 Microsoft.Attestation/attestationProviders/publicNetworkAccess 사용하도록 설정해야 합니다.

  • Microsoft Azure Attestation 서비스 엔드포인트 및 Azure 로컬 인스턴스에 대한 관련 증명 정책을 수동으로 설정해야 하는 경우가 있을 수 있습니다. 예를 들어 Azure 로컬 인스턴스의 리소스 그룹에서 증명 공급자(및 관련 증명 정책)를 실수로 삭제할 수 있습니다. 또 다른 예로, Azure 로컬 인스턴스에 프로비전된 다른 증명 루트 인증서를 사용하도록 증명 정책을 업데이트하려고 합니다.

    이러한 경우 다음을 실행하여 Microsoft Azure Attestation 서비스 엔드포인트 및 Azure 로컬 인스턴스에 대한 증명 정책을 수동으로 설정할 수 있습니다. 아래 명령은 Azure 로컬 인스턴스의 컴퓨터(노드) 중 하나에서 실행해야 합니다.

$ececlient = create-ececlusterserviceclient

# Create MAA Endpoint
$guid= Invoke-ActionPlanInstance -RolePath Cloud\Infrastructure\ArcIntegration -ActionType "CreateMAAEndpointCloud" -EceClient $ececlient

# Validate MAA Endpoint creation succeeded
Get-ActionPlanInstance -ActionPlanInstanceId $guid -ececlient:$ececlient

# Create MAA Policy
$guid= Invoke-ActionPlanInstance -RolePath Cloud\Infrastructure\ArcIntegration -ActionType "CreateMAAPolicyCloud" -EceClient $ececlient

# Validate MAA Policy creation succeeded
Get-ActionPlanInstance -ActionPlanInstanceId $guid -ececlient:$ececlient

# Sample expected output
# InstanceID: <guid>
# ActionPlanName:
# ActionTypeName: CreateMAAEndpointCloud
# RolePath: Cloud\Infrastructure\ArcIntegration
# ProgressAsXml: <xml-object>
# Status: Completed
# ...

다음 단계