Gitleaks 적용 방안Gitleaks 적용 방안

Gitleaks 적용 방안

생성 일시
Sep 20, 2026 04:42 AM
최종 편집 일시
Last updated September 20, 2026
태그
Infra
GitHub Actions
작성자
@오병은
Date

Public 전환에 맞춘 1번(Push Protection) + 3번(gitleaks CI) 적용 방안

0. 다시 짚는 배경

이 솔루션 조사 자체가 시작된 이유는 팀 IaC 레포(kintoun-infra)를 포트폴리오용으로 public 전환하려던 계획 때문이었다.
즉 이번 조사의 목적은 "private 상태에서 계속 쓸 보안 도구"가 아니라, "public 전환을 안전하게 만들기 위한 자동화". 이 관점으로 정리했다.
저번 글에서는 팀 IaC(Infrastructure as Code) 레포에 시크릿이 실수로 커밋되는 것을 막기 위해, push/commit 시점에 시크릿을 자동으로 감지·차단하는 자동화 솔루션을 조사했다. 컴플라이언스 팀에서는 이 내용을 바탕으로 자료 조사를 나눠 진행했고, 우리 Organization 환경에서 이 방안들이 실제로 적용 가능한지 확인하는 과정을 중점적으로 정리했다. 

1. 현재 레포 환경 분석

항목
현재 상태
저장소
kintoun-secops/kintoun-infra, 현재 Private → Public 전환 예정
구조
bootstrap/(원격 state·OIDC), identity/(팀원 IAM), platform/(네트워크·EC2·Wazuh), modules/(재사용 모듈, 현재 비어있음), .github/(워크플로우·정책·스크립트)
인증 방식
장기 Access Key 미사용, aws-actions/configure-aws-credentials@v4 + OIDC(role-to-assume)
기존 CI (.github/workflows/)
terraform-plan.yml(PR 시 lint→plan→iam-comment), terraform-apply.yml(main push 시 apply)
기존 자동 검사
terraform fmt, conftest(OPA 정책 검증), IAM 정책 커스텀 검사 스크립트(validate-iam-policies.js, test-iam-pipeline.sh 등)
.gitignore
*.tfstate, .terraform/, *.tfvars(example 제외), tfplan 등 이미 제외 처리
기존 검토 결과
파일·코드 수준 민감정보는 없음 확인됨. 단, Actions 로그 ARN 노출과 git 히스토리 전체 스캔, 2가지는 미확인 상태로 남아있었음
정리: 지금 레포는 이미 상당히 안전하게 설계돼 있지만, public 전환 전 마지막으로 "사람이 놓쳤을 수 있는 부분"을 자동화로 한 번 더 걸러내는 안전장치가 필요한 단계.

2. Public 전환을 기준으로 순서를 다시 짜면

Public 전환이라는 하나의 이벤트를 기준으로 두 솔루션의 역할이 나뉨.
솔루션
역할
적용 시점
3번 (gitleaks CI)
전환 전 마지막 안전 점검 + 전환 후에도 계속 작동하는 상시 방어선
지금 바로 적용
1번 (GitHub Secret Scanning + Push Protection)
전환과 동시에 무료로 자동 활성화되는 GitHub 자체 방어선
Public 전환 시점에 함께
즉 순서가 자연스럽게 이렇게 나옴: 먼저 gitleaks로 지금 상태를 한번 훑고(과거 커밋 포함) → 문제 없으면 public 전환 → 전환되는 순간 1번이 무료로 같이 켜짐.

3. 3번: gitleaks — Public 전환 전 지금 바로 적용

왜 지금 먼저 해야 하는가

Public 전환 전에 git 히스토리 전체(지금까지 쌓인 모든 커밋)를 한 번 스캔해서, 과거에 실수로 커밋했다 지운 값이 없는지 마지막으로 확인하는 역할. 이게 이번 조사의 원래 목적("확인 불가"로 남았던 히스토리 스캔)과 정확히 맞아떨어짐.

3-1. 사전 준비

  1. gitleaks.io 접속 → Organization 소유 레포용 무료 라이선스 키 신청
  1. 발급받은 키를 레포 Settings > Secrets and variables > Actions > Secrets 탭에 GITLEAKS_LICENSE라는 이름으로 등록

