피드로 돌아가기
Stop storing your GitHub App private key in GitHub Secrets
Dev.toDev.to
Security

GitHub Secrets 탈출, AWS KMS로 구현하는 Private Key 유출 제로 설계

Stop storing your GitHub App private key in GitHub Secrets

konippi2026년 4월 9일8intermediate

Context

GitHub Secrets는 Private Key의 '사용'과 '읽기' 권한을 분리하지 못하는 구조. 러너 메모리에 평문 키가 로드되어 워크플로 수정 권한이 있는 사용자나 악성 Action에 의한 키 유출 위험 상존. supply chain 공격을 통해 권한이 탈취될 경우 모든 권한을 가진 마스터 키가 영구적으로 노출되는 한계.

Technical Solution

  • Private Key를 GitHub Secrets 대신 AWS KMS 내부에 저장하여 외부 유출 경로를 원천 차단하는 구조
  • @octokit/auth-app의 createJwt 옵션에 AWS KMS Sign API를 호출하는 커스텀 함수를 주입하여 원격 서명 방식 구현
  • 평문 키를 러너 메모리에 올리지 않고 KMS HSM 내부에서만 암호화 연산을 수행하는 Sign-only 원칙 적용
  • OIDC 기반의 aws-actions/configure-aws-credentials를 통해 임시 자격 증명을 획득하여 KMS 접근 권한 제어
  • Job 완료 후 post step에서 installation access token을 즉시 폐기하여 토큰 유효 기간을 최소화하는 전략
  • FIPS 140-3 Security Level 3 검증 HSM을 사용하여 AWS 운영자조차 평문 키에 접근할 수 없는 하드웨어 보안 계층 활용

Key Takeaway

민감한 자격 증명 관리 시 '값의 전달'이 아닌 '기능의 위임'으로 설계하여 공격 표면을 최소화하는 Zero Trust 원칙의 중요성.


GitHub App Private Key와 같이 만료 기간이 없고 권한이 높은 마스터 키는 KMS/Vault의 Sign-only 기능을 통해 러너에 평문이 노출되지 않도록 설계할 것

원문 읽기