vault-radar scan ci 명령어

vault-radar scan ci 명령어

scan ci 명령어는 지속적 통합(continuous integration, CI) 워크플로우에서 콘텐츠를 스캔할 수 있게 해 주는 기능이에요. 커밋이나 PR을 만들 때 위험(risks)을 자동으로 검사하고 싶다면 이 명령어를 CI 설정에 넣어 사용할 수 있어요.

출처: 문서

본문

scan ci 명령어는 지속적 통합 워크플로우에서 콘텐츠를 스캔할 수 있게 해 주는 데 사용돼요.

사용법

Usage: vault-radar scan ci [subcommand]

명령 옵션

  • pr: CI/CD 워크플로우를 위해 git 저장소의 브랜치/PR을 스캔해요.
  • tip: CI/CD 워크플로우를 위해 git 저장소 브랜치의 tip(최신 커밋)을 스캔해요.

예시 Vault Radar CI 설정

vault-radar scan ci 명령어를 사용하려면 여러분 프로젝트의 HCP_PROJECT_ID, HCP_CLIENT_ID, HCP_CLIENT_SECRET 값이 필요해요. 이 값들은 워크플로우 러너가 환경 변수로 사용할 수 있어야 해요. (GitHub / GitLab / Bitbucket 탭 참고)

다음 GitHub 워크플로우 YAML 예시는 저장소에서 커밋이나 PR을 만들 때 위험을 스캔하는 설정에서 vault-radar scan ci 명령어를 사용하는 예시예요.

메모: tip 스캔을 사용할 때는 checkout 단계에 with 섹션을 추가하고 fetch-depth 변수를 0으로 설정해서 클론된 저장소가 전체 히스토리를 갖도록 하는 것이 중요해요. 이렇게 하지 않으면 결과가 정확하지 않을 수 있어요.