3-2. 정확한 삽입 위치

현재 terraform-plan.yml의 lint job:
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: hashicorp/setup-terraform@v3 - run: terraform fmt -check -recursive - name: conftest 설치 run: | curl -sSFL -o /tmp/conftest.tar.gz ... - name: 정책 테스트 run: conftest verify --policy .github/policy ...
actions/checkout@v4 바로 다음에 이렇게 추가:
- uses: actions/checkout@v4 with: fetch-depth: 0 # 전체 git 히스토리를 받아야 gitleaks가 과거 커밋까지 스캔 가능 - name: 시크릿 스캔 (gitleaks) uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }} - uses: hashicorp/setup-terraform@v3 - run: terraform fmt -check -recursive ...
놓치기 쉬운 디테일: actions/checkout@v4는 기본값이 얕은 클론(최신 커밋 1개)이라, fetch-depth: 0을 꼭 줘야 과거 커밋까지 스캔됨. 이 옵션이 바로 "히스토리 전체 스캔"을 실현하는 핵심.

3-3. Public 전환 이후에도 남겨둔다

전환 후에도 이 스텝은 그대로 유지 — 이후 팀원이 실수로 시크릿을 커밋해도 PR 단계에서 바로 막아주는 상시 방어선이 됨. conftest(정책 위반 검사)와는 역할이 다르므로 중복 아님.

4. 1번: GitHub Secret Scanning + Push Protection — Public 전환과 동시 적용

핵심: Public 전환이 곧 무료 활성화 조건

저장소 공개 여부
Secret Scanning
Push Protection
비용
Private (현재)
GitHub Secret Protection 필요
위와 동일
유료 (Active committer당 과금)
Public (전환 후)
자동 활성화
자동 활성화
무료
즉 우리가 이미 하려던 public 전환 자체가, 1번을 별도 결제 없이 얻는 방법임. 순서를 반대로 생각하면 안 되고, "gitleaks로 먼저 점검 → 전환 → 전환하자마자 1번이 공짜로 따라온다"는 흐름이 맞음.

확인만 해두면 되는 것

전환 직후 레포 Settings > Code security에서 Secret scanning / Push protection이 자동으로 "Enabled" 상태인지 한 번 확인. 혹시 조직 정책상 기본 비활성이면 관리자가 수동으로 켜야 함(설정 몇 번 클릭이면 끝).

5. 별개로 남아있는 이슈 — gitleaks로도 안 잡히는 부분

기존에 확인했던 "AWS_APPLY_ROLE_ARN이 Variables라 Actions 로그에 평문 노출" 문제는 gitleaks·Secret Scanning 둘 다 해결 못 함.
  • gitleaks·Secret Scanning이 보는 대상: git 커밋 안의 코드/파일
  • 로그 노출 문제: 워크플로우 실행 시 출력되는 로그 (커밋된 파일이 아님)
Public 전환 시 과거 Actions 실행 로그도 함께 공개되므로, 이건 전환 전에 별도로 vars.AWS_APPLY_ROLE_ARN → secrets.AWS_APPLY_ROLE_ARN으로 옮겨야 함. 이번 자동화 도입과 별개로 반드시 같이 처리해야 하는 체크리스트 항목.

6. 종합 순서 (Public 전환 로드맵)

  1. (지금) gitleaks 라이선스 발급 → Secrets 등록 → terraform-plan.yml에 스텝 추가, fetch-depth: 0으로 전체 히스토리 1차 스캔
  1. (지금, 별개 작업) AWS_APPLY_ROLE_ARN/AWS_PLAN_ROLE_ARN을 Variables → Secrets로 이전 (로그 노출 차단)
  1. (1·2 완료 후) gitleaks 스캔 결과 이상 없음 확인되면 Public 전환 진행
  1. (전환 직후) Settings > Code security에서 Secret Scanning·Push Protection 자동 활성화 여부 확인 — 이걸로 상시 이중 방어선(gitleaks + GitHub 자체 기능) 완성