GPG키 생성

IBM Cloud DevSecOps 지속적 통합 툴체인을 통해 생성되어 인벤토리에 등록된 아티팩트는 프로덕션 환경에 배포되기 전에 서명되어야 합니다. 이 지속적 통합 파이프라인은 Skopeo 를 아티팩트 서명 기능을 제공하는 기본 도구로 사용합니다.

자동 또는 수동으로 DevSecOps 지속적 통합 파이프라인에서 사용하는 GPG 키를 생성하고 저장합니다.

GPG 키 자동 생성

이 방법을 사용하여 템플리트는 GPG키를 생성합니다. 다음 단계를 완료하여 키 생성을 위한 이름이메일 을 입력하십시오.

  1. 아티팩트 서명 으로 이동하여 새로 작성을 클릭하십시오.

    이미지 서명
    아티팩트 서명

  2. 창에서 이름이메일 필드는 도구 체인 이름 및 이메일 ID로 미리 채워집니다. GPG키 요구사항을 반영하도록 이름 및 이메일 ID를 변경하십시오. 상자를 선택하여 비밀 정보 제공자에 키를 저장할 수도 있습니다.

    이름 및 이메일 변경
    이름 및 이메일 변경

  3. 키가 생성된 후 참조를 위해 복사할 수 있습니다.

    이미지 서명 인증서
    그림 3아티팩트 서명 인증서

복사된 키는 base64 형식입니다. 키를 키 링으로 가져오기 전에 키를 해독하세요. echo <encoded_gpg_key> | base64 --decode

GPG 키를 수동으로 생성하기

GPG 명령행 도구 다운로드 및 설치

사용 중인 운영 체제에 맞는 GPG 명령줄 도구를 다운로드하여 설치하십시오. GnuPG 의 바이너리 릴리스 섹션으로 이동하여 사용 중인 운영 체제에 맞는 도구를 다운로드하세요.

Mac OS X

  • Mac GPG를 다운로드하여 설치하십시오.
  • 설치된 GPG의 버전을 확인하십시오. 명령행에서 다음 명령을 실행하십시오.
$ gpg --version
gpg (GnuPG) 2.3.1
libgcrypt 1.9.3
Copyright (C) 2021 Free Software Foundation, Inc.
  • 2.3.1 이전 버전의 GPG에서는 --passphrase='' 옵션을 사용할 수 없을 수도 있습니다. 이 경우 프롬프트가 표시되면 Enter 를 눌러 다음 대화 상자에서 비밀번호를 생략할 수 있습니다.

Windows™

  • 다운로드 및 설치 GitBash ( base64 인코딩에 필요함).
  • 설치된 GPG의 버전을 확인하십시오. Git bash 명령 프롬프트에서 다음 명령을 실행하십시오.
$ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 g10 Code GmbH

GPG 키 생성

generate-key 명령이 비밀번호 문구를 요청하는 대화 상자를 여는 경우 비밀번호 문구 및 필드를 비워 두십시오. 이는 이미지 서명용 skopeo 유틸리티의 제한 사항으로, 해당 파이프라인은 암호로 보호된 개인 키를 처리할 수 없습니다. 생성 시 암호를 입력하면 파이프라인이 인증서 해독에 실패하게 되며, 이로 인해 이미지 서명 단계에서 파이프라인이 중단됩니다. 이는 GIT 태그 서명에도 적용된다는 점에 유의하세요.

Mac OS X 그리고 Linux™

쉘 프롬프트에서 다음 명령을 실행하십시오.

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • 이름 및 이메일 주소를 입력하십시오.
  • O를 입력하여 키 생성을 시작하십시오.
  • 키가 생성된 후, O 옵션을 선택하십시오.

Windows™

GPG 버전 > 1.4

Git bash 명령 프롬프트에서 다음 명령을 실행하십시오.

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • ‘실명’ 란에 이름을 입력하세요.
  • 이메일 주소에 이메일 주소를 입력하십시오.
  • 키 생성을 시작하려면 O를 입력하세요.
  • 키가 생성된 후, O 옵션을 선택하십시오.

