C.W.K.
Stream
Lesson 02 of 12 · published

Secret 안전하게 쓰기

~13 min · secrets, redaction, leakage

Level 0Apprentice
0 XP0/101 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

GitHub 가 자동 redact 하지만 아는 만큼만

GitHub 는 모든 log 출력에서 secret 의 글자 그대로 값을 redact 해. Secret 이 sk-abc123 이면 stdout, stderr, command 출력, 에러 메시지, annotation 의 그 문자열 등장이 다 *** 로 대체.

하지만 redaction 은 literal string match. 못 redact 하는 거:

  • 인코딩된 버전 — base64, JSON-escape, URL-encoded secret 은 글자 그대로 문자열이 아니므로 redact 안 됨.
  • 파생 값 — secret 으로 서명한 JWT, secret 의 해시. Secret 과 같지 않지만 누설 가능.
  • 부분 echo — 스크립트가 첫 10 자만 출력하면 그 10 자는 redaction trigger 안 함.
  • 중첩 프로세스의 env secret + set -x (bash 디버그 모드) — bash 가 전체 환경을 echo.

방어 습관

  1. Secret 은 env: 로 전달, shell command-line 인자로는 절대 금지 (multi-tenant CI 의 process listing 에 나타남).
  2. Secret 담은 변수를 echo 절대 금지, 디버그라도.
  3. 민감 출력은 --mask 로 파이프: echo "::add-mask::$VALUE" 가 GitHub 에 redact 지시.
  4. Secret 만지는 블록에서 set -x 회피.
  5. 여러 줄 secret (RSA 키) 은 파일 기반 handoff 선호: umask 077 로 파일 쓰고 path 로 참조.

Code

Secret 사용 옳고 그른 방식·yaml
# WRONG — exposes the secret in process list
      - run: |
          curl -H "Authorization: Bearer ${{ secrets.TOKEN }}" https://api.example.com

# RIGHT — env var, no echo, no command-line
      - env:
          TOKEN: ${{ secrets.TOKEN }}
        run: |
          curl -H "Authorization: Bearer $TOKEN" https://api.example.com

# RIGHT — file handoff for multi-line secrets
      - env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
        run: |
          umask 077
          printf '%s\n' "$DEPLOY_KEY" > /tmp/key
          ssh -i /tmp/key user@host 'uptime'

External links

Exercise

기존 workflow 에서 SOMETHING 이 secret 인 echo $SOMETHING 검색. 파일-handoff 나 env-var-no-echo 패턴으로 교체. Push 하고 log 에 secret 값 더 이상 안 보이는지 확인 (부분도).

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.