jobs:
 vault-radar:
   runs-on: ubuntu-latest

   steps:
   - name: Checkout code
     uses: actions/checkout@v4
     with:
       fetch-depth: 0

   - name: Run Vault Radar
     env: 
       HCP_CLIENT_ID: ${{ secrets.HCP_CLIENT_ID }}
       HCP_CLIENT_SECRET: ${{ secrets.HCP_CLIENT_SECRET }}
       HCP_PROJECT_ID: ${{ secrets.HCP_PROJECT_ID }}
     run: |
       set -x

       export LATEST_VERSION=$(curl https://api.releases.hashicorp.com/v1/releases/vault-radar/latest | jq -r .version)
       curl https://releases.hashicorp.com/vault-radar/${LATEST_VERSION}/vault-radar_${LATEST_VERSION}_linux_amd64.zip -o vr.zip # download latest binary# This can be replaced with other package managers or to other release versions. See: https://releases.hashicorp.com/vault-radar
       unzip vr.zip -d vr
       mv vr/vault-radar .

       chmod +x vault-radar

       if [[ "${{ github.event_name }}" == "pull_request" ]];
       then
         head_ref="${{ github.event.pull_request.head.sha }}" 
         base_ref="${{ github.event.pull_request.base.sha }}"
         ref_name="${{ github.head_ref }}"
         
         ./vault-radar scan ci pr \
           --head-ref ${head_ref} \
           --base-ref ${base_ref} \
           --ref-name ${ref_name} \
           -s high \ 
           -o vault-radar.jsonl \
           -l vault-radar.log \
           --skip-ignored \
           --pretty=gha_pr
       else
         ./vault-radar scan ci tip -s high -o vault-radar.jsonl -l vault-radar.log --pretty=gha
       fi

다음은 예시 GitLab 파이프라인 구성 YAML 파일이에요. 이 파이프라인은 최신 vault-radar 실행 파일을 다운로드한 다음 vault-radar scan ci 명령어를 실행해 커밋을 만들고 머지 리퀘스트를 열 때 위험을 스캔해요.

HCP_PROJECT_ID, HCP_CLIENT_ID, HCP_CLIENT_SECRET 환경 변수를 GitLab 네이티브 파이프라인 변수로 파이프라인 잡에서 사용할 수 있게 만들어 주세요.

경고: GitLab 변수를 사용할 때는 시크릿(secret)을 마스킹(mask)하세요.

대안으로 시크릿 매니저를 사용할 수도 있어요. Vault 같은 시크릿 매니저를 GitLab 파이프라인과 통합하는 방법은 여기를 참조해 주세요.

GitLab의 기본 러너는 amd64 아키텍처를 사용해요. 제공된 예시는 해당 아키텍처를 지원해요. 다른 아키텍처를 사용한다면 잡을 적절히 태그하고 일치하는 vault-radar CLI를 사용해 주세요.

지원되는 버전과 아키텍처는 릴리스 페이지를 참조해 주세요.

메모: GIT_DEPTH 변수가 0으로 설정된 variables 섹션을 추가해 클론된 저장소가 전체 히스토리를 갖도록 하는 것이 중요해요. 이렇게 하지 않으면 결과가 정확하지 않을 수 있어요.

variables:
  GIT_DEPTH: 0

stages:
  - install-vault-radar
  - run-vault-radar

install-vault-radar:
  tags:
    - saas-linux-small-amd64 # default runner
  stage: install-vault-radar
  rules: # Run on commits and merge requests
  - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
  - if: $CI_PIPELINE_SOURCE != 'merge_request_event'
  before_script:
    - apt-get -qq update
    - apt-get install -y jq # install jq to use later
  script:
    - export LATEST_VERSION=$(curl https://api.releases.hashicorp.com/v1/releases/vault-radar/latest | jq -r .version)
    - curl https://releases.hashicorp.com/vault-radar/${LATEST_VERSION}/vault-radar_${LATEST_VERSION}_linux_amd64.zip -o vr.zip # download latest binary
    - unzip vr.zip -d vr # unzip the archive
    - mv vr/vault-radar vault-radar
  artifacts:
    when: on_success
    access: none
    expire_in: 1 hour
    paths:
      - vault-radar

run-vault-radar-on-commit:
  tags:
    - saas-linux-small-amd64 # default runner
  stage: run-vault-radar
  dependencies:
    - install-vault-radar
  rules: # Run on merge requests and commits pushed to main branch
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == "main"
  script:
    - ./vault-radar scan ci tip -s high -o vault-radar.jsonl -l vault-radar.log --pretty=gha
  artifacts:
    untracked: false
    when: on_success
    access: all
    expire_in: 1 days
    paths:
      - vault-radar.jsonl
      - vault-radar.log

run-vault-radar-in-merge-request:
  tags:
    - saas-linux-small-amd64 # default runner
  stage: run-vault-radar
  dependencies:
    - install-vault-radar
  rules: # Run only on merge requests
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
  script:
    - | # See: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
      ./vault-radar scan ci pr \
      --head-ref "${CI_COMMIT_SHA}" \
      --base-ref "${CI_MERGE_REQUEST_DIFF_BASE_SHA}" \
      --ref-name "${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}" \
      -s high -o vault-radar.jsonl -l vault-radar.log --pretty=gha
  artifacts:
    untracked: false
    when: on_success
    access: all
    expire_in: 1 days
    paths:
      - vault-radar.jsonl
      - vault-radar.log

다음은 예시 Bitbucket 파이프라인 구성이에요. 이 구성은 main에 병합된 모든 변경 사항에 대해 tip 스캔을 실행하고, 모든 풀 리퀘스트에 대해 pr 스캔을 실행해요.

HCP_PROJECT_ID, HCP_CLIENT_ID, HCP_CLIENT_SECRET은 저장소 변수로 파이프라인 잡에서 사용할 수 있어야 해요.

ci 명령어에 올바른 정보를 제공하려면 Bitbucket API를 사용해 풀 리퀘스트에 대한 추가 정보를 가져와야 해요.

Bitbucket 저장소에서 Repository Settings > Access Tokens로 이동해 생성할 수 있는 액세스 토큰이 필요해요. 이 토큰은 보안 저장소 변수 REPO_ACCESS_TOKEN으로 저장할 수 있어요.

메모: depth 변수가 full로 설정된 clone 섹션을 추가해 클론된 저장소가 전체 히스토리를 갖도록 하는 것이 중요해요. 이렇게 하지 않으면 결과가 정확하지 않을 수 있어요.

image: atlassian/default-image:3

pipelines:
  branches:
    'main':
      - step:
          name: 'Run Vault Radar'
          clone:
            depth: full
          script:
            - export LATEST_VERSION=$(curl https://api.releases.hashicorp.com/v1/releases/vault-radar/latest | jq -r .version)
            - curl https://releases.hashicorp.com/vault-radar/${LATEST_VERSION}/vault-radar_${LATEST_VERSION}_linux_amd64.zip -o vr.zip # download latest binary
            - unzip vr.zip -d vr
            - mv vr/vault-radar vault-radar
            - ./vault-radar scan ci tip -s medium -o vault-radar.jsonl -l vault-radar.log --pretty=gha
          artifacts:
            - vault-radar.log
            - vault-radar.jsonl
          
  pull-requests:
    '**':
      - step:
          name: 'Run Vault Radar in PR'
          clone:
            depth: full
          script:
          - export LATEST_VERSION=$(curl https://api.releases.hashicorp.com/v1/releases/vault-radar/latest | jq -r .version)
          - curl https://releases.hashicorp.com/vault-radar/${LATEST_VERSION}/vault-radar_${LATEST_VERSION}_linux_amd64.zip -o vr.zip # download latest binary
          - unzip vr.zip -d vr
          - mv vr/vault-radar vault-radar
          - |
            BITBUCKET_PR_INFO=$(curl "https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_FULL_NAME}/pullrequests/${BITBUCKET_PR_ID}" -fsS \
            -H 'Content-Type: application/json' \
            -H "Authorization: Bearer $REPO_...OKEN")
          - COMMIT_HEAD_SHA=$(echo -n $BITBUCKET_PR_INFO | jq -r '.source.commit.hash')
          - BASE_HEAD_SHA=$(echo -n $BITBUCKET_PR_INFO | jq -r '.destination.commit.hash')
          - |
            ./vault-radar scan ci pr \
            --head-ref "${COMMIT_HEAD_SHA}" \
            --base-ref "${BASE_HEAD_SHA}" \
            --ref-name "${BITBUCKET_BRANCH}" \
            -s medium -o vault-radar.jsonl -l vault-radar.log --pretty=gha
          artifacts:
            - vault-radar.log
            - vault-radar.jsonl

Bitbucket 서버 인스턴스의 경우 PR 세부 정보를 가져오는 데 사용되는 API를 다음과 같이 변경해야 해요:

BITBUCKET_PR_INFO=$(curl "https://<SERVER DOMAIN>/rest/api/latest/projects/${BITBUCKET_PROJECT_KEY}/repos/${BITBUCKET_REPO_FULL_NAME}/pull-requests/${BITBUCKET_PR_ID}" -fsS \
            -H 'Content-Type: application/json' \
            -H "Authorization: Bearer $REPO_...OKEN")

Bitbucket 서버 API 참조

더 알아보기 (Learn more)