Github Actions - secrets Context

DongHwan·2022년 4월 30일
0

Github Actions

목록 보기
5/7

워크플로우 파일은 Github Repository에 push되기에 아이디, 비밀번호와 같은 민감한 정보들을 그대로 사용할 시 위험하다. 그래서 Github Actions에서는 이러한 민감 정보를 저장할 Actions Secrets을 제공한다. 이 Actions Secrets를 저장하는 방법과 secrets Context를 사용하여 사용하는 방법을 알아보자.

Actions Secrets

Actions Secrets는 레포지토리 설정 혹은 Organization 설정에서 다룰 수 있다. 전자는 해당 레포지토리에만 적용되고, 후자는 Organization의 모든 레포지토리에 대해 적용된다. 설정의 좌측 탭을 찾아보면, Secrets 란이 있으며 이를 클릭한 뒤 Actions 탭을 선택해주자.

위 페이지에서 우측 상단의 New repository secret을 클릭하여 새 Secret을 추가할 수 있다.

위처럼 Secret의 이름과 값을 지정할 수 있다. 한번 값을 저장하고 나면, 이후에는 해당 값을 확인할 방법이 없으니 주의하자.

위처럼 Secret이 추가된 것을 확인할 수 있다. 저장된 Secret은 값을 업데이트하거나 삭제할 수만 있으며, 값을 조회하는 것을 불가능하다.

secrets Context

이전 섹션에서 저장한 Actions Secret을 사용하려면 secrets Context를 이용하면 된다. secrets Context은 다음 속성으로 구성되어 있다.

속성명설명
secretssecrets 변수들을 담고있는 오브젝트이다.
secrets.<secret_name>ㅤㅤ특정 secret의 값이다.

매우 간단한 구성이다. 이전 섹션에서 저장했던 SLACK_WEBHOOK_URL Secret을 가져오고 싶다면, secrets.SLACK_WEBHOOK_URL으로 가져올 수 있다.

- name: Send JSON data to Slack
  uses: slackapi/slack-github-action@v1.18.0
  with:
    payload: |
      {
        "key": "value",
        "foo": "bar"
      }
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

위는 secrets context를 사용한 예제 코드이다.

secrets.GITHUB_TOKEN

GITHUB_TOKEN는 워크플로우가 실행될 때 자동으로 만들어지는 특별한 Secret이다. GITHUB_TOKEN은 Access Token으로 사용되며, 워크플로우가 실행될 때 필요한 권한을 얻을 수 있게 해준다. 또한, 이 토큰의 권한은 워크플로우가 포함된 레포지토리에만 한정된다. 자세한 정보는 다음 문서를 참고하자.

정말 안전할까?

Github Actions에서 워크플로우를 실행하면, 위처럼 어떤 값이 사용되었는지 로그를 볼 수 있다. 그렇다면 Secrets을 사용한 경우에도 위처럼 로그를 살펴보면, 정보가 누출될 수 있지 않을까라는 생각을 할 수 있다. 그러나 Github Actions에서는 Secrets값을 마스킹 처리해주기에 안전하다. 몇가지 예시를 보자.

- run: echo ${{ secrets.SLACK_WEBHOOK_URL }}

# > RUN echo **
# ***

위처럼 secret 값을 그대로 사용한 경우, 명령어와 출력결과 모두 마스킹처리된 것을 볼 수 있다.

env:
  SLACK: ${{ secrets.SLACK_WEBHOOK_URL }}

- run: echo ${{ env.SLACK }}

# > RUN echo **
# ***

만약 Secret 값을 env처럼 다른 Context에 담아도 마스킹처리를 해준다.

- run: |
    test=${{ secrets.SLACK_WEBHOOK_URL }}
    echo "$test"
# > test=***
# > echo "$test"
# ***

- run: |
    test1=${{ secrets.SLACK_WEBHOOK_URL }}
    test2="test2"
    echo "$test1$test2"
# > test1=***
# > test2="test2"
# > echo "$test1$test2"
# ***test2

심지어는 위처럼 run Step 내부에서 환경변수에 담아 출력하거나 아예 변형을 가하더라도 마스킹 처리를 해준다.

총총

로그인 아이디, 비밀번호와 같은 중요한 정보들은 워크플로우 파일에 하드코딩하지말고 Secrets를 사용해서 안전하게 보관하자.

profile
날 어떻게 한줄로 소개해~

0개의 댓글