GPG 버전 < 1.4 (또는 이전 명령어 실행 시 오류가 발생한 경우)

Git bash 명령 프롬프트에서 다음 명령을 실행하십시오.

gpg --gen-key
  • 키 유형: ‘기본’ 옵션 (1)인 RSA 및 RSA(기본값)를 선택하십시오
  • 키 크기: 기본값 유지 (2048)
  • 키 유효성: 기본값을 0으로 유지하십시오. 이는 값 키 0이 만기되지 않기 때문입니다.
  • 선택을 확인하십시오: y를 입력하세요.
  • 실제 이름 필드에 사용자의 이름을 입력하십시오.
  • 이메일 주소에 이메일 주소를 입력하십시오.
  • O를 입력하여 키 생성을 시작하십시오.
  • 키가 생성된 후, O 옵션을 선택하십시오.

키 작성 확인

gpg 키가 작성되었는지 확인하십시오. 명령 프롬프트에서 다음 명령을 실행하십시오:

gpg --list-keys

키가 나열되어 있는지 확인하십시오. Windows의 예제 출력:

$ gpg --list-keys
/c/Users/FredSmith/.gnupg/pubring.gpg
-------------------------------------
pub   2048R/1BB354B5 2021-06-08
uid   Fred Smith <fred@company.com>
sub   2048R/F91C39A6 2021-06-08

키 내보내기

이 단계는 선택사항입니다. gpg 키를 내보낼 수 있도록 이 명령을 실행하십시오.

gpg --export-secret-key <Email Address>

반출되는 원시 키는 직접 복사되지 않아야 합니다. 이 단계에서 생성된 키는 Key Protect 인스턴스나 Secrets Manager 인스턴스에 안전하게 보관하는 것이 좋습니다. 세부사항은 다음 절을 참조하십시오.

키를 저장하십시오.

다음 방법 중 하나로 CI 파이프라인에 GPG 키를 제공해야 합니다.

  • IBM® Key Protect for IBM Cloud®에 저장됨
  • IBM Cloud® Secrets Manager에 저장됨
  • CI 도구 체인에 직접 저장됨

가져오기 실패로 인한 CI 파이프라인 서명 오류를 방지하기 위해 키가 올바른 형식으로 복사되었는지 확인하십시오. 다음 명령어에서 pbcopy ( Mac OS X ) 또는 clip (Windows Git bash)를 사용하여 키 내용을 클립보드에 복사하세요.

Key Protect에 키를 저장하십시오.

GPG 키를 클립보드로 내보내고 복사하십시오.

GPG 키를 Key Protect 인스턴스에 저장하기 전에 반드시 이중 base64 인코딩을 수행해야 합니다.

OS X

gpg --export-secret-key <Email Address> | base64 | base64 | pbcopy

Windows™

gpg --export-secret-key <Email Address> | base64 -w0 | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64 | base64
  1. IBM Cloud 콘솔에서 이전 단계를 통해 생성된 GPG 키를 저장할 Key Protect 인스턴스를 선택하십시오.

  2. 추가+ 아이콘을 클릭하여 인스턴스에 새 키를 추가하십시오.

  3. ‘내 키 가져오기 ’ 옵션을 선택하세요.

  4. ‘표준 키 ’로 키 유형을 선택하십시오.

  5. ‘키 이름’ 필드에 적절한 이름을 입력하십시오. 저장된 GPG 키는 나중에 이 키 이름으로 불러올 수 있습니다.

  6. 앞서 내보낸 키를 ‘키 자료’ 필드에 복사하세요.

    키를 복사하여 ‘키 자료’ 필드에 붙여넣을 때, 키 끝에 여분의 줄이 없도록 주의하십시오.

  7. ‘기본 키링 선택’ 옵션을 선택하세요.

  8. 키 추가 를 클릭하여 키 보호에 키를 추가하십시오.

    키 보호에 키 추가
    키 보호에 키 추가

