Azure Container Registry는 서명된 이미지를 푸시 및 풀할 수 있도록 DCT(Docker Content Trust) 모델을 구현합니다. 이 문서에서는 컨테이너 레지스트리에서 DCT를 사용하도록 설정하는 작업을 시작합니다. DCT는 Container Registry의 프리미엄 서비스 계층 의 기능입니다.
중요합니다
DCT는 더 이상 사용되지 않으며 2028년 3월 31일에 완전히 제거됩니다. 자세한 내용 및 전환 지침은 Docker 콘텐츠 신뢰에서 공증 프로젝트로의 전환을 참조하세요.
제한 사항
리포지토리 범위 권한이 있는 토큰은 현재 서명된 이미지의 Docker 푸시 및 끌어오기를 지원하지 않습니다.
DCT 작동 방식
보안을 염두에 두고 설계된 분산 시스템에 중요한 것은 시스템에 들어오는 데이터의 원본 및 무결성 을 모두 확인하는 것입니다. 데이터 소비자는 데이터의 게시자(원본)를 확인하고 데이터가 게시된 후 수정되지 않았는지(무결성) 확인할 수 있어야 합니다.
이미지 게시자는 DCT를 사용하여 레지스트리에 푸시하는 이미지에 서명할 수 있습니다. 이미지의 소비자(레지스트리에서 이미지를 끌어오는 사람 또는 시스템)는 서명된 이미지만 끌어오도록 클라이언트를 구성할 수 있습니다. 이미지 소비자가 서명된 이미지를 풀하면 Docker 클라이언트는 이미지의 무결성을 확인합니다. 이 모델에서 소비자는 사용자가 레지스트리에 서명된 이미지를 게시했으며 게시 후 이미지가 수정되지 않았음을 보장합니다.
참고
Container Registry는 DCT로 서명된 이미지 가져오기를 지원하지 acr import
않습니다. 기본적으로 서명은 가져오기 후에 표시되지 않습니다. 공증 v2는 이러한 서명을 아티팩트로 저장합니다.
신뢰할 수 있는 이미지
DCT는 리포지토리의 태그와 함께 작동합니다. 이미지 리포지토리에는 서명된 태그와 서명되지 않은 태그가 모두 있는 이미지가 포함될 수 있습니다. 예를 들어 myimage:stable
및 myimage:latest
이미지만 서명하고, myimage:dev
이미지는 서명하지 않을 수 있습니다.
서명 키
암호화 서명 키 집합을 사용하여 DCT를 관리합니다. 이러한 키는 레지스트리의 특정 리포지토리와 연결됩니다.
Docker 클라이언트 및 레지스트리가 리포지토리의 태그에 대한 트러스트를 관리하는 데 사용하는 여러 가지 서명 키가 있습니다. DCT를 사용하도록 설정하고 컨테이너 게시 및 사용을 위해 파이프라인에 통합하는 경우 이러한 키를 신중하게 관리해야 합니다. 자세한 내용은 이 문서의 뒷부분에 있는 키 관리 및 Docker 설명서의 콘텐츠 신뢰에 대한 키 관리를 참조하세요.
레지스트리에 DCT 사용
첫 번째 단계는 레지스트리 수준에서 DCT를 사용하도록 설정하는 것입니다. DCT를 사용하도록 설정하면 클라이언트(사용자 또는 서비스)가 서명된 이미지를 레지스트리에 푸시할 수 있습니다.
레지스트리에 DCT를 사용하도록 설정해도 DCT를 사용하도록 설정한 소비자로만 레지스트리 사용이 제한되지는 않습니다. DCT를 사용하도록 설정하지 않은 소비자는 레지스트리를 정상적으로 계속 사용할 수 있습니다. 그러나 클라이언트에서 DCT를 사용하도록 설정한 소비자는 레지스트리에서 서명된 이미지 만 볼 수 있습니다.
Azure Portal을 사용하여 레지스트리에 DCT를 사용하도록 설정하려면 레지스트리로 이동합니다. 정책에서 콘텐츠 신뢰>사용>을 선택하고 저장하세요. Azure CLI에서 az acr config content-trust update 명령을 사용할 수도 있습니다.
클라이언트에 DCT 사용
신뢰할 수 있는 이미지를 사용하려면 이미지 게시자와 소비자 모두 Docker 클라이언트에 대해 DCT를 사용하도록 설정해야 합니다. 게시자는 DCT 사용 레지스트리에 푸시하는 이미지에 서명할 수 있습니다. 소비자로서 DCT를 사용하도록 설정하면 레지스트리 보기가 서명된 이미지로만 제한됩니다. DCT는 Docker 클라이언트에서 기본적으로 사용하지 않도록 설정되지만 셸 세션 또는 명령별로 사용하도록 설정할 수 있습니다.
셸 세션에 DCT를 사용하도록 설정하려면 환경 변수DOCKER_CONTENT_TRUST
를 1
.로 설정합니다. 예를 들어 Bash 셸에서 다음 코드를 사용합니다.
# Enable DCT for a shell session
export DOCKER_CONTENT_TRUST=1
단일 명령에 대해 DCT를 사용하거나 사용하지 않도록 설정하려는 경우 여러 Docker 명령이 인수를 --disable-content-trust
지원합니다.
단일 명령에 대해 DCT를 사용하도록 설정하려면 다음 코드를 사용합니다.
# Enable DCT for a single command
docker build --disable-content-trust=false -t myacr.azurecr.io/myimage:v1 .
셸 세션에 대해 DCT를 사용하도록 설정하고 단일 명령에 대해 DCT를 사용하지 않도록 설정하려면 다음 코드를 사용합니다.
# Disable DCT for a single command
docker build --disable-content-trust -t myacr.azurecr.io/myimage:v1 .
이미지 서명 권한 부여
권한을 부여한 사용자 또는 시스템만 신뢰할 수 있는 이미지를 레지스트리에 푸시할 수 있습니다. 사용자(또는 서비스 주체를 사용하여 시스템)에게 이 푸시 권한을 부여하려면 사용자 Microsoft Entra ID에 AcrImageSigner
역할을 할당하십시오. 이 권한은 레지스트리에 AcrPush
이미지를 푸시하는 데 필요한(또는 이와 동등한) 역할 외에 있습니다. 자세한 내용은 Azure Container Registry 권한 및 역할 할당 개요를 참조하세요.
중요합니다
다음 관리 계정에는 이 푸시 권한을 부여할 수 없습니다.
- Azure Container Registry의 관리자 계정
- 클래식 시스템 관리자 역할이 있는 Microsoft Entra ID의 사용자 계정
2021년 7월 현재, AcrImageSigner
역할에는 Microsoft.ContainerRegistry/registries/sign/write
작업과 Microsoft.ContainerRegistry/registries/trustedCollections/write
데이터 작업이 모두 포함됩니다.
Azure portal
AcrImageSigner
역할을 Azure 포털을 사용하여 부여하려면 다음을 수행합니다.
액세스 제어(IAM)를 선택합니다.
역할 할당 추가> 를 선택하여 역할 할당 추가 창을 엽니다.
다음 역할을 할당합니다. 이 예제에서 역할은 개별 사용자에게 할당됩니다. 자세한 단계는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.
설정 값 Role AcrImageSigner 액세스 할당 대상: User 멤버 알랭
Azure 커맨드 라인 인터페이스 (CLI)
Azure CLI를 사용하여 사용자에게 서명 권한을 부여하려면 레지스트리에 범위가 지정된 AcrImageSigner
역할을 사용자에게 할당합니다. 명령 형식은 다음과 같습니다.
az role assignment create --scope <registry ID> --role AcrImageSigner --assignee <user name>
예를 들어 관리자가 아닌 사용자에게 역할을 할당하려면 인증된 Azure CLI 세션에서 다음 명령을 실행할 수 있습니다. Azure 컨테이너 레지스트리 이름을 반영하도록 REGISTRY
값을 수정합니다.
# Grant signing permissions to an authenticated Azure CLI user
REGISTRY=myregistry
REGISTRY_ID=$(az acr show --name $REGISTRY --query id --output tsv)
az role assignment create --scope $REGISTRY_ID --role AcrImageSigner --assignee azureuser@contoso.com
서비스 사용자에게 신뢰할 수 있는 이미지를 레지스트리에 푸시할 수 있는 권한을 부여할 수도 있습니다. 서비스 사용자를 사용하면 빌드 시스템 또는 신뢰할 수 있는 이미지를 레지스트리에 푸시해야 하는 기타 무인 시스템에 도움이 됩니다. 형식은 사용자 권한을 부여하는 것과 유사하지만 값에 대한 서비스 주체 ID를 지정합니다 --assignee
.
az role assignment create --scope $REGISTRY_ID --role AcrImageSigner --assignee <service principal ID>
값은 <service principal ID>
서비스 주체의 appId
값, 해당 objectId
값 또는 해당 servicePrincipalNames
값 중 하나일 수 있습니다. 서비스 사용자 및 Azure Container Registry 사용에 대한 자세한 내용은 서비스 사용자로 Azure Container Registry 인증을 참조하세요.
중요합니다
역할을 변경한 후, az acr login
을 실행하여 새 역할이 영향을 받을 수 있도록 Azure CLI에 대한 로컬 ID 토큰을 새로 고칩니다. ID에 대한 역할을 확인하는 방법에 대한 자세한 내용은 Azure CLI를 사용하여 Azure 역할 할당 및 Azure RBAC 문제 해결을 참조하세요.
신뢰할 수 있는 이미지 푸시
신뢰할 수 있는 이미지 태그를 컨테이너 레지스트리에 푸시하려면 DCT를 사용하도록 설정하고 사용합니다 docker push
. 서명된 태그로 푸시가 처음 완료되면 루트 서명 키와 리포지토리 서명 키 모두에 대한 암호를 만들라는 메시지가 표시됩니다. 루트 및 리포지토리 키는 머신에 로컬로 생성 및 저장됩니다.
$ docker push myregistry.azurecr.io/myimage:v1
[...]
The push refers to repository [myregistry.azurecr.io/myimage]
ee83fc5847cb: Pushed
v1: digest: sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 size: 524
Signing and pushing trust metadata
You are about to create a new root signing key passphrase. This passphrase
will be used to protect the most sensitive key in your signing system. Please
choose a long, complex passphrase and be careful to keep the password and the
key file itself secure and backed up. It is highly recommended that you use a
password manager to generate the passphrase and keep it safe. There will be no
way to recover this key. You can find the key in your config directory.
Enter passphrase for new root key with ID 4c6c56a:
Repeat passphrase for new root key with ID 4c6c56a:
Enter passphrase for new repository key with ID bcd6d98:
Repeat passphrase for new repository key with ID bcd6d98:
Finished initializing "myregistry.azurecr.io/myimage"
Successfully signed myregistry.azurecr.io/myimage:v1
DCT를 사용하도록 설정한 첫 번째 docker push
작업이 완료되면 Docker 클라이언트는 후속 푸시에 동일한 루트 키를 사용합니다. 이후 동일한 리포지토리에 푸시할 때마다 리포지토리 키만 입력하면 됩니다. 신뢰할 수 있는 이미지를 새 리포지토리를 푸시할 때마다 새 리포지토리 키의 암호를 입력해야 합니다.
신뢰할 수 있는 이미지 풀
신뢰할 수 있는 이미지를 끌어오려면 DCT를 사용하도록 설정하고 명령을 정상적으로 실행 docker pull
합니다. 신뢰할 수 있는 이미지를 풀하려면 AcrPull
역할은 일반 사용자에 충분합니다. 추가적인 역할(예: AcrImageSigner
역할)은 필요하지 않습니다. DCT를 사용하도록 설정한 소비자는 서명된 태그가 있는 이미지만 끌어올 수 있습니다. 다음은 서명된 태그를 풀하는 예제입니다.
$ docker pull myregistry.azurecr.io/myimage:signed
Pull (1 of 1): myregistry.azurecr.io/myimage:signed@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b: Pulling from myimage
8e3ba11ec2a2: Pull complete
Digest: sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
Status: Downloaded newer image for myregistry.azurecr.io/myimage@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b
Tagging myregistry.azurecr.io/myimage@sha256:0800d17e37fb4f8194495b1a188f121e5b54efb52b5d93dc9e0ed97fce49564b as myregistry.azurecr.io/myimage:signed
DCT를 사용하도록 설정된 클라이언트가 서명되지 않은 태그를 끌어오려고 하면 다음 예제와 유사한 오류와 함께 작업이 실패합니다.
$ docker pull myregistry.azurecr.io/myimage:unsigned
Error: remote trust data does not exist
배후 상황
docker pull
을(를) 실행하는 경우, Docker 클라이언트는 Notary CLI와 동일한 라이브러리를 사용하여 풀링 중인 태그에 대한 tag-to-SHA-256 다이제스트 매핑을 요청합니다. 클라이언트가 신뢰 데이터에 대한 서명의 유효성을 검사한 후 Docker 엔진에 "다이제스트로 끌어오기"를 수행하도록 지시합니다. 풀하는 동안 엔진은 SHA-256 체크섬을 콘텐츠 주소로 사용하여 Azure 컨테이너 레지스트리에서 이미지 매니페스트를 요청하고 유효성을 검사합니다.
참고
Azure Container Registry는 공증인 CLI를 공식적으로 지원하지 않지만 공증 서버 API와 호환됩니다. 공증 서버 API는 Docker Desktop에 포함되어 있습니다. 현재 공증 버전 0.6.0을 사용하는 것이 좋습니다.
키 관리
첫 번째 신뢰할 수 있는 이미지를 푸시할 때 docker push
출력에서 설명했듯이, 루트 키가 가장 중요합니다. 기본적으로 Docker 클라이언트는 서명 키를 다음 디렉터리에 저장합니다.
~/.docker/trust/private
루트 및 리포지토리 키를 보관 파일에 압축하고 보관 파일을 안전한 위치에 저장하여 백업합니다. 예를 들어 Bash에서 다음 명령을 사용합니다.
umask 077; tar -zcvf docker_private_keys_backup.tar.gz ~/.docker/trust/private; umask 022
컨테이너 레지스트리는 로컬로 생성된 루트 및 리포지토리 키와 함께 신뢰할 수 있는 이미지를 푸시할 때 다른 여러 키를 생성하고 저장합니다. 관리 지침을 포함하여 DCT 구현의 다양한 키에 대한 자세한 내용은 Docker 설명서에서 콘텐츠 신뢰에 대한 키 관리를 참조하세요.
루트 키 손실
루트 키에 대한 액세스 권한이 끊어지면 해당 키가 서명한 태그가 있는 리포지토리의 서명된 태그에 액세스할 수 없게 됩니다. 컨테이너 레지스트리는 손실된 루트 키로 서명된 이미지 태그에 대한 액세스를 복원할 수 없습니다. 레지스트리에 대한 모든 신뢰 데이터(서명)를 제거하려면 레지스트리에 대해 DCT를 사용하지 않도록 설정한 다음 다시 사용하도록 설정합니다.
경고
레지스트리에서 DCT를 사용하지 않도록 설정하고 다시 사용하도록 설정하면 레지스트리의 모든 리포지토리에 있는 모든 서명된 태그에 대한 모든 신뢰 데이터가 삭제됩니다. 이 작업은 되돌릴 수 없습니다. 컨테이너 레지스트리는 삭제된 신뢰 데이터를 복구할 수 없습니다. DCT를 사용하지 않도록 설정해도 이미지 자체는 삭제되지 않습니다.
레지스트리에 대해 DCT를 사용하지 않도록 설정하려면 Azure Portal의 레지스트리로 이동합니다. 정책 아래에서 콘텐츠 신뢰>사용 안 함>저장을 선택합니다. 레지스트리의 모든 서명이 손실된다는 경고 메시지가 표시됩니다. 레지스트리의 모든 서명을 영구적으로 삭제하려면 확인을 선택합니다.
관련 콘텐츠
- 명령 및
docker trust
을 포함하여 DCT에 대한 자세한 내용은 Docker의 콘텐츠 트러스트를 참조하세요. - Docker 이미지를 빌드하고 푸시할 때 DCT를 사용하는 예제는 Azure Pipelines 설명서를 참조하세요.