다음을 통해 공유


Azure Key Vault를 사용하여 MSIX 및 CI/CD 파이프라인 서명

서명은 MSIX 패키지로 작업할 때 수행해야 하는 중요한 작업 중 하나입니다. MSIX 패키지가 신뢰할 수 있는 인증서로 서명되지 않은 경우 사용자는 애플리케이션을 설치할 수 없습니다. 동시에 서명은 보안과 관련하여 가장 중요한 작업 중 하나입니다. 악의적인 행위자가 ID를 사용하여 애플리케이션에 서명하는 데 다시 사용할 수 없도록 하려면 인증서를 안전하게 저장해야 합니다. Azure Key Vault 는 이 요구 사항을 지원하는 가장 좋은 옵션입니다.

이 문서에서는 프로세스의 일부로 MSIX 패키지에 자동으로 서명할 수 있도록 CI/CD 파이프라인에서 Azure Key Vault를 활용하는 방법을 살펴보겠습니다.

중요합니다

이 문서에서 설명하는 프로세스는 Azure Pipelines 및 GitHub Actions 모두에서 작동하는 Azure SignTool이라는 오픈 소스 도구를 기반으로 합니다. Azure Pipelines를 사용하는 경우 Azure Key Vault 작업과 함께 MSIX 확장을 활용할 수 있습니다.

필수 조건

Azure에 애플리케이션 등록

CI/CD 파이프라인의 일부로 패키지에 서명하려면 Azure SignTool이라는 도구를 사용합니다. Windows 10 SDK에 포함된 표준 SignTool 유틸리티처럼 작동하지만 로컬 인증서를 사용하는 대신 Azure Key Vault에 연결하여 사용 가능한 인증서 중 하나를 사용합니다. 그러나 연결을 설정하려면 먼저 Azure에 애플리케이션을 등록해야 하며, Azure SignTool이 Azure Key Vault 서비스에 대해 인증할 수 있도록 하는 데 필요한 자격 증명을 제공합니다.

Azure Portal을 열고 사용 가능한 서비스 중 에서 Azure Active Directory 를 선택합니다. 앱 등록을 클릭하고 새 등록을 선택하여 프로세스를 시작합니다. 애플리케이션에 이름을 지정한 다음(예: 아래 이미지의 SignToolForContoso ) 기본 설정을 그대로 둡니다.

Azure에 애플리케이션 등록

다음 단계는 리디렉션 URI가 필요하지 않은 시나리오에 있으므로 애플리케이션을 공용 클라이언트로 처리하는 것입니다. 인증 섹션으로 이동하고 고급 설정에서 애플리케이션을 공용 클라이언트로 처리 스위치를로 변경합니다.

고급 설정 설정

마지막 단계는 Azure SignTool에서 인증하는 데 필요한 암호인 클라이언트 암호를 만드는 것입니다. 인증서 및 비밀 섹션으로 이동한 다음 새 클라이언트 암호를 클릭합니다. 이름을 지정하고 만료를 선택한 다음 추가 단추를 누릅니다. 기본 페이지로 다시 리디렉션됩니다. 여기서 비밀은 해당 값과 함께 나열됩니다. 복사하고 안전한 곳에 저장해야 합니다. 다시 검색할 수 없습니다. 페이지를 새로 고치자마자 비밀이 마스킹되고 공개할 방법이 없습니다. 유일한 옵션은 새 비밀을 생성하는 것입니다.

클라이언트 암호와 함께 저장해야 하는 마지막 정보인 애플리케이션 식별자가 있습니다. 개요를 클릭하여 애플리케이션의 홈으로 돌아가서 위쪽 섹션에서 애플리케이션(클라이언트) ID 값을 찾습니다.

애플리케이션 ID

Azure Key Vault에 대한 액세스 사용

다음 단계는 방금 만든 Azure 애플리케이션을 구성하여 Azure Key Vault 서비스에 액세스하는 것입니다. Azure Portal에서 MSIX 패키지에 서명하는 데 사용할 인증서를 보유하는 Azure Key Vault 인스턴스로 이동합니다. 액세스 정책 섹션으로 이동하여 액세스 정책 추가를 클릭합니다. 이 도구는 사용 가능한 템플릿 중 하나를 선택하여 부여하려는 권한을 정의하도록 지원하지만, 시나리오에서 적합한 템플릿은 없습니다. 따라서 드롭다운을 사용하여 다음 옵션을 사용하여 수동으로 설정해야 합니다.

  • 키 사용 권한에서 서명 옵션을 사용하도록 설정합니다.
  • 인증서 사용 권한에서 가져오기 옵션을 사용하도록 설정합니다.