Key Protect에 관한 자세한 정보는 Key Protect 문서를 참조하십시오.

Secrets Manager에 키를 저장하십시오.

Secrets Manager 인스턴스에 저장하기 전에 GPG 키의 단일 base64 인코딩이 필요합니다.

GPG 키를 클립보드로 내보내고 복사하십시오.

OS X

gpg --export-secret-key <Email Address> | base64 | pbcopy

Windows™

gpg --export-secret-key <Email Address> | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64
  1. IBM Cloud 콘솔에서 이전 단계를 통해 생성된 GPG 키를 저장할 Secrets Manager 인스턴스를 선택하십시오.

  2. 추가+ 아이콘을 클릭하여 인스턴스에 새 키를 추가하십시오.

  3. ‘기타 비밀 유형 ’ 옵션을 선택하세요.

    기타 비밀 유형
    기타 비밀 유형

  4. 키 유형 선택옵션에 대해 표준 키 유형을 선택하십시오.

  5. ‘이름’ 필드에 적절한 이름을 입력하세요. 저장된 GPG 키는 이 이름으로 나중에 검색할 수 있습니다.

  6. 옵션을 ‘비밀 값’으로 선택하고, 앞서 내보낸 키를 ‘비밀 값’ 필드에 붙여넣으세요.

    키를 복사하여 ‘Secret’ 값 필드에 붙여넣을 때, 키 끝에 여분의 줄이 없도록 주의하십시오.

  7. 추가 아이콘을 클릭하여 Key Protect 인스턴스에 키를 추가하십시오.

    키 추가
    키 추가

Secrets Manager에 관한 자세한 정보는 Secrets Manager 시작하기를 참조하십시오.

개인 키를 내보내고 CI 파이프라인에 직접 저장하십시오.

이 방법은 권장되지 않으며, 실험 목적으로만 사용해야 합니다. 키를 저장하려면 Key Protect 또는 Secrets Manager 을 사용하세요. 자세한 정보는 시크릿 저장소 구성 을 참조하십시오.

보안 파이프라인 특성으로 저장하기 전에 GPG 키의 단일 base64 인코딩이 필요합니다.

Key Protect 또는 Secrets Manager 인스턴스에 GPG 키를 안전하게 저장하십시오.

Mac OS X / Linux™

gpg --export-secret-key <Email Address> | base64

Windows™

gpg --export-secret-key <Email Address> | base64 -w0

서명을 위한 레지스트리 자격 증명 구성

컨테이너 이미지를 서명할 때, 파이프라인은 컨테이너 레지스트리에 인증하기 위한 자격 증명이 필요합니다. DevSecOps 파이프라인은 런타임 시 동적 자격 증명 확인을 지원하므로, 자동 대체 메커니즘을 통해 다양한 방식으로 자격 증명을 구성할 수 있습니다.

인증 정보 확인 계층 구조

이 파이프라인은 다음 계층 구조를 사용하여 런타임 시 사용자 이름과 API 키 자격 증명을 동적으로 확인합니다.

gara-destination-registrygara-destination-namespace 를 사용하여 서명 대상 재정의가 구성되고 gara-destination-apikey 도 함께 제공되는 경우, 파이프라인은 대상 레지스트리에 대한 인증 시 gara-destination-apikey 에 가장 높은 우선순위를 부여합니다. 그렇지 않으면 대상 이미지에 대해 아래의 자격 증명 확인 방식으로 대체됩니다.

API 키 확인 순서:

  1. 네임스페이스 전용 API 키: signing-token-apikey-{registry}-{namespace} (비밀 키)
  2. 레지스트리 전용 API 키: signing-token-apikey-{registry} (비밀번호)
  3. Docker JSON 구성 파일: signing-dockerconfigjson (비밀번호)
  4. ICR 전용 대체 처리:
    • ciso-ibmcloud-api-key (비밀)
    • ibmcloud-api-key (비밀)

