GitHub가 자동으로 가려주지만, 아는 만큼 안전하다
GitHub는 모든 로그 출력에서 비밀값의 원본 문자열을 자동으로 가려줘. 비밀값이 sk-abc123라면 stdout, stderr, 명령 출력, 에러 메시지, annotation에서 해당 문자열이 나타날 때 전부 ***로 바뀌지.
하지만 이 가리기 작업은 literal string match 기반이라서 다음 경우엔 못 막아:
- 인코딩된 버전 — base64, JSON-escape, URL-encoded 비밀값은 원본 문자열이 아니라서 가려지지 않아.
- 파생 값 — 비밀값으로 서명한 JWT나 비밀값의 해시. 원본 비밀값과 다르지만 누출될 수 있어.
- 부분 출력 — 스크립트가 앞 10자만 출력하면 그 10자는 가리기 대상이 아니야.
- 중첩 프로세스의 환경 변수 비밀값 +
set -x(bash 디버그 모드) — bash가 전체 환경을 출력해버려.
방어 습관
- 비밀값은
env:로 전달하고, 셸 명령줄 인자로는 절대 넘기지 마. (멀티테넌트 CI의 프로세스 목록에 노출되거든.) - 비밀값이 든 변수는 디버그 목적이어도
echo로 찍지 마. - 민감한 출력값은
--mask로 파이프해:echo "::add-mask::$VALUE"명령이 GitHub에 가리기를 지시해. - 비밀값을 다루는 블록에서는
set -x를 피해. - 여러 줄 비밀값(RSA 키)은 파일 기반으로 넘기는 걸 추천해: umask 077로 파일을 쓰고 경로로 참조해.