다음을 통해 공유


ORAS를 사용하여 OCI 아티팩트 및 공급망 아티팩트 관리

ACR(Azure Container Registry)을 사용하면 OCI(Open Container Initiative) 아티팩트와 공급망 아티팩트를 모두 관리할 수 있습니다. 이 문서에서는 OCI 아티팩트 및 공급망 아티팩트를 효과적으로 관리하기 위해 ACR을 사용하는 방법을 안내합니다. 서명, SBOM(소프트웨어 제품 구성 정보), 보안 검사 결과, 기타 유형을 포함하여 OCI 아티팩트와 공급망 아티팩트의 그래프를 모두 저장하고, 관리하고, 검색하는 방법을 알아봅니다.

이 문서는 다음 두 개의 주요 섹션으로 구분됩니다.

필수 조건

  • Azure Container Registry - Azure 구독 내에서 컨테이너 레지스트리를 만듭니다. 예를 들어 Azure Portal 또는 Azure CLI를 사용합니다.
  • Azure CLI - 버전 2.29.1 이상이 필요합니다. 설치 및/또는 업그레이드는 Azure CLI 설치를 참조하세요.
  • ORAS CLI - 버전 v1.1.0 이상 버전이 필요합니다. ORAS 설치를 참조하세요.
  • Docker(선택 사항) - 연습을 완료하기 위해 컨테이너 이미지가 참조됩니다. 로컬로 설치된 Docker를 사용하여 컨테이너 이미지를 빌드 및 푸시하거나 acr build를 사용하여 Azure에서 원격으로 빌드할 수 있습니다.
    Docker Desktop은 필요하지 않지만 oras cli는 자격 증명을 저장하기 위해 Docker 데스크톱 자격 증명 저장소를 활용합니다. Docker Desktop이 설치된 경우 oras login에 대해 실행 중이어야 합니다.

레지스트리 구성

쉬운 명령 실행을 위해 환경을 구성하려면 다음 단계를 수행합니다.

  1. ACR_NAME 변수를 레지스트리 이름으로 설정합니다.
  2. REGISTRY 변수를 $ACR_NAME.azurecr.io로 설정합니다.
  3. REPO 변수를 리포지토리 이름으로 설정합니다.
  4. TAG 변수를 원하는 태그로 설정합니다.
  5. IMAGE 변수를 $REGISTRY/${REPO}:$TAG로 설정합니다.

환경 변수 설정

아티팩트를 푸시하고 끌어오도록 레지스트리 이름, 로그인 자격 증명, 리포지토리 이름, 태그를 구성합니다. 다음 예제에서는 net-monitor 리포지토리 이름 및 v1 태그를 사용합니다. 사용자 고유의 리포지토리 이름 및 태그로 대체합니다.

ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
REPO=net-monitor
TAG=v1
IMAGE=$REGISTRY/${REPO}:$TAG

레지스트리에 로그인

컨테이너 이미지를 끌어오고 푸시할 수 있도록 ACR을 사용하여 인증합니다.

az login  
az acr login -n $REGISTRY  

Docker를 사용할 수 없는 경우 인증에 제공된 AD 토큰을 활용할 수 있습니다. AD 토큰을 사용하여 개별 Microsoft Entra ID로 인증합니다. 토큰은 PASSWORD 변수를 통해 구문 분석되므로 항상 USER_NAME에 "000..."을 사용합니다.

# Login to Azure
az login

ORAS로 로그인

자격 증명을 oras login에 제공합니다.

oras login $REGISTRY \
    --username $USER_NAME \
    --password $PASSWORD

이 설정을 사용하면 Azure Container Registry에서 아티팩트 푸시 및 끌어오기를 원활하게 수행할 수 있습니다. 특정 구성에 필요한 대로 변수를 조정합니다.

ORAS를 사용하여 OCI 아티팩트 푸시 및 끌어오기

Azure Container Registry를 사용하여 Docker 및 OCI 컨테이너 이미지뿐 아니라 OCI(Open Container 이니셔티브) 아티팩트도 저장하고 관리할 수 있습니다.

