다음을 통해 공유


Azure Pipeline에서 표기법을 사용하여 컨테이너 이미지 서명 및 확인

Azure DevOps의 표기법 작업은 Azure Pipeline 내에서 컨테이너 이미지 및 기타 OCI(Open Container Initiative) 아티팩트를 서명하고 확인하는 기본 제공 작업입니다. 표기법 작업은 표기법 CLI를 사용하여 이러한 작업을 실행하여 아티팩트가 신뢰할 수 있는 엔터티에 의해 서명되고 아티팩트가 생성된 이후 변조되지 않았는지 확인합니다.

이 문서에서는 컨테이너 이미지를 빌드하고, ACR에 푸시하고, 아티팩트의 보안 및 무결성 계층을 제공하는 Notation 및 Azure Key Vault 플러그 인을 사용하여 서명을 추가하는 Azure 파이프라인을 만드는 방법을 안내합니다. 파이프라인의 목표는 다음과 같습니다.

  1. 컨테이너 이미지를 빌드하고 ACR(Azure Container Registry)에 푸시합니다.
  2. 표기법 및 표기법 Azure Key Vault 플러그 인을 사용하여 이미지에 서명합니다. 그런 다음 서명이 자동으로 ACR로 푸시됩니다.

필수 조건

  • Azure Key Vault에서 Key Vault를 만들고 자체 서명된 서명 키 및 인증서를 생성합니다. 이 문서는 테스트 목적으로 자체 서명된 키 및 인증서를 만드는 데 사용할 수 있습니다. CA에서 발급한 인증서가 있는 경우 자세한 내용은 이 문서를 참조하세요.
  • ACR(Azure Container Registry)에서 레지스트리를 만듭니다.
  • Azure DevOps 리포지토리 또는 GitHub 리포지토리가 있는지 확인합니다.

서비스 커넥트 만들기

