← 저널

시크릿을 노출하지 않고 주고받기

"API 키, 데이터베이스 접속 정보, 인증서. 팀·외주·고객 사이에서 시크릿을 전달하되, 3년 뒤 히스토리에서 발견되지 않게 하는 실천법."

보안시크릿 관리팀 프랙티스컴플라이언스

가장 잘 전달된 시크릿은 전달하지 않은 시크릿이다

모든 프로젝트는 같은 의식으로 시작합니다. "접속 정보 좀 보내줄래요?". 그리고 모든 팀은 즉흥적으로, 대개 잘못된 답을 냅니다. 이메일에 적힌 비밀번호, Slack 채널에 붙여넣은 API 키, 첨부파일로 보낸 .env. 그 순간 시크릿은 모든 통제 범위를 영원히 벗어났습니다.

더 나은 채널을 찾기 전에 본질적인 질문을 던져야 합니다. 이 시크릿이 이런 형태로 존재해야만 하는가? 연합 신원 메커니즘(CI와 클라우드 간 OIDC, IAM 역할, 워크로드 아이덴티티)은 정적 시크릿을 수명이 짧은 신원 증명으로 대체합니다. 전달할 키도, 유출될 키도, 로테이션할 키도 없습니다. 이 선택지가 있다면 언제나 그것이 이깁니다. 이 글의 나머지는 정말로 사람 사이를 오가야 하는 시크릿만 다룹니다.

처음부터 탈락인 채널들

몇몇 채널은 논쟁의 여지 없이 탈락입니다.

  • 이메일. 아무도 통제하지 않는 서버에 복제되고, 색인되고, 보관되고, 전달된다.
  • 팀 메신저. 히스토리를 관리자가 읽을 수 있고, 마이그레이션 때 내보내지며, 구성원이 떠난 뒤에도 오래 남는다.
  • 티켓과 공유 문서. 프로젝트보다 오래 살아남아 3년 뒤 전문 검색에서 다시 떠오른다.
  • SMS와 개인 메신저. 사적 영역과 업무 영역을 뒤섞는다.

공통점은 통제되지 않는 영속성입니다. 허용 가능한 채널은 정확히 그 반대, 즉 종단 간 암호화와 소멸을 보장합니다.

단순한 것부터 갖춰진 것까지, 효과 있는 방법

일회성 전달이라면 감사 가능한 도구가 생성한, 한 번 쓰고 수명이 짧은 링크로 충분합니다. 수신자가 열면 시크릿은 사라집니다. 수신 확인은 두 번째 채널(전화, 메시지)로 하며, 올바른 사람이 링크를 사용했는지도 함께 확인됩니다.

지속적인 협업에는 일회성 전달로는 부족하고 공유 공간이 필요합니다. 범위별 금고를 갖춘 팀 비밀번호 관리자가 가장 접근하기 쉬운 방안이고, 인프라가 정당화된다면 접근 로그와 역할 기반 정책을 갖춘 중앙형 시크릿 관리자가 적절해집니다. 선택 기준은 둘 다 같습니다. 누가 무엇에 접근했는지 알 수 있는가, 그리고 접근을 한 번의 동작으로 회수할 수 있는가?

받는 사람공유 금고보내는 사람받는 사람공유 금고보내는 사람구성원이 떠나면 한 번의 동작으로 회수프로젝트 금고에 시크릿을 보관접근 기록다른 채널로 알림 (메시지에 시크릿 없음)인증 후 시크릿 열람접근 기록

반복할 가치가 있습니다. 알림 메시지에는 절대 시크릿을 담지 않습니다. 어디서 가져갈 수 있는지만 알려주고, 받는 사람은 자기 권한으로 가져갑니다.

최소 권한은 피해망상이 아니라 예산이다

전달된 모든 시크릿은 부채입니다. 누군가 기억하고, 로테이션하고, 회수해야 합니다. 이 부채는 근원에서 줄입니다.

  • 환경별 시크릿. 스테이징과 프로덕션에서 같은 토큰을 쓰지 않는다.
  • 사람·서비스별 시크릿. 아무도 책임지지 않는 공용 "team" 계정을 만들지 않는다.
  • 최소 범위. 읽기 전용 용도에는 읽기 전용 키를.
  • 기본적으로 짧은 수명. 만료는 최고의 로테이션입니다.

Git 히스토리는 절대 잊지 않는다

가장 흔한 유출은 어떤 전달 채널도 거치지 않습니다. 커밋됩니다. "임시로" 추가된 .env, 설정 파일의 접속 URL, 테스트 안의 키. 히스토리는 영원한 분산 메모리이고, 모든 클론이 사본을 가져갑니다.

방어는 겹겹이 쌓습니다. 환경 파일에 대한 엄격한 .gitignore. 공개 전에 차단하는 pre-commit과 CI의 시크릿 스캐너. 그리고 그럼에도 시크릿이 히스토리에 도달한 날의 절대 규칙. 삭제로는 결코 충분하지 않으며, 그 시크릿은 침해된 것으로 간주하고 즉시 로테이션합니다. 히스토리 재작성은 미래의 노출을 줄일 뿐, 유출을 되돌리지 못합니다.

나가는 길도 전달의 일부다

시크릿 전달 프로세스는 오프보딩으로 평가됩니다. 팀원의 퇴사, 계약 종료, 외주 해지는 같은 절차를 발동합니다. 개인 접근 권한을 회수하고, 그 사람이 읽을 수 있던 공유 시크릿을 로테이션하고, 로그를 확인합니다. 이 목록을 만드는 일이 고통스럽다면, 시크릿이 목록 없이 배포되었다는 뜻입니다. 그리고 그 목록이야말로 금고가 공짜로 제공하는 것입니다.

우리가 적용하는 체크리스트

  • 이 시크릿을 수명이 짧은 신원으로 대체할 수 있는가? 가능하면 대체한다.
  • 이메일·채팅·티켓·문서에 평문 시크릿을 두지 않는다.
  • 일회성 전달: 일회용 링크, 다른 채널의 알림.
  • 지속적 협업: 공유 금고, 역할 기반 접근, 로그.
  • 환경별·사람별 하나씩, 범위와 수명은 최소로.
  • pre-commit과 CI에 시크릿 스캐너.
  • 히스토리에 들어간 시크릿 = 침해된 시크릿. 즉시 로테이션.
  • 대본화된 오프보딩: 회수, 로테이션, 로그 확인.

이 중 비싼 것은 없습니다. 비싼 것은 프로젝트가 끝나고 2년이 지나도 여전히 프로덕션을 열 수 있는, Slack에 잊힌 토큰 쪽입니다.