← 전체 기능

설치·운영v0.3.0에서 사용 가능

보안: 비밀값은 어디에도 넣지 않는다

철칙은 API 키, 토큰, 비밀번호, 쿠키, OAuth 시크릿, 계정 식별자를 저장소와 그 이력, 릴리스, 이슈, CI 로그 어디에도 넣지 않는 것이다. 키는 실행할 때만 읽고, 템플릿은 ${ENV_VAR} 자리표시자만 쓰며, gitleaks와 개인정보 스캔이 push 전마다 그리고 CI에서 전체 이력을 검사한다.

필요한 상황

AI 에이전트는 많은 파일을 빠르게 읽고 쓰므로, 붙여 넣은 키 하나가 누가 알아채기 전에 커밋, 지시문, 로그로 퍼질 수 있다.

동작 방식

  1. 키는 문서에 적힌 하나의 조회 경로로 환경 변수나 OS 키체인에서만 가져온다. 키가 없으면 기능은 unused(no key)로 꺼진 채로 있다.
  2. 템플릿과 문서는 ${TYPESAFE_API_KEY} 같은 자리표시자만 쓰고 값은 쓰지 않는다.
  3. oah init이 로컬 비밀 파일을 .gitignore에 넣고, 선택형 pre-push 훅이 push할 커밋을 검사하며, oah land는 gitleaks 검사 없이는 거절한다.
  4. oah 저장소 자체에서는 gitleaks와 개인정보 스캔이 push 전마다, 그리고 CI에서 모든 pull request와 push마다 전체 이력을 검사하고, 하나라도 찾으면 빌드가 실패한다.

예제

oah 기여자가 push 전마다 실행하는 개인정보 스캔. `PRIVACY_SCAN_CLEAN`을 출력해야 한다.

python3 tools/privacy_scan.py --gitleaks require

요구 사항

  • 검사와 반영에는 gitleaks가 필요하다.

한계와 복구

  • 커밋, push, 로그에 닿은 키는 1분 뒤에 지워도 노출된 것이다. 먼저 키를 바꾼다.
  • CI 스타터의 비밀 검사는 찾은 내용의 주변 문맥을 출력하지 않고 보고서도 쓰지 않으므로, 실패는 보이지만 값은 보이지 않는다.
  • CI 예외 사유에는 비밀을 넣지 않는다. 문서는 비밀이 아닌 사유를 쓰라고 한다.

원문 문서

관련 기능