IBM Cloud Docs
Container Registry에서 컨텐츠 기밀을 위한 이미지 암호화

Container Registry에서 컨텐츠 기밀을 위한 이미지 암호화

IBM Cloud® Container Registry 이미지의 기밀성을 보호하고 신뢰할 수 없는 호스트가 이미지를 실행할 수 없도록 할 수 있습니다.

개인 키가메시지를 암호화하는 데 사용되는 알고리즘 패턴으로, 해당 공개 키로만 메시지를 복호화할 수 있습니다. 개인 키는 또한 해당 공개 키로 암호화된 메시지를 복호화하는 데도 사용됩니다. 개인 키는 사용자 시스템에 보존되며 비밀번호로 보호됩니다. 없는 사람이 콘텐츠에 액세스할 수 없도록 암호화된 이미지를 만듭니다. 이미지를 암호화 및 복호화하려면 RSA 공개-개인 키 쌍을 사용하여 암호화된 이미지를 작성하십시오. 공개 키는 시크릿이 아니며 누구나 공개 키를 사용하여 이미지를 암호화할 수 있습니다. 개인 키는 시크릿이며 개인 키가 있는 사용자만 개인 키를 사용하여 이미지를 복호화할 수 있습니다.

암호화는 IBM Cloud Container Registry에서 지원되며 다음 표준을 준수합니다.

이미지 암호화에 대한 자세한 정보는 저장된 컨테이너 이미지 보안을 위해 암호화된 컨테이너 이미지컨테이너 이미지 암호화를 통해 이미지 보안 및 준수 향상을 참조하십시오.

시작하기 전에

  • IBM Cloud Container Registry 시작하기의 지시사항을 완료하십시오.
  • IBM Cloud CLI용 container-registry CLI 플러그인의 최신 버전이 있는지 확인하십시오. container-registry CLI 플러그인 업데이트를 참조하십시오.
  • 암호화된 이미지를 푸시할 개인용 네임스페이스가 있는지 확인하십시오. 네임스페이스 설정을 참조하십시오.
  • Buildah 버전 1.15 이상을 설치하여 암호화된 이미지를 만들 수 있습니다. Buildah는 Linux® 환경에서만 작동합니다. Linux®의 대안으로 가상 머신 또는 Docker 이미지를 사용하여 Buildah를 실행하여 이미지를 빌드할 수 있습니다.
  • Podman을 설치하십시오.

공개-개인 키 쌍 작성

OpenSSL 명령을 사용하여 공개-개인 키 쌍을 작성하십시오.

  1. 키를 저장할 작업 디렉토리(예: USER_KEYS)를 작성하고 해당 디렉토리로 변경하십시오.

    mkdir USER_KEYS; cd USER_KEYS
    
  2. OpenSSL을 사용하여 개인 키를 작성하십시오. 여기서 USER_KEY은(는) 키 ID의 이름입니다.

    openssl genrsa --out USER_KEYPrivate.pem
    
  3. 공개 키를 작성하십시오.

    openssl rsa -in USER_KEYPrivate.pem -pubout -out USER_KEYPub.pem
    

    프로덕션에서 개인 키를 사용하려면 개인 키를 적합한 저장소에 안전하게 저장하고 보호해야 합니다. 동일한 방법으로 공개 키를 관리하려고 할 수도 있습니다. 자세한 정보는 키 저장을 참조하십시오.

  4. 다음 명령으로 키를 나열하여 키가 작성되었는지 확인하십시오.

    ls -l
    
  5. 이미지를 암호화하는 데 이 키 쌍을 사용하려면 다음 cat 명령을 실행하여 공개 키를 표시하십시오.

    cat USER_KEYPub.pem
    

    다음 출력과 유사한 응답이 표시됩니다.

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv8Ny7dCWQ8Pdq1ddYSwk
    QOCB3lUEZVEyj9StX3jnISF/rxIsUZzJfbOrQN0fGkm+1sCCtltgQdztTjito8Fh
    DGflqQBSmV40XP3iZnNUJDrHuAol463Z/BuxxFXL3ry6rTosLGfrRwdQjxp8RSsn
    WyIIO2rmcqXZYe4SCtiMjMejLlTIDWLIMdYL3d6hA4DpgDLoh6EPmhKMVVwRt5b0
    ew5eMLcDuq6ButOM5yv4zYVHNrajY41NK+abSlFb6wzMg2AUDiC/MxV1LRq6mpyZ
    GJllx3LS1M1j7fDO3pmh/M0X7yD/4RgHwFaW4/4CQBw3fyxrOv0pZzZay+o
    -----END PUBLIC KEY-----
    

이미지 암호화