이 기능을 설명하기 위해 이 섹션에서는 ORAS(OCI Registry as Storage) CLI를 사용하여 OCI 아티팩트를 Azure 컨테이너 레지스트리에 푸시하고 끌어오는 방법을 보여 줍니다. 각 아티팩트에 적합한 다양한 명령줄 도구를 사용하여 Azure Container Registry에서 다양한 OCI 아티팩트를 관리할 수 있습니다.

참고 항목

ACR 및 ORAS는 사용자 및 시스템 자동화를 위한 여러 인증 옵션을 지원합니다. 이 문서에서는 Azure 토큰을 사용하여 개별 ID를 사용합니다. 인증 옵션에 대한 자세한 내용은 Azure 컨테이너 레지스트리로 인증을 참조하세요.

아티팩트 밀어넣기

subject 부모가 없는 단일 파일 아티팩트는 컨테이너 이미지, helm 차트, 리포지토리에 대한 추가 정보 파일에서 아무것도 될 수 없습니다. 참조 아티팩트는 서명, 소프트웨어 제품 구성 정보, 검사 보고서 또는 기타 진화하는 유형 등 무엇이든 될 수 있습니다. 공급망 아티팩트 연결, 푸시 및 풀에 설명된 참조 아티팩트는 다른 아티팩트를 참조하는 아티팩트입니다.

단일 파일 아티팩트 푸시

이 예제에서는 markdown 파일을 나타내는 콘텐츠를 만듭니다.

echo 'Readme Content' > readme.md

다음 단계에서는 readme.md 파일을 <myregistry>.azurecr.io/samples/artifact:readme로 푸시합니다.

  • 레지스트리는 정규화된 레지스트리 이름 <myregistry>.azurecr.io(모두 소문자)과 네임스페이스 및 리포지토리 /samples/artifact로 식별됩니다.
  • 아티팩트에 :readme 태그가 지정되어 리포지토리(:latest, :v1, :v1.0.1)에 나열된 다른 아티팩트와 고유하게 식별합니다.
  • --artifact-type readme/example을 설정하여 application/vnd.oci.image.config.v1+json을 사용하는 컨테이너 이미지와 아티팩트를 구분합니다.
  • ./readme.md는 업로드된 파일을 식별하고 :application/markdown은 파일의 IANA mediaType을 나타냅니다.
    자세한 내용은 OCI 아티팩트 작성자 참고 자료을 참조하세요.

oras push 명령을 사용하여 이 파일을 레지스트리에 밀어넣습니다.

Linux, WSL2 또는 macOS

oras push $REGISTRY/samples/artifact:readme \
    --artifact-type readme/example \
    ./readme.md:application/markdown

Windows

.\oras.exe push $REGISTRY/samples/artifact:readme ^
    --artifact-type readme/example ^
    .\readme.md:application/markdown

푸시에 성공하면 다음과 비슷한 출력이 표시됩니다.

Uploading 2fdeac43552b readme.md
Uploaded  2fdeac43552b readme.md
Pushed <myregistry>.azurecr.io/samples/artifact:readme
Digest: sha256:e2d60d1b171f08bd10e2ed171d56092e39c7bac1

aec5d9dcf7748dd702682d53

다중 파일 아티팩트 푸시

OCI 아티팩트가 ORAS를 사용하여 레지스트리에 푸시되면 각 파일 참조가 Blob으로 푸시됩니다. 별도의 Blob을 푸시하려면 파일을 개별적으로 참조하거나 디렉터리를 참조하여 파일 컬렉션을 참조합니다.
파일 컬렉션을 푸시하는 방법에 대한 자세한 내용은 여러 파일을 사용하여 아티팩트 푸시를 참조하세요.

리포지토리에 대한 몇 가지 설명서 만들기:

echo 'Readme Content' > readme.md
mkdir details/
echo 'Detailed Content' > details/readme-details.md
echo 'More detailed Content' > details/readme-more-details.md

다중 파일 아티팩트 푸시:

Linux, WSL2 또는 macOS

oras push $REGISTRY/samples/artifact:readme \
    --artifact-type readme/example\
    ./readme.md:application/markdown\
    ./details

Windows

.\oras.exe push $REGISTRY/samples/artifact:readme ^
    --artifact-type readme/example ^
    .\readme.md:application/markdown ^
    .\details

매니페스트 검색

oras push의 결과로 생성된 매니페스트를 보려면 oras manifest fetch를 사용합니다.

