교훈 먼저 - secret 값 관리는 무조건 처음부터 잘하자😂😓
동아리에서 시작한 프로젝트를 이어서 빌드업 + 리팩토링 해보는 과정에 들어갔다.
얼마 전, 같은 백엔드 파트를 맡은 언니와 만나 얘기를 하던 중 우리의 repository를 public으로 돌리려고 했는데 생각해보니 우리가 전에 미래 걱정 없이 올렸던 secret 값들이 있었던 것..
커밋 내역에 그대로 남아있는 민감한 비밀 값들을 어떻게 가릴 것인지
고민하면서 겪은 시행착오와 경험을 남기려 한다.
우리가 결국 사용한 해결방법이다.
삭제든 수정이든 시크릿이 포함되어있던 파일 경로를 먼저 알아내야 한다.
우선 git log -S [노출된 시크릿 값]
으로 찾고자 하는 시크릿 값이 포함된 커밋 내역을 검색한다.
이후 git log -S "[노출된 시크릿 값]" [브랜치 이름] --name-only --pretty=format: | sort -u
명령어로 해당 시크릿 값이 어떤 파일에 포함되어 있었는지 확인한다.
과거 커밋에서 특정 내용이 포함된 파일 삭제
git filter-branch --index-filter \
'git rm -rf --cached --ignore-unmatch path_to_file' HEAD
git push --all
다만 이 커맨드를 입력하면 커밋에서도 삭제가 되지만 로컬에서도 삭제가 될 수 있기 때문에, 로컬에서의 삭제 또한 의도하지 않는다면 커맨드를 입력하기에 앞서 백업은 필수다.
과거 커밋 내용 수정
git filter-branch -f --tree-filter "if [ -f [파일 이름] ]; then sed -i s/[노출된 시크릿 값]/[바꾸고자 하는 값]/g [파일 이름];fi"
을 입력해 커밋 내역에서 노출되었던 시크릿 값들을 전부 특정 값으로 바꿔준다.
예를 들어 파일 이름(경로)이 settings/prod.py 이고 노출된 시크릿 값이 12345 인데 이를 @@@@@로 바꾸고 싶다면
git filter-branch -f --tree-filter "if [ -f settings/prod.py ]; then sed -i s/12345/@@@@@/g settings/prod.py;fi"
라고 입력하면 된다.
커밋에 올라가있던 시크릿 값을 * 6개로 바꾼 결과
++ 참고 : git filter-branch 명령 되돌리기
출처 - https://ndb796.tistory.com/273
git filter-branch 명령은 프로젝트의 특정 내용을 전부 바꿀 수 있기 때문에 주의해서 사용해야 한다고 한다. filter-branch를 사용하기 전에는 git 프로젝트를 다시 clone 받아놓거나 어떤 방식으로든 백업해놓자!! 조심해서 나쁠 건 없다ㅎㅎ
git filter-branch 명령을 사용하면 깃 프로그램을 자동으로 백업을 수행해준다.
master 브랜치에서 명령을 수행한 경우 백업 파일 생성 경로:
.git/refs/original/refs/heads/master
백업본으로 되돌리는 커맨드:
git reset --hard refs/original/refs/heads/master
macos에서는 sed 사용이 달라서 아래 처럼 수정해야해요. 참고해주세요!
git filter-branch -f --tree-filter "if [ -f [파일 이름] ]; then sed -i \"\" s/[노출된 시크릿 값]/[바꾸고자 하는 값]/g [파일 이름];fi"