본문 바로가기
기타개발/GitHub Actions

GitHub Actions #6 - Creating and storing encrypted secrets

by 궝테스트 2020. 3. 29.

# GitHub Actions 번역하며 요약하기
https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets

 

Creating and storing encrypted secrets - GitHub Help

Creating and storing encrypted secrets Encrypted secrets allow you to store sensitive information, such as access tokens, in your repository. GitHub Actions is available with GitHub Free, GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub One. Gi

help.github.com

  • 암호화된 secrets 는 엑세스토큰같은 중요한 정보를 레파지토리에 저장할 수 있게 해준다
  • 레파지토리의 소유자여야 암호화된 secret 를 생성할 수 있으며, organization 레파지토리일 경우 어드민 권한이 있어야 한다
  • REST API 를 사용하여 secrets 를 생성하는 경우 레파지토리에 쓰기 권한이 있는 누구든지 secrets 를 생성할 수 있다
  • 파일 편집 권한이 있다면 워크플로우 파일에서 암호화된 secrets 를 사용하고 읽을 수 있다

참고) GitHub Actions secrets API & Access permissions on GitHub 

 

0. About encrypted secrets

  • Secrets 은 깃헙 액션을 함께 사용하기 위한 레파지토리에 생성하는 암호화된 환경변수이다
  • 깃헙에 도달(?) 하기 전에 secrets 를 암호화하기위해 'libsodium sealed box' 를 사용하며
    워크플로우에서 secrets 를 사용할 때까지 암호화를 유지한다
  • 깃헙은 자동으로 secrets 로그를 삭제하지만 의도적으로 로그를 출력하는건 피해야한다

 

1. Creating encrypted secrets

  • Secret 이름은 공백을 포함할 수 없다
  • 깃헙이 로그에서 secret 를 삭제하는걸 보장하려면 secret 의 값으로
    JSON 또는 인코딩된 Git blob 이 포함된 구조화된 데이터를 사용하지 말아야 한다
  • 깃헙 레파지토리의 셋팅탭으로 진입하여 왼쪽 사이드바에 'Secrets' 를 클릭해보면 아래와 같은 내용이 쓰여있다
    • Secrets 는 암호화된 환경 변수로써 선택된 action 에서만 노출된다
    • 레파지토리의 collaborator 는 누구든지 워크플로우에 해당 secrets 를 사용할 수 있다
    • Secrets 는 fork 의 PR 에 의해 트리거된 경우 워크플로우에 전달되지 않는다
  • 인증서를 생성할 때 가능한 최소한의 퍼미션을 부여하는걸 추천한다
  • 개인 인증서 사용 대신 배포 키 또는 서비스 계정을 사용하고 필요하다면 읽기 전용 퍼미션 권한을 부여하고
    가능한 한 접근을 제한한다
  • 개인 액세스 토큰 (PAT) 을 생성할 때 필요한 최소 범위을 선택한다
  • Action 에 사용가능한 secret 를 만들려면 워크플로우 파일에서 secret 입력 또는 환경변수로 설정해야한다
    (Action README 파일 참고)

 

2. Using encrypted secrets in a workflow

  • GITHUB_TOKEN 제외하고 fork 한 레파지토리에서 워크플로우가 트리거될 때 secret 은 러너에 전달되지 않는다
  • Secret 을 입력 또는 환경변수로 제공하려면 레파지토리에서 생성된 secrets 접근하기위해 secret context 를 사용할 수 있다
    참고) Context and expression syntax for GitHub Actions
steps:
  - name: Hello world action
    with: # Set the secret as an input
      super_secret: ${{ secrets.SuperSecret }}
    env: # Or as an environment variable
      super_secret: ${{ secrets.SuperSecret }}
  • 가능하면 커맨드라인에서 프로세스간 secret 전달을 피한다
  • 커맨드라인 프로세스는 다른 사용자 (ps command 사용) 가 볼 수 있거나 보안 검사 이벤트에 잡힐 수 있다
  • Secret 보호를 위해 환경 변수, STDIN 또는 타켓 프로세스에서 지원하는 다른 메커니즘 사용하는게 좋다
  • 커맨드라인에서 secret 를 전달해야만 한다면 적절한 인용 규칙 내에서 포함해야한다
  • Secrets 는 종종 shell 에 영향이 갈 수 있는 특수 문자를 포함하기 때문에
    특수문자를 사용하지 않으려면 환경 변수와 함께 인용을 사용한다

 

3. Limits for secrets

  • 워크플로우는 100개 secret 이 있을 수 있으며 secret 환경변수의 이름은 레파지토리에서 유니크해야만 한다
  • Secrets 는 64KB 로 제한되며 64KB 보다 더 큰 secrets 를 사용하려면,
    레파지토리에 암호화된 secrets 를 저장하고 깃헙 secret 에 암호 해독을 저장한다
  • 깃헙에서 레파지토리에 파일을 체크하기전에 gpg 를 사용해서 로컬 자격 증명을 암호화 할 수 있다

1. 터미널에서 아래 명령을 실행하여 gpg, AES256 암호 알고리즘을 사용하여 'my_secret.json' 파일을 암호화한다

  • $ gpg --symmetric --cipher-algo AES256 my_secret.json

2. 암호를 입력하라는 메세지가 보일 것이다. (암호 기억해야함)

3. 레파지토리에 암호를 저장하기 위해 새로운 'secret' 을 생성한다

  • 예를들어 LARGE_SECRET_PASSPHRASE 라는 이름으로 새 secret 을 생성하고 2번에서 입력한 암호를 secret 의 값으로 설정한다

4. 레파지토리에서 암호화된 파일을 복사 후 커밋한다 (ex. my_secret.json.gpg)

5. 암호를 복호화하려면 shell script 를 생성하고 'decrypt_secret.sh' 라고 저장한다

  • #!/bin/sh # Decrypt the file mkdir $HOME/secrets # --batch to prevent interactive command --yes to assume "yes" for questions gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \ --output $HOME/secrets/my_secret.json my_secret.json.gpg

6. 레파지토리에 체크 전 shell script 가 실행가능한지 확인한다

  • $ chmod +x decrypt_secret.sh $ git add decrypt_secret.sh $ git commit -m "Add new decryption script" $ git push

7. 워크플로우 step 에서 shell script 를 호출하고 secret 을 복호화하한다

  • 워크플로우가 실행되는 환경에서 레파지토리의 복사본을 만들려면 'actions/checkout action' 을 사용한다
    레파지토리의 루트에 상대적인 run 커맨드를 사용하여 shell script 를 참조한다
name: Workflows with large secrets

on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Decrypt large secret
        run: ./.github/scripts/decrypt_secret.sh
        env:
          LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }}
      # This command is just an example to show your secret being printed
      # Ensure you remove any print statements of your secrets. GitHub does
      # not hide secrets that use this workaround.
      - name: Test printing your secret (Remove this step in production)
        run: cat $HOME/secrets/my_secret.json

댓글