oras manifest fetch --pretty $REGISTRY/samples/artifact:readme

는 다음과 유사하게 출력됩니다.

{
  "mediaType": "application/vnd.oci.artifact.manifest.v1+json",
  "artifactType": "readme/example",
  "blobs": [
    {
      "mediaType": "application/markdown",
      "digest": "sha256:2fdeac43552b71eb9db534137714c7bad86b53a93c56ca96d4850c9b41b777fc",
      "size": 15,
      "annotations": {
        "org.opencontainers.image.title": "readme.md"
      }
    },
    {
      "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:0d6c7434a34f6854f971487621426332e6c0fda08040b9e6cc8a93f354cee0b1",
      "size": 189,
      "annotations": {
        "io.deis.oras.content.digest": "sha256:11eceb2e7ac3183ec9109003a7389468ec73ad5ceaec0c4edad0c1b664c5593a",
        "io.deis.oras.content.unpack": "true",
        "org.opencontainers.image.title": "details"
      }
    }
  ],
  "annotations": {
    "org.opencontainers.artifact.created": "2023-01-10T14:44:06Z"
  }
}

아티팩트 끌어오기

다운로드를 위한 클린 디렉터리를 만듭니다.

mkdir ./download

oras pull 명령을 사용하여 레지스트리에서 아티팩트를 끌어옵니다.

oras pull -o ./download $REGISTRY/samples/artifact:readme

풀(pull)한 파일 보기

tree ./download

아티팩트 제거(선택 사항)

레지스트리에서 아티팩트를 제거하려면 oras manifest delete 명령을 사용합니다.

 oras manifest delete $REGISTRY/samples/artifact:readme

ORAS를 사용하여 공급망 아티팩트 연결, 푸시, 끌어오기

이 기능을 설명하기 위해 이 문서에서는 ORAS(OCI Registry as Storage) CLI를 사용하여 Azure 컨테이너 레지스트리에 대한 공급망 아티팩트 그래프를 push, discover, pull하는 방법을 보여 줍니다. 개별(주체) OCI 아티팩트 저장은 OCI 아티팩트 푸시 및 끌어오기에서 다룹니다.

아티팩트 그래프를 저장하기 위해 subject 아티팩트 참조는 시험판 OCI 1.1 배포 사양의 일부인 OCI 이미지 매니페스트를 사용하여 정의됩니다.

컨테이너 이미지 푸시

Azure CLI를 사용하여 아티팩트 그래프를 컨테이너 이미지와 연결하려면 다음을 수행합니다.

컨테이너 이미지를 빌드하여 푸시하거나 $IMAGE가 레지스트리에서 기존 이미지를 참조하는 경우 이 단계를 건너뛸 수 있습니다.

az acr build -r $ACR_NAME -t $IMAGE https://github.com/wabbit-networks/net-monitor.git#main

서명 연결

echo '{"artifact": "'${IMAGE}'", "signature": "jayden hancock"}' > signature.json

서명을 컨테이너 이미지에 대한 참조로 레지스트리에 첨부

oras attach 명령은 $IMAGE에 대한 파일(./signature.json) 간의 참조를 만듭니다. --artifact-type은 다양한 파일 형식을 사용하도록 설정하는 파일 확장명과 비슷한 차별화된 아티팩트를 제공합니다. [file]:[mediaType]을 지정하여 하나 이상의 파일을 첨부할 수 있습니다.

oras attach $IMAGE \
    --artifact-type signature/example \
    ./signature.json:application/json

oras 첨부에 대한 자세한 내용은 ORAS 설명서를 참조하세요.

다중 파일 아티팩트를 참조로 첨부

OCI 아티팩트가 ORAS를 사용하여 레지스트리에 푸시되면 각 파일 참조가 Blob으로 푸시됩니다. 별도의 Blob을 푸시하려면 파일을 개별적으로 참조하거나 디렉터리를 참조하여 파일 컬렉션을 참조합니다.
파일 컬렉션을 푸시하는 방법에 대한 자세한 내용은 여러 파일을 사용하여 아티팩트 푸시를 참조하세요.

아티팩트 참조 검색

OCI v1.1 사양subject 아티팩트 참조를 검색하기 위한 참조페이지 API를 정의합니다. oras discover 명령은 컨테이너 이미지에 대한 참조 목록을 표시할 수 있습니다.

