개요
OIDC(OpenID Connect)를 사용하면 GitHub Actions 워크플로가 JFrog로 인증하여 GitHub에 JFrog 암호, 토큰 또는 API 키를 저장하지 않고도 아티팩트를 다운로드하고 게시할 수 있습니다.
이 가이드에서는 GitHub의 OIDC를 페더레이션 ID로 신뢰하도록 JFrog를 구성하는 방법에 대한 개요를 제공하고 GitHub Actions 워크플로에서 이 구성을 사용하는 방법을 보여 줍니다.
예제 GitHub Actions 워크플로의 경우 JFrog 설명서의 샘플 GitHub Actions 통합을 참조하세요.
JFrog CLI를 사용하는 예제 GitHub Actions 워크플로의 경우 jfrog-github-oidc-example
리포지토리의 build-publish.yml
을 참조하세요.
필수 조건
-
GitHub가 OIDC(OpenID Connect)를 사용하는 방법과 아키텍처 및 이점에 대한 기본 개념을 알아보려면 “OpenID Connect를 사용한 보안 강화 정보”를 참조하세요.
-
계속하기 전에 액세스 토큰이 예측 가능한 방식으로만 할당되도록 보안 전략을 계획해야 합니다. 클라우드 공급자가 액세스 토큰을 발급하는 방법을 제어하려면 신뢰할 수 없는 리포지토리가 클라우드 리소스에 대한 액세스 토큰을 요청할 수 없도록 하나 이상의 조건을 정의해야 합니다. 자세한 내용은 "OpenID Connect를 사용한 보안 강화 정보"을(를) 참조하세요.
-
보안을 위해 ID 매핑을 구성할 때 JFrog에서 클레임 JSON을 설정해야 합니다. 자세한 내용은 "AUTOTITLE" 및 "OpenID Connect를 사용한 보안 강화 정보"을(를) 참조하세요.
예를 들어
iss
를https://token.actions.githubusercontent.com
에,repository
를 그리고 "octo-org/octo-repo"와 같은 항목에 설정할 수 있습니다. 이렇게 하면 지정된 리포지토리의 Actions 워크플로만 JFrog 플랫폼에 액세스할 수 있습니다. 다음은 ID 매핑을 구성할 때의 클레임 JSON 예제입니다.JSON { "iss": "https://token.actions.githubusercontent.com", "repository": "octo-org/octo-repo" }
{ "iss": "https://token.actions.githubusercontent.com", "repository": "octo-org/octo-repo" }
JFrog에 ID 공급자 추가
JFrog에서 OIDC를 사용하려면 GitHub Actions과 JFrog 플랫폼 간에 트러스트 관계를 설정합니다. 이 프로세스에 대한 자세한 내용은 JFrog 설명서의 OIDC(OpenID Connect) 통합을 참조하세요.
- JFrog 플랫폼에 로그인합니다.
- JFrog와 GitHub Actions 워크플로 간에 트러스트를 구성합니다.
- ID 매핑을 구성합니다.
GitHub Actions 워크플로 업데이트
GitHub Actions과 JFrog 플랫폼 간에 트러스트 관계를 설정하면 GitHub Actions 워크플로 파일을 업데이트할 수 있습니다.
GitHub Actions 워크플로 파일에서 JFrog 플랫폼에서 구성한 공급자 이름과 대상 그룹을 사용하고 있는지 확인합니다.
다음 예제에서는 자리 표시자 YOUR_PROVIDER_NAME
을 사용합니다.
- name: Fetch Access Token from Artifactory
id: fetch_access_token
env:
ID_TOKEN: $
run: |
ACCESS_TOKEN=$(curl \
-X POST \
-H "Content-type: application/json" \
https://example.jfrog.io/access/api/v1/oidc/token \
-d \
"{\"grant_type\": \"urn:ietf:params:oauth:grant-type:token-exchange\", \"subject_token_type\":\"urn:ietf:params:oauth:token-type:id_token\", \"subject_token\": \"$ID_TOKEN\", \"provider_name\": \"YOUR_PROVIDER_NAME\"}" | jq .access_token | tr -d '"')
echo ACCESS_TOKEN=$ACCESS_TOKEN >> $GITHUB_OUTPUT
다음 예제에서는 cURL을 사용하는 GitHub Actions 워크플로 파일의 일부를 보여줍니다.
- name: Get ID Token (cURL method)
id: idtoken
run: |
ID_TOKEN=$(curl -sLS -H "User-Agent: actions/oidc-client" -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
"${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=jfrog-github" | jq .value | tr -d '"')
echo "ID_TOKEN=${ID_TOKEN}" >> $GITHUB_OUTPUT
또는 env
컨텍스트를 사용하여 대상 그룹을 환경 변수로 설정할 수 있습니다. env
컨텍스트에 대한 자세한 내용은 "워크플로 실행에 대한 컨텍스트 정보에 액세스"을 참조하세요.
참고: 워크플로 또는 OIDC 정책에서 환경을 사용하는 경우 추가 보안을 위해 환경에 보호 규칙을 추가하는 것이 좋습니다. 예를 들어 환경에 배포할 수 있는 분기 및 태그를 제한하거나 환경 비밀에 액세스하도록 환경에 대한 배포 규칙을 구성할 수 있습니다. 자세한 내용은 "배포 환경 관리"을(를) 참조하세요.
jobs:
build:
runs-on: ubuntu-latest
env:
OIDC_AUDIENCE: 'YOUR_AUDIENCE'
그런 다음 워크플로 파일에서 env
컨텍스트에 저장된 변수의 값을 검색합니다. 다음 예제에서는 env
컨텍스트를 사용하여 OIDC 대상 그룹을 검색합니다.
- name: Get ID Token (using env context)
uses: actions/github-script@v6
id: idtoken
with:
script: |
const coredemo = require('@actions/core');
let id_token = await coredemo.getIDToken(process.env.OIDC_AUDIENCE);
coredemo.setOutput('id_token', id_token);