사용자 이름 확인 순서:

  1. 네임스페이스별 사용자 이름: signing-token-username-{registry}-{namespace} (환경 변수)
  2. 레지스트리 전용 사용자 이름: signing-token-username-{registry} (환경 변수)
  3. 기본값: iamapikey (사용자 이름이 설정되지 않은 경우)

여기서:

  • {registry} 레지스트리 호스트 이름입니다(예: us.icr.io, de.icr.io)
  • {namespace} 슬래시와 점(.)을 밑줄(_)로 대체한 전체 네임스페이스 경로입니다(예: my_namespace_path)

네임스페이스별 자격 증명 구성

세분화된 액세스 제어를 위해 레지스트리 네임스페이스별로 고유한 자격 증명을 구성할 수 있습니다:

API 키 (비밀 키): signing-token-apikey-{registry}-{namespace}

사용자 이름 (환경 변수): signing-token-username-{registry}-{namespace}

예시: 이미지의 경우 us.icr.io/my-namespace/my-app:latest

  • registry: us.icr.io
  • 네임스페이스: my-namespace
  • API 키 비밀번호: signing-token-apikey-us.icr.io-my_namespace
  • 사용자 이름 환경 변수: signing-token-username-us.icr.io-my_namespace
  • 사용자 이름을 지정하지 않으면 기본값은 다음과 같습니다: iamapikey

레지스트리 전용 자격 증명 구성

레지스트리의 모든 네임스페이스에 걸쳐 더 광범위한 접근 권한을 부여하려면:

API 키 (비밀 키): signing-token-apikey-{registry}

사용자 이름 (환경 변수): signing-token-username-{registry}

: 다음의 모든 이미지에 대해 us.icr.io

  • API 키 비밀번호: signing-token-apikey-us.icr.io
  • 사용자 이름 환경 변수: signing-token-username-us.icr.io
  • 사용자 이름을 지정하지 않으면 기본값은 다음과 같습니다: iamapikey

Docker 구성 JSON 설정

여러 레지스트리의 인증 정보가 포함된 base64-encoded Docker 구성 JSON 파일을 제공할 수 있습니다:

비밀 이름: signing-dockerconfigjson

형식: Base64-encoded JSON ( Docker 의 config.json 형식과 일치함):

{
  "auths": {
    "us.icr.io": {
      "username": "iamapikey",
      "password": "your-api-key"
    },
    "us.icr.io/my-namespace": {
      "username": "iamapikey",
      "password": "namespace-specific-key"
    }
  }
}

파이프라인은 가장 구체적인 경로부터 우선적으로 일치시키며, 이를 통해 Docker 구성 내에서 네임스페이스 수준의 재정의가 가능합니다.

구성 예

us.icr.io/production/my-app:v1.0.0 이미지의 경우:

옵션 1: 네임스페이스별 (프로덕션 환경에서 권장)

  • API 키 시크릿: signing-token-apikey-us.icr.io-production = your-namespace-api-key
  • 사용자 이름 환경 변수 (선택 사항): signing-token-username-us.icr.io-production = iamapikey
  • 사용자 이름을 지정하지 않으면 기본값은 iamapikey

옵션 2: 레지스트리 전체

  • API 키 시크릿: signing-token-apikey-us.icr.io = your-registry-api-key
  • 사용자 이름 환경 변수 (선택 사항): signing-token-username-us.icr.io = iamapikey
  • 사용자 이름을 지정하지 않으면 기본값은 iamapikey

옵션 3: Docker 구성 JSON

  • 비밀: signing-dockerconfigjson = base64-encoded-docker-config
  • 사용자 이름은 Docker 설정 JSON 파일에서 추출됩니다

옵션 4: IBM Cloud 기본값 (ICR의 경우 자동)

  • API 키 시크릿: ibmcloud-api-key = your-ibmcloud-api-key
  • 사용자 이름은 기본적으로 iamapikey