Azure Pipelines에서 서비스 연결을 만들어 파이프라인이 ACR(Azure Container Registry)와 같은 외부 서비스에 액세스할 수 있도록 하려면 다음 단계를 수행할 수 있습니다.

  • ACR 자격 증명을 사용하여 ACR(Azure Container Registry)에서 이미지에 서명합니다.

  • Azure Pipelines의 Docker 작업을 사용하여 ACR에 로그인합니다. Docker 작업은 Azure Pipelines의 기본 제공 작업으로, 무엇보다도 Docker 이미지를 빌드, 푸시 및 끌어올 수 있습니다.

  • 다음과 같이 표기법 태스크에 ACR 레지스트리에 대한 액세스 권한을 부여하기 위해 Azure Pipeline에서 Docker 레지스트리 서비스 연결을 설정합니다.

    1. 조직(https://dev.azure.com/{yourorganization})에 로그인하고 프로젝트를 선택합니다.
    2. 왼쪽 아래 모서리에서 설정 단추를 선택합니다.
    3. 파이프라인으로 이동한 다음 서비스 연결을 선택합니다.
    4. 새 서비스 연결을 선택하고 Docker 레지스트리를 선택합니다.
    5. 다음으로 Azure Container Registry를 선택합니다.
    6. 인증 유형에서 서비스 주체선택하고 Azure 구독 및 ACR 레지스트리를 포함한 서비스 주체 세부 정보를 입력합니다.
    7. 이 서비스 연결을 참조할 때 사용할 사용자에게 친숙한 커넥트이온 이름을 입력합니다.
  • Azure Pipelines에서 Azure Resource Manager 서비스 연결을 만들어 Azure Key Vault에 대한 액세스 권한을 부여합니다.

    1. 서비스 주체(자동)를 선택합니다.
    2. 다음으로 구독을 선택하고 드롭다운 목록에서 Azure 구독을 찾습니다.
    3. 드롭다운 목록에서 사용 가능한 리소스 그룹을 선택합니다.
    4. 이 서비스 연결을 참조할 때 사용할 사용자 친화적인 서비스 연결 이름을 입력합니다.
    5. 저장하여 만들기를 완료합니다.
  • 다음 단계를 수행하여 서비스 주체에 액세스 정책을 부여합니다.

    1. 만든 Azure Resource Manager 서비스 연결을 열고 서비스 주체 관리를 클릭하여 Azure 서비스 주체 포털을 입력합니다.
    2. Application (client) ID를 복사합니다. 서비스 주체에 대한 권한을 부여하는 데 사용됩니다.
    3. Azure Key Vault 포털을 열고 액세스 정책 페이지를 입력합니다.
    4. certificate get 권한을 사용하여 새 액세스 정책을 key signsecret get 만듭니다.
    5. 이전 단계의 붙여넣기를 사용하여 서비스 주체에 Application (client) ID 이 새 액세스 정책을 부여합니다.
    6. 저장하여 만들기를 완료합니다.

여기서 서비스 연결 에 대해 자세히 알아보세요.

파이프라인 만들기 및 표기법 작업 사용

다음 단계를 수행하여 Git 리포지토리에 대한 Azure 파이프라인을 만듭니다.

  1. AOD 조직의 프로젝트로 이동합니다.
  2. 왼쪽 메뉴에서 파이프라인으로 이동한 다음 새 파이프라인을 선택합니다.
  3. Git 리포지토리를 선택합니다. 데모 편의를 위해 Azure DevOps 리포지토리를 사용합니다.
  4. Azure DevOps를 새로 사용하는 경우 스타터 파이프라인을 사용하여 파이프라인 을 구성합니다. 저장 및 실행을 클릭하여 파이프라인을 검토하고 만듭니다.

참고 항목

이 예제에서는 기본 분기 가정합니다main. 그렇지 않은 경우 가이드따라 기본 분기 업데이트하세요.

Azure 파이프라인을 편집하여 표기법을 추가하는 방법에는 두 가지가 있습니다.

ADO(Azure DevOps) 패널 사용: ADO 패널은 파이프라인에 작업을 추가할 수 있는 사용자 인터페이스를 제공합니다. 이 인터페이스를 사용하여 표기법 작업을 검색하고 파이프라인에 추가할 수 있습니다.

샘플 Azure Pipeline 파일에서 복사: 표기법을 이미 포함하는 샘플 Azure Pipeline 파일이 있는 경우 샘플 파일에서 이러한 작업을 복사하여 파이프라인 파일에 붙여넣을 수 있습니다.

옵션 1: ADO(Azure DevOps) 편집 패널 사용

오른쪽의 Docker 파이프라인 편집 패널에서 작업을 검색합니다. Docker 레지스트리 서비스 연결과 함께 해당 login 명령을 사용하여 ACR로 인증합니다.

  1. 컨테이너 레지스트리 드롭다운 목록에서 이전 단계에서 만든 Docker 레지스트리 서비스 연결을 선택합니다.
  2. 명령 드롭다운 목록에서 선택합니다login.
  3. 추가를 클릭하여 파이프라인 파일에 명령을 사용하여 Docker 작업을 login 추가합니다.

마찬가지로 파이프라인 편집 패널에서 작업을 다시 검색 Docker 합니다. 해당 buildAndPush 명령을 사용하여 이미지에 소스 코드를 자동으로 빌드하고 대상 ACR 리포지토리에 푸시합니다. 다음 단계에서 서명하는 데 사용할 이미지 다이제스트를 생성합니다.

  1. 컨테이너 리포지토리에 리포지토리 이름을 입력합니다.
  2. 명령 드롭다운 목록에서 buildAndPush 를 선택합니다.
  3. Dockerfile의 파일 경로를 지정합니다. 예를 들어 Dockerfile이 루트 폴더에 저장된 경우 사용합니다 ./Dockerfile .
  4. 추가를 클릭하여 파이프라인 파일에 명령을 사용하여 Docker 작업을 buildAndPush 추가합니다.

오른쪽의 Notation 파이프라인 편집 패널에서 작업을 검색합니다.

  1. 실행할 드롭다운 목록 명령에서 설치를 선택합니다.
  2. 추가를 클릭하여 파이프라인에 notation install 작업을 추가합니다.
  3. 마찬가지로 파이프라인 편집 패널에서 작업을 다시 검색 Notation 하고 서명을 선택합니다.
  4. Docker 태스크 의해 빌드되고 레지스트리에 푸시된 최신 다이제스트를 사용하여 이미지에 서명하기 때문에 아티팩트 참조를 건너뛸 수 있습니다. 대신 을 사용하여 <registry_host>/<repository>@<digest>다이제스트를 수동으로 지정할 수 있습니다.
  5. 양식에서 플러그 인 구성을 작성합니다. 이전 단계에서 만든 기본 AKV 플러그 인 및 서비스 연결을 사용합니다. AKV에서 키 ID를 키 ID복사합니다.
  6. 데모 편의를 위해 자체 서명된 인증서 를 사용하려면 자체 서명된 인증서 상자를 선택합니다. 대신 CA에서 발급한 인증서를 사용하려는 경우 인증서 번들 파일 경로에 인증서 파일 경로를 입력할 수 있습니다.
  7. 추가를 클릭하여 파이프라인 파일에 왼쪽을 추가 notation sign 합니다.

옵션 2: 샘플 Azure Pipeline 파일 편집

  1. Azure Pipelines 및 Notation에 익숙한 경우 템플릿 파이프라인 파일로 시작하는 것이 효율적입니다.
  2. 문서에 제공된 파이프라인 템플릿을 사용자 고유의 파이프라인 파일에 복사합니다. 이 템플릿은 컨테이너 이미지에 서명하고 확인하는 데 사용되는 표기법 작업을 사용하도록 설계되었습니다.
  3. 템플릿을 복사한 후 아래에 제공된 참조 및 주석에 따라 필요한 값을 입력합니다.
옵션 1의 서명 작업 템플릿을 참조하세요(여기를 클릭).
trigger:
 - main
pool: 
  vmImage: 'ubuntu-latest'

steps:
# log in to registry
- task: Docker@2
  inputs:
    containerRegistry: <your_docker_registry_service_connection>
    command: 'login'
# build and push artifact to registry
- task: Docker@2
  inputs:
    repository: <your_repository_name>
    command: 'buildAndPush'
    Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
  inputs:
    command: 'install'
    version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
  inputs:
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <your_akv_service_connection>
    keyid: <your_key_id>
    selfSigned: true

참고 항목

Docker 작업을 사용하는 것 외에도 다음과 같이 아티팩트 참조를 수동으로 지정하여 지정된 이미지 다이제스트에 artifactRefs 서명할 수 있습니다.

예제를 참조하세요(여기를 클릭).
# sign the artifact
- task: Notation@0
  inputs:
    artifactRefs: '<registry_host>/<repository>@<digest>'
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <akv_service_connection>
    keyid: <key_id>
    selfSigned: true

파이프라인 트리거

단계에 따라 Azure DevOps에서 파이프라인을 실행하고 실행을 확인합니다.

  1. 파이프라인에서 입력을 채운 후 저장하고 실행하여 파이프라인을 트리거합니다.
  2. 실행 중인 파이프라인의 작업 페이지로 이동합니다. 여기에서 각 단계의 실행을 볼 수 있습니다. 이 파이프라인은 최신 빌드 또는 지정된 다이제스트를 빌드하고 서명한 다음, 연결된 서명과 함께 서명된 이미지를 레지스트리에 푸시합니다.
  3. 성공적으로 실행되면 COSE(CBOR 개체 서명 및 암호화) 형식 서명이 연결된 ACR(Azure Container Registry)에 푸시된 이미지를 볼 수 있습니다.

서명된 이미지 확인

마찬가지로 서명된 이미지를 확인하려면 편집 패널을 사용하거나 파이프라인 파일을 편집하여 파이프라인에 표기법 verify 작업을 추가할 수 있습니다. 파이프라인은 사용자가 제공한 신뢰 정책 및 신뢰 저장소를 사용하여 서명된 이미지를 확인합니다.

표기법 신뢰 정책 및 신뢰 저장소 준비

일반적으로 검증 도구는 서명자와 다릅니다. 데모를 위해 이 샘플에서 동일한 파이프라인 및 ADO 리포지토리를 사용합니다. 아래 단계에 따라 표기법 신뢰 정책을 만들고, 저장소verify 신뢰하고, 파이프라인에 작업을 추가합니다.

  1. 현재 ADO 리포지토리에서 표기법 신뢰 정책을 .pipeline/trustpolicy/저장할 샘플 폴더 .pipeline 를 만듭니다. 샘플 신뢰 정책 JSON 파일을 trustpolicy.json만듭니다. 사용자 고유의 값으로 신뢰 정책 템플릿을 입력하고 폴더에 저장합니다.

참고 항목

표기법 신뢰 저장소는 현재 CA(인증 기관), SigningAuthority 및 TSA(타임스탬핑 기관) 루트 인증서를 비롯한 세 가지 종류의 ID를 지원합니다. 데모를 위해 아래의 신뢰 정책 및 신뢰 저장소에서 CA(인증 기관) x509/ca 를 사용합니다. 자세한 내용은 신뢰 저장소를 참조하세요.

신뢰 정책 템플릿을 참조하세요(여기를 클릭).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. 현재 ADO 리포지토리에서 인증서를 저장할 Notation 트러스트 저장소 /.pipeline/truststore/x509/ca/$<yourTrustStore>/ 에 대한 새 폴더를 만듭니다. 이 문서의 서명 단계에 따라 이미지에 서명한 경우 아래 명령을 사용하여 AKV(Azure Key Vault)에서 자체 서명된 인증서를 다운로드합니다.
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
  1. 마지막 단계에서 만든 신뢰 저장소 폴더 /.pipeline/truststore/x509/ca/$<yourTrustStore>/ 에 인증서를 업로드합니다.

표기법 확인 작업 추가

  1. 파이프라인 편집 패널에서 표기법 작업을 다시 검색하고 확인을 선택합니다.
  2. 서명된 이미지의 다이제스트 를 사용하여 아티팩트 참조를 채웁니다.
  3. 신뢰 정책 파일 경로에 값을 .pipeline/trustpolicy/trustpolicy.json 입력합니다.
  4. 트러스트 저장소 폴더 경로에 값을 .pipeline/truststore/ 입력합니다.
  5. 추가를 클릭하여 파이프라인 파일에 표기법 확인을 추가합니다.

notation verify 다음과 같이 저장됩니다.

예제를 참조하세요(여기를 클릭).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

파이프라인 트리거(업데이트됨)

파이프라인을 다시 트리거하여 서명된 이미지를 확인할 수 있습니다. 성공적으로 실행되면 실행 중인 파이프라인의 작업 페이지에서 로그를 볼 수 있습니다. 파이프라인은 사용자가 제공한 신뢰 정책 및 신뢰 저장소를 사용하여 서명된 이미지를 확인합니다.

결론

이 문서에서는 Azure Pipeline에서 Notation을 사용하여 컨테이너 이미지에 서명하고 확인하는 방법을 보여줍니다. Azure DevOps 패널을 사용하거나 파이프라인 파일을 편집하여 파이프라인에 표기법 작업을 추가할 수 있습니다. 파이프라인은 사용자가 제공한 신뢰 정책 및 신뢰 저장소를 사용하여 이미지를 빌드, 푸시, 서명 및 확인합니다. 이 프로세스는 아티팩트가 신뢰할 수 있는 엔터티에 의해 서명되고 아티팩트가 생성된 이후 변조되지 않도록 합니다.