마지막 중요한 단계는 이 정책에 액세스할 애플리케이션을 지정하는 것입니다. 주체 선택을 클릭하고 이전 단계에서 해당 이름을 사용하여 만든 Azure 애플리케이션을 검색합니다. 이 예제에서는 SignToolForContoso라고 합니다.

주요 항목 선택

검색한 후 Select 키를 누릅니다. 이것이 정책의 모양입니다.

액세스 정책 추가

프로세스를 완료하면 추가 를 클릭하여 정책을 만듭니다.

Azure SignTool을 사용하여 로컬로 패키지 서명

이제 Azure 구성이 완료되었으므로 Azure SignTool을 사용하여 패키지에 서명할 수 있습니다. 이 섹션에서는 도구를 로컬로 사용하여 이 도구를 숙지합니다. 다음 섹션에서는 CI/CD 파이프라인의 일부로 사용합니다.

이 도구는 .NET 전역 도구로 사용할 수 있습니다. 최신 .NET SDK가 설치되어 있는지 확인한 다음 명령 프롬프트를 열고 다음 명령을 시작합니다.

dotnet tool install --global AzureSignTool 

이제 다음 매개 변수가 필요한 AzureSignTool 명령을 사용하여 패키지에 서명할 수 있습니다.

  • kvu 는 Azure Key Vault의 URL입니다. Azure Portal의 서비스 기본 페이지( DNS 이름)에서 찾을 수 있습니다.
  • kvi 은 등록한 Azure 앱의 애플리케이션 ID이며 이전에 적어 두었다는 것입니다.
  • kvs 는 이전에 생성한 클라이언트 암호이며 이전에 적어 두었다는 것입니다.
  • kvc 은 사용하려는 인증서의 이름입니다.
  • tr 는 타임스탬프 서버의 URL입니다. 이 옵션을 사용하면 인증서가 만료되는 경우에도 패키지가 작동하도록 설정할 수 있습니다.
  • v 는 서명하려는 MSIX 패키지의 경로입니다.

다음은 샘플 명령입니다.

AzureSignTool sign -kvt "<tenantID>" -kvu "https://contosoexpenses-blog.vault.azure.net/" -kvi "aaaabbbb-0000-cccc-1111-dddd2222eeee" -kvs "this-is-the-secret" -kvc "MyCertificate" -tr http://timestamp.digicert.com -v .\MyContosoApp.msix

비고

AzureSignTool에 대해 자세히 알아보려면 다음을 실행합니다. AzureSignTool sign --help

Azure Pipelines에서 Azure SignTool 사용

이 섹션에서는 여기에 설명된 대로 Azure Pipelines의 YAML 파일로 구성된 Windows 애플리케이션에 대한 CI/CD 파이프라인이 이미 있다고 가정합니다.

처음에는 Azure SignTool에서 Azure Key Vault에 연결하는 데 필요한 정보를 저장하는 몇 가지 변수를 만들어야 합니다. Azure DevOps에서 파이프라인을 선택하고 맨 위에 있는 편집 단추를 누릅니다. YAML 편집기에서 맨 위에 있는 변수 단추를 클릭하여 패널을 엽니다. + 단추를 클릭하여 다음 변수를 추가합니다.

  • AzureKeyVaultName은(는) 자격 증명 모음의 친숙한 이름입니다.
  • AzureKeyVaultUrl을(를) 사용자의 자격 증명 모음 URL로 교체합니다.
  • Azure 애플리케이션의 애플리케이션 ID를 포함하는 AzureKeyVaultClientId입니다.
  • Azure 애플리케이션의 클라이언트 암호를 사용하는 AzureKeyVaultClientSecret

각 변수를 만들 때 이 값 비밀 유지 옵션을 사용하도록 설정해야 합니다. 파이프라인에 액세스할 수 있는 다른 사용자가 해당 값을 볼 수 없도록 합니다.

변수 추가

이제 .NET Core 작업을 추가하여 에이전트에 Azure SignTool을 설치하여 기존 YAML 파이프라인을 사용자 지정할 수 있습니다. 추가할 YAML은 다음과 같습니다.

- task: DotNetCoreCLI@2
  displayName: 'Install Azure SignTool'
  inputs:
    command: custom
    custom: tool
    arguments: 'install --global AzureSignTool'

다음 단계는 PowerShell 작업을 추가하여 패키지에 서명할 명령을 실행하는 것입니다. MSIX 패키지가 만들어지면 빌드 프로세스가 끝날 때만 이 작업을 수행해야 합니다.