oras discover를 사용하여 현재 레지스트리에 저장된 아티팩트의 그래프를 봅니다.

oras discover -o tree $IMAGE

출력은 서명과 문서가 컨테이너 이미지의 자식으로 표시되는 아티팩트 그래프의 시작을 보여 줍니다.

myregistry.azurecr.io/net-monitor:v1
├── signature/example
│   └── sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcb...
└── readme/example
    └── sha256:1a118663d1085e229ff1b2d4d89b5f6d67911f22e55...

아티팩트 그래프 만들기

OCI v1.1 사양을 사용하면 심층 그래프를 통해 서명된 SBOM(소프트웨어 제품 구성 정보) 및 기타 아티팩트 형식을 사용할 수 있습니다.

SBOM을 만들고 레지스트리에 연결하는 방법은 다음과 같습니다.

샘플 SBOM 만들기

echo '{"version": "0.0.0.0", "artifact": "'${IMAGE}'", "contents": "good"}' > sbom.json

레지스트리의 이미지에 샘플 SBOM 첨부

Linux, WSL2 또는 macOS

oras attach $IMAGE \
  --artifact-type sbom/example \
  ./sbom.json:application/json

Windows

.\oras.exe attach $IMAGE ^
    --artifact-type sbom/example ^
    ./sbom.json:application/json

SBOM 서명

Important

Microsoft는 Notation과 같은 보안 암호화 서명 도구를 사용하여 이미지에 서명하고 SBOM 서명에 대한 서명을 생성하는 것을 권장합니다.

참조로 푸시하게 되는 아티팩트는 subject 아티팩트의 일부로 간주되므로 일반적으로 태그가 없습니다. 다른 아티팩트의 자식인 아티팩트에 서명을 밀어넣으려면 --artifact-type 필터링과 함께 oras discover를 사용하여 다이제스트를 찾습니다. 이 예제에서는 데모용으로 간단한 JSON 서명을 사용합니다.

SBOM_DIGEST=$(oras discover -o json \
                --artifact-type sbom/example \
                $IMAGE | jq -r ".manifests[0].digest")

SBOM의 서명을 만듭니다.

echo '{"artifact": "'$IMAGE@$SBOM_DIGEST'", "signature": "jayden hancock"}' > sbom-signature.json

SBoM 서명 첨부

oras attach $IMAGE@$SBOM_DIGEST \
  --artifact-type 'signature/example' \
  ./sbom-signature.json:application/json

그래프 보기

oras discover -o tree $IMAGE

다음 출력이 생성됩니다.

myregistry.azurecr.io/net-monitor:v1
├── sbom/example
│   └── sha256:4f1843833c029ecf0524bc214a0df9a5787409fd27bed2160d83f8cc39fedef5
│       └── signature/example
│           └── sha256:3c43b8cb0c941ec165c9f33f197d7f75980a292400d340f1a51c6b325764aa93
├── readme/example
│   └── sha256:5fafd40589e2c980e2864a78818bff51ee641119cf96ebb0d5be83f42aa215af
└── signature/example
    └── sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5

아티팩트 그래프 승격

일반적인 DevOps 워크플로는 개발에서 스테이징을 통해 프로덕션 환경으로 아티팩트를 승격합니다. 보안 공급망 워크플로는 퍼블릭 콘텐츠를 비공개 보안 환경으로 승격합니다. 두 경우 모두 주체 아티팩트가 있는 서명, SBOM, 검사 결과, 기타 관련 아티팩트를 승격하여 종속성의 전체 그래프가 생성됩니다.

oras copy 명령을 사용하여 레지스트리에서 필터링된 아티팩트 그래프를 승격할 수 있습니다.

net-monitor:v1 이미지를 복사하고 관련 아티팩트를 sample-staging/net-monitor:v1에 복사합니다.

TARGET_REPO=$REGISTRY/sample-staging/$REPO
oras copy -r $IMAGE $TARGET_REPO:$TAG

oras copy의 출력:

