튜토리얼: 커밋에서 시크릿 제거하기
GitLab v19.5요약
애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다.
애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 시크릿이 원격 리포지터리에 푸시되면 해당 리포지터리에 접근할 수 있는 누구나 사용자나 애플리케이션을 사칭할 수 있습니다. 실수로 시크릿을 커밋했더라도 푸시하기 전이라면 제거할 수 있습니다.
이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다. 시크릿이 리포지터리에 푸시된 경우의 대처 방법도 함께 다룹니다.
이 튜토리얼은 GitLab Unfiltered 영상 Remove a secret from your commits를 바탕으로 작성되었습니다.
시작하기 전에#
이 튜토리얼을 진행하기 전에 다음을 준비합니다.
- 테스트 프로젝트. 원하는 프로젝트를 사용해도 되지만, 이 튜토리얼 전용 테스트 프로젝트를 만드는 방법을 권장합니다.
- 명령줄 Git에 대한 기본적인 이해.
시크릿 커밋#
GitLab은 문자, 숫자, 기호의 특정 패턴을 대조해 시크릿을 식별합니다. 이 패턴은
시크릿의 유형을 식별하는 데도 사용됩니다. 예를 들어 가짜 시크릿 glpat-12345678901234567890
은 glpat- 문자열로 시작하므로 개인 액세스 토큰입니다.
많은 시크릿을 형식으로 식별할 수 있지만, 리포지터리에서 작업하다 보면 시크릿을 실수로 커밋할 수 있습니다. 시크릿을 실수로 커밋하는 상황을 재현합니다.
-
테스트 리포지터리에서 새 브랜치를 체크아웃합니다.
git checkout -b secret-tutorial -
다음 내용으로 새 텍스트 파일을 만듭니다. 개인 액세스 토큰의 형식과 정확히 일치하도록
-앞뒤의 공백은 제거합니다.fake-secret: glpat - 12345678901234567890 message: hello, world! -
파일을 브랜치에 커밋합니다.
git add . git commit -m "Add fake secret"
여기서 문제가 발생합니다. 변경 사항이 푸시되면 텍스트 파일에 든 개인 액세스 토큰이 유출됩니다. 계속 진행하려면 커밋 히스토리에서 시크릿을 제거해야 합니다.
히스토리에서 시크릿 제거#
시크릿이 포함된 커밋이 Git 히스토리의 가장 최근 커밋뿐이라면, 히스토리를 수정해 시크릿을 제거할 수 있습니다.
-
텍스트 파일을 열고 가짜 시크릿을 제거합니다.
fake-secret: message: hello, world! -
변경 사항으로 이전 커밋을 덮어씁니다.
git add . git commit --amend -
변경 사항을 원격 브랜치에 푸시합니다.
git push --force-with-lease커밋 히스토리를 다시 작성했으므로 일반
git push는 실패합니다.--force-with-lease플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.
파일과 커밋 히스토리에서 시크릿이 제거되었습니다.
여러 커밋 수정#
시크릿을 추가한 뒤 커밋을 몇 번 더 하고 나서야 이를 알아차리는 경우도 있습니다. 이때는 가장 최근 커밋에서 시크릿을 지우는 것만으로 충분하지 않습니다. 시크릿이 추가된 이후의 모든 커밋을 수정해야 합니다.
-
파일에 가짜 시크릿을 추가하고 브랜치에 커밋합니다.
-
커밋을 최소 한 번 더 수행합니다. 히스토리를 확인하면 다음과 같이 표시됩니다.
$ git log commit 456def Do other things commit 123abc Add fake secret ...커밋
456def에서 시크릿을 제거하더라도 히스토리에는 그대로 남아 있으므로, 지금 변경 사항을 푸시하면 시크릿이 노출됩니다. -
히스토리를 바로잡으려면 시크릿이 추가된 커밋부터 대화형 리베이스를 시작합니다.
git rebase -i 123abc~1 -
편집 창에서 시크릿이 포함된 모든 커밋의
pick을edit로 변경합니다.edit 456def Do other things edit 123abc Add fake secret -
텍스트 파일을 열고 가짜 시크릿을 제거합니다.
-
변경 사항을 커밋합니다.
git add . git commit --amend -
선택 사항. 시크릿을 지우면 해당 커밋의 유일한 diff가 사라질 수 있습니다. 이 경우 Git은 다음 메시지를 표시합니다.
No changes You asked to amend the most recent commit, but doing so would make it empty.빈 커밋을 제거합니다.
git reset HEAD^ -
리베이스를 계속합니다.
git rebase --continue -
다음 커밋에서 시크릿을 제거하고 리베이스를 계속합니다. 리베이스가 끝날 때까지 이 과정을 반복합니다.
Successfully rebased and updated refs/heads/secret-tutorial -
변경 사항을 원격 브랜치에 푸시합니다.
git push --force-with-lease커밋 히스토리를 다시 작성했으므로 일반
git push는 실패합니다.--force-with-lease플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.
커밋 히스토리에서 시크릿이 제거되었습니다.
시크릿을 푸시했을 때 해야 할 일#
변경 사항에 시크릿이 들어 있다는 사실을 알아차리기 전에 푸시하는 경우가 있습니다. 프로젝트에 시크릿 푸시 보호가 활성화되어 있으면 푸시가 자동으로 차단되고 문제가 된 커밋이 표시됩니다.
그러나 시크릿이 원격 리포지터리에 푸시되었다면 그 시크릿은 더 이상 안전하지 않으므로 즉시 폐기해야 합니다. 해당 시크릿에 접근할 수 있는 사람이 많지 않다고 판단되더라도 반드시 교체합니다. 노출된 시크릿은 상당한 보안 위험입니다.
다음 단계#
애플리케이션 보안을 강화하려면 프로젝트에서 시크릿 탐지 방식 중 최소한 하나를 활성화하는 방안을 검토합니다.