- powershell: '& AzureSignTool sign -kvu $(AzureKeyVaultUrl) -kvi $(AzureKeyVaultClientId) -kvs $(AzureKeyVaultClientSecret) -kvc $(AzureKeyVaultName) -tr http://timestamp.digicert.com -v "$(System.DefaultWorkingDirectory)\MyPipeline\MyContosoApp\MyContosoApp.msix"'
  displayName: 'Sign the package'

이 명령은 패키지를 로컬로 서명하는 데 사용한 명령과 유사합니다. 유일한 차이점은 다음과 같습니다.

  • 다양한 매개 변수에 고정 값을 사용하는 대신 $(Variable-Name) 구문을 사용하여 만든 변수를 사용합니다.
  • MSIX 패키지의 경로는 빌드가 끝날 때 MSIX 패키지가 만들어지는 에이전트의 폴더를 가리킵니다.

GitHub Actions에서 Azure SignTool 사용

이 섹션에서는 여기에 설명된 대로 GitHub Actions의 YAML 파일로 구성된 Windows 애플리케이션에 대한 CI/CD 파이프라인이 이미 있다고 가정합니다.

첫 번째 단계로 Azure Pipeline에서 수행한 것처럼 자격 증명을 안전하게 저장해야 합니다. GitHub는 비밀을 사용하며 리포지토리의 설정에 추가할 수 있습니다. Windows 애플리케이션을 호스트하는 GitHub 리포지토리에 있는 경우 설정을 클릭한 다음 비밀로 이동합니다.

Azure Pipelines를 사용하여 한 작업과 마찬가지로 새 비밀을 클릭하여 네 가지 비밀을 만듭니다.

  • AzureKeyVaultName은(는) 자격 증명 모음의 친숙한 이름입니다.
  • AzureKeyVaultUrl을(를) 사용자의 자격 증명 모음 URL로 교체합니다.
  • Azure 애플리케이션의 애플리케이션 ID를 포함하는 AzureKeyVaultClientId입니다.
  • Azure 애플리케이션의 클라이언트 암호를 사용하는 AzureKeyVaultClientSecret

Azure Pipeline과의 차이점은 비밀이 암시적으로 숨겨져 있으므로 비밀을 보호하는 옵션을 사용하도록 설정할 필요가 없다는 것입니다.

이제 리포지토리의 작업 탭을 통해 기존 워크플로를 열고 서명을 수행하는 데 필요한 작업을 추가할 수 있습니다. 첫 번째는 에이전트에 AzureSign 도구를 설치합니다.

- name: Install AzureSignTool
  run: dotnet tool install --global AzureSignTool

두 번째 패키지는 패키지에 서명하므로 Visual Studio 빌드가 완료되고 MSIX 패키지가 생성된 후에 실행되어야 합니다.

 - name: Sign package
   run: |
        Get-ChildItem -recurse -Include **.msix | ForEach-Object {
        $msixPath = $_.FullName
        & AzureSignTool sign -kvu "${{ secrets.AzureKeyVaultUrl }}" -kvi "${{ secrets.AzureKeyVaultClientId }}" -kvs "${{ secrets.AzureKeyVaultClientSecret }}" -kvc ${{ secrets.AzureKeyVaultName }} -tr http://timestamp.digicert.com -v $msixPath
        }

이 작업에는 Azure Pipelines에서 사용한 작업에 비해 몇 가지 차이점이 있습니다. 첫 번째로, GitHub에서는 비밀에 접근하기 위해 ${ { secrets.SECRET_NAME } }이라는 다른 구문을 사용합니다. 따라서 다양한 매개 변수는 비밀 섹션에서 이전에 만든 값으로 채워집니다. 다른 하나는 서명할 MSIX 패키지를 찾기 위해 다른 방법을 사용해야 한다는 것입니다. 태스크는 특정 MSIX 패키지를 가리키는 대신 빌드 출력에 저장된 모든 파일을 반복하는 PowerShell 스크립트를 사용합니다. 파일에 MSIX 확장이 있는 경우 AzureSignTool 명령을 사용하여 서명합니다.

패키지 배포

선택한 CI/CD 플랫폼에 관계없이 흐름의 끝에 Azure Key Vault에 저장된 인증서로 서명된 MSIX 패키지가 있습니다. 이제 사용 가능한 다른 작업을 사용하여 Microsoft Store, 웹 사이트, Microsoft Intune 등 원하는 배포 옵션을 사용하여 패키지를 배포할 수 있습니다.