Copying 6bdea3cdc730 sbom-signature.json
Copying 78e159e81c6b sbom.json
Copied  6bdea3cdc730 sbom-signature.json
Copied  78e159e81c6b sbom.json
Copying 7cf1385c7f4d signature.json
Copied  7cf1385c7f4d signature.json
Copying 3e797ecd0697 details
Copying 2fdeac43552b readme.md
Copied  3e797ecd0697 details
Copied  2fdeac43552b readme.md
Copied demo42.myregistry.io/net-monitor:v1 => myregistry.azurecr.io/sample-staging/net-monitor:v1
Digest: sha256:ff858b2ea3cdf4373cba65d2ca6bcede4da1d620503a547cab5916614080c763

승격된 아티팩트 그래프 검색

oras discover -o tree $TARGET_REPO:$TAG

oras discover의 출력:

myregistry.azurecr.io/sample-staging/net-monitor:v1
├── sbom/example
│   └── sha256:4f1843833c029ecf0524bc214a0df9a5787409fd27bed2160d83f8cc39fedef5
│       └── signature/example
│           └── sha256:3c43b8cb0c941ec165c9f33f197d7f75980a292400d340f1a51c6b325764aa93
├── readme/example
│   └── sha256:5fafd40589e2c980e2864a78818bff51ee641119cf96ebb0d5be83f42aa215af
└── signature/example
    └── sha256:00da2c1c3ceea087b16e70c3f4e80dbce6f5b7625d6c8308ad095f7d3f6107b5

참조된 아티팩트 끌어오기

참조된 특정 아티팩트를 풀하기 위해 참조 다이제스트가 oras discover 명령을 사용하여 검색됩니다.

DOC_DIGEST=$(oras discover -o json \
              --artifact-type 'readme/example' \
              $TARGET_REPO:$TAG | jq -r ".manifests[0].digest")

다운로드를 위한 클린 디렉터리 만들기

mkdir ./download

문서를 다운로드 디렉터리로 끌어오기

oras pull -o ./download $TARGET_REPO@$DOC_DIGEST

문서 보기

tree ./download

tree의 출력:

./download
├── details
│   ├── readme-details.md
│   └── readme-more-details.md
└── readme.md

리포지토리 및 태그 목록 보기

ORAS를 사용하면 태그를 할당하지 않고도 아티팩트 그래프를 푸시하고, 검색하고, 끌어오고, 복사할 수 있습니다. 또한 이렇게 하면 태그 목록이 컨테이너 이미지, helm 차트 및 기타 아티팩트와 연결된 서명 및 SBOM과 달리 사용자가 생각하는 아티팩트에 초점을 맞출 수 있습니다.

태그 목록 보기

oras repo tags $REGISTRY/$REPO

그래프의 모든 아티팩트 삭제

OCI v1.1 사양을 지원하면 주체 아티팩트와 연결된 아티팩트 그래프를 삭제할 수 있습니다. oras manifest delete 명령을 사용하여 아티팩트 그래프(서명, SBOM, SBOM의 서명)를 삭제합니다.

oras manifest delete -f $REGISTRY/$REPO:$TAG

oras manifest delete -f $REGISTRY/sample-staging/$REPO:$TAG

매니페스트 목록을 확인하여 주체 아티팩트가 삭제되고 모든 관련 아티팩트가 깨끗한 환경을 벗어나는 것을 확인할 수 있습니다.

az acr manifest list-metadata \
  --name $REPO \
  --registry $ACR_NAME -o jsonc

출력

2023-01-10 18:38:45.366387 Error: repository "net-monitor" is not found.

요약

이 문서에서는 Azure Container Registry를 사용하여 OCI 아티팩트와 공급망 아티팩트를 모두 저장하고, 관리하고, 검색하는 방법을 알아보았습니다. ORAS CLI를 사용하여 Azure Container Registry에 아티팩트를 푸시하고 끌어올 수 있습니다. 또한 푸시된 아티팩트 매니페스트를 검색하고 컨테이너 이미지에 연결된 아티팩트 그래프를 확인했습니다.

다음 단계

  • 아티팩트 참조, 서명 연결, 소프트웨어 제품 구성 정보, 기타 참조 형식에 대해 알아봅니다.
  • 아티팩트의 매니페스트를 구성하는 방법을 포함하여 ORAS 프로젝트에 대해 자세히 알아봅니다.
  • 새 아티팩트 형식에 대한 참조 정보를 보려면 OCI 아티팩트 리포지토리를 방문하세요.