공개 키를 사용하여 이미지를 암호화한 다음 Docker파일을Docker 이미지를 빌드하기 위한 지시사항이 포함된 텍스트 파일입니다. 사용하여 컨테이너 이미지를 빌드합니다.

  1. 앱을 저장하는 디렉토리(예: MY_APP)로 이동하십시오.

    cd MY_APP
    
  2. 다음 명령을 실행하여 Dockerfile을 작성하십시오.

    cat << EOF >> Dockerfile
    FROM nginx:latest
    RUN echo "some secret" > /secret-file
    EOF
    
  3. Buildah 을 사용하여 다음 명령을 실행하여 암호화되지 않은 이미지를 만듭니다(여기서 NAMESPACE 은 네임스페이스입니다):

    buildah bud -t us.icr.io/NAMESPACE/MY_APP .
    

    us.icr.io/NAMESPACE/MY_APP은(는) 로컬 이미지 저장소에 커미트됩니다.

  4. 공개 키를 사용하여 이미지를 암호화하고 다음 명령을 실행하고 JSON Web Encryption(jwe) 프로토콜을 지정해서 이미지를 암호화하여 레지스트리에 이미지를 업로드하십시오. 여기서 USER_KEYS/USER_KEYPub.pem은(는) 암호화 키입니다.

    buildah push --encryption-key jwe:..USER_KEYS/USER_KEYPub.pem us.icr.io/NAMESPACE/MY_APP
    

    Buildah 버전 1.15 이상에서는 Docker의 로그인 인증 정보를 사용하여 인증합니다. 이러한 자격 증명이 작동하지 않거나 API 키를API 요청을 인증하고 권한을 부여하는 데 사용되는 고유 코드입니다. 코드는 API로 전달되어 호출하는 애플리케이션이나 사용자를 식별하고 API 사용 방식을 추적 및 제어합니다. 사용하려는 경우 —-creds <username> 옵션(여기서 <username> 은 사용자 아이디)을 제공할 수 있습니다. —-creds <username> 옵션을 사용하는 경우 요청 시 레지스트리 자격 증명의 비밀번호를 입력합니다.

    Manifest가 레지스트리인 이미지 대상에 작성되었음을 사용자에게 알려주는 응답을 받습니다.

  5. 레지스트리를 확인하여 이미지가 있는지 확인하십시오.

이미지 가져오기 및 복호화

레지스트리에서 이미지를 가져오고 개인 키를 사용하여 이미지를 복호화하십시오.

  1. 레지스트리에서 가져오고 있으며 로컬 캐시를 사용하고 있지 않음을 확인하려면 로컬에서 이미지를 제거하십시오.

    buildah rmi -f us.icr.io/NAMESPACE/MY_APP
    
  2. (선택사항) 이미지를 복호화할 수 없음을 확인하기 위해 복호화 키를 제공하지 않고 이미지 가져오기를 시도할 수 있습니다.

    buildah pull us.icr.io/NAMESPACE/MY_APP
    

    출력에는 다음 메시지와 유사한 메시지가 포함됩니다.

    ...<truncated>...
    Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption
    ERRO exit status 125
    
  3. Buildah를 사용하여 복호화 키로 이미지를 가져오십시오. 여기서 USER_KEYS/USER_KEYPrivate.pem은(는) 복호화 키이고 us.icr.io/NAMESPACE/MY_APP은(는) 레지스트리입니다.

    buildah pull --decryption-key ../USER_KEYS/USER_KEYPrivate.pem us.icr.io/NAMESPACE/MY_APP
    

    암호화된 이미지는 레지스트리에서 검색되고, 복호화되며, 로컬 이미지 저장소에 저장됩니다.

  4. Podman을 실행하여 이미지가 저장되었는지 확인하십시오.

    podman run -it us.icr.io/NAMESPACE/MY_APP /bin/bash
    

키 저장

프로덕션에서 개인 키를 사용하려면 개인 키를 안전하게 저장하고 보호해야 합니다. 이미지를 빌드할 수 있는 사용자를 제어하기 위해 동일한 방법으로 공개 키를 관리하려고 할 수도 있습니다. IBM Key Protect를 사용하여 키를 저장하고 보호할 수 있습니다.

IBM Key Protect는 이미지 암호화에 사용되는 비대칭 PKI 키가 아닌 대칭 키를 저장합니다. 대시보드, CLI 또는 API를 사용하여 키를 개별적으로 두 개의 IBM Key Protect 표준 키로 추가할 수 있습니다. IBM Key Protect에서는 Base64 데이터만 가져와야 합니다. 퓨어 Base64 데이터를 확보하려면 Base64 컨텐츠를 로드하기 전에 "openssl enc -base64 -A -in USER_KEYPrivate.pem -out USER_KEYPrivate.b64"을(를) 실행하여 PEM 파일을 인코딩하고 "openssl enc -base64 -A -d -in USER_KEYPrivate..b64 -out USER_KEYPrivate.pem"을(를) 실행하여 사용 가능 키를 다시 가져오도록 이 조치를 되돌릴 수 있습니다.

키를 저장하고 보호하기 위해 IBM Key Protect를 사용하는 방법에 대한 자세한 정보는 암호화 키를 클라우드로 가져오기고유한 키 가져오기를 참조하십시오.

대안으로, 키를 랩핑하기 위해 IBM Key Protect 루트 키를 사용하여 고유한 저장소에서 키를 보호할 수 있습니다. 이 조치는 IBM Key Protect 및 올바른 루트 키를 사용하여 키를 다시 랩핑 해제해야 함을 의미합니다.

예를 들어 CLI를 사용하여 키를 랩핑하려면 "ibmcloud kp key wrap ROOT_KEY_ID -p <base64 encoded image key>" 명령을 실행하고, 키를 랩핑 해제하려면 "ibmcloud kp key unwrap ROOT_KEY_ID -p <base64 cyphertext> 명령을 실행하십시오. 여기서 ROOT_KEY_ID은(는) 사용 중인 루트 키의 ID입니다.

대안으로, 키를 랩핑하기 위해 IBM Key Protect 루트 키를 사용하여 고유한 저장소에서 키를 보호하는 방법에 대한 자세한 정보는 키 랩핑을 참조하십시오.

암호화된 이미지는 Vulnerability Advisor가 스캔하지 않습니다.

다음 단계

이미지 키 동기화 프로그램 클러스터 추가 기능을 사용하여 Red Hat® OpenShift® on IBM Cloud® 클러스터에서 암호화된 이미지를 실행하십시오.