Azure DevOps Services
DCT(Docker Content Trust)를 사용하면 원격 Docker 레지스트리에서 보내고 받는 데이터에 디지털 서명을 사용할 수 있습니다. 이러한 서명을 통해 클라이언트 쪽 또는 런타임에 특정 이미지 태그의 무결성 및 게시자를 확인할 수 있습니다.
비고
이미지에 서명하려면 연결된 공증 서버가 있는 Docker 레지스트리가 필요합니다(예: Docker Hub 또는 Azure Container Registry 포함).
Azure Pipelines에서 이미지 서명
개발 머신의 필수 구성 요소
- Docker 트러스트의 기본 제공 생성기를 사용하거나 위임 키 쌍을 수동으로 생성합니다. 기본 제공 생성기를 사용하는 경우 위임 프라이빗 키를 로컬 Docker 트러스트 저장소로 가져옵니다. 그렇지 않으면 프라이빗 키를 로컬 Docker 트러스트 저장소로 수동으로 가져와야 합니다. 자세한 내용은 수동으로 키 생성을 참조하세요 .
- 이전 단계에서 생성된 위임 키를 사용하여 위임에 첫 번째 키를 업로드하고 리포지토리를 시작합니다.
팁 (조언)
로컬 위임 키 목록을 보려면 공증 CLI를 사용하여 다음 명령을 $ notary key list실행합니다.
이미지 서명 파이프라인 설정
개발 머신의 로컬 Docker 트러스트 저장소에서 위임 프라이빗 키를 가져와 파이프라인에 보안 파일 로 추가합니다.
모든 파이프라인에서 사용할 수 있는 이 보안 파일에 권한을 부여합니다.
연결된
containerRegistryServiceConnection서비스 주체는 대상 컨테이너 레지스트리에 AcrImageSigner 역할이 있어야 합니다.다음 YAML 코드 조각을 기반으로 파이프라인을 만듭니다.
pool: vmImage: 'ubuntu-latest' variables: system.debug: true containerRegistryServiceConnection: serviceConnectionName imageRepository: foobar/content-trust tag: test steps: - task: Docker@2 inputs: command: login containerRegistry: $(containerRegistryServiceConnection) - task: DownloadSecureFile@1 name: privateKey inputs: secureFile: cc8f3c6f998bee63fefaaabc5a2202eab06867b83f491813326481f56a95466f.key - script: | mkdir -p $(DOCKER_CONFIG)/trust/private cp $(privateKey.secureFilePath) $(DOCKER_CONFIG)/trust/private - task: Docker@2 inputs: command: build Dockerfile: '**/Dockerfile' containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) - task: Docker@2 inputs: command: push containerRegistry: $(containerRegistryServiceConnection) repository: $(imageRepository) tags: | $(tag) env: DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE: $(DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE) DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE: $(rootPassphrase)이전 예제
DOCKER_CONFIG에서 변수는 Docker 태스크의login명령에 의해 설정됩니다.DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE및DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE을(를) 파이프라인의 비밀 변수로 설정합니다.DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE이 예제에서는 프라이빗 키의 암호(리포지토리 암호 아님)를 참조합니다. 리포지토리가 이미 시작되었기 때문에 이 예제에서는 프라이빗 키의 암호만 필요합니다(필수 구성 요소).