BFG Repo Cleaner 시도 배경
개발을 진행하던 도중 Github Commit에 API Key가 그대로 노출시켜 버리는 상황이 발생했습니다.
Access Key 및 Seceret Key가 노출된 상황이므로 대처가 필요했습니다.
Git Command를 사용하여 히스토리를 제거하는 방법이 존재하지만, 이후 작업한 히스토리가 꽤 많이 쌓여 있었기 때문에 히스토리 손실에 대한 부담으로 해당 방법을 사용하기 조심스러웠습니다.
해당 문제를 해결하기 위한 다른 방법을 찾던 도중 BFG Repo Cleaner라는 방법을 찾게 되어 시도하였습니다.
BFG Repo Cleaner 설치
- brew를 통한 설치
% brew install bfg
BFG Repo Cleaner를 사용한 특정 값 Remove 방법
1. 노출된 키 확인
- API키를 노출 시킨 상태로 Commit 및 Push 한 상황을 연출하였습니다.
- 커밋 기록 확인(커밋 히스토리가 넘어가버린 상황도 함께 연출)
- 여러 커밋에 걸쳐 해당 키가 노출되는 것을 연출하였습니다.
- 노출된 커밋 목록
총 3곳에 노출되어 있으며, 노출된 키를 숨기려 했던 커밋에서도 Key가 노출된 것을 확인할 수 있었습니다.
2. 히스토리 삭제 작업 시작
1. 백업을 위한 저장소를 먼저 복제 합니다. (테스트하면서 원본을 해칠 위험이 있으므로..)
git clone --mirror <https://github.com/chordpli/BFG_repo_test.git>
git clone --mirror [repo]
2. 해당 브랜치로 checkout합니다. (현재는 메인 브랜치에서 작업 중이므로 생략하였습니다.)
3. 삭제하려는 내용이 포함되어 있는 txt 파일 생성
- api_key = "1234PassWord1A"를 삭제해야 하므로 1234PassWord1A가 입력된 txt 파일 생성하였습니다.
4. bfg repo-cleaner 실행. --replace 명령어 사용
bfg --replace-text remove.txt
- 완료 메세지 이미지
5. 모든 이전 버전을 만료하고 가비지 수집.
git reflog expire --expire=now --all && git gc --prune=now --aggressive
- 완료 메세지 이미지
6. 변경 사항을 푸시합니다.
git push origin --force main
- 수정을 진행할 브랜치가 무엇인지 확인하고 명령어를 수정해야 합니다. 다른 Branch가 생성되어 수정을 원하는 브랜치로 Merge를 진행할 경우, 커밋이 수정되는 게 아닌 수정된 내용으로 커밋이 하나 더 올라가게 됩니다.
- master를 사용한다면
git push origin --force --all
- master를 사용한다면
- 수정을 진행할 브랜치가 무엇인지 확인하고 명령어를 수정해야 합니다. 다른 Branch가 생성되어 수정을 원하는 브랜치로 Merge를 진행할 경우, 커밋이 수정되는 게 아닌 수정된 내용으로 커밋이 하나 더 올라가게 됩니다.
3. 결과
커밋 히스토리에는 변화가 없으며, 해당 키가 노출된 커밋을 확인하면 api_key = "1234PassWord1A" 였던 값들이 모두 ***REMOVED***로 변경된 것을 확인할 수 있었습니다.
+ 추가: 값 변경(Replace)가 아닌 .py 삭제(Delete) 방법 시도
1. 커밋 내용 중 config.py를 삭제하는 명령어 실행
bfg --delete-files config.py
2. 모든 이전 버전을 만료하고 가비지 수집.
git reflog expire --expire=now --all && git gc --prune=now --aggressive
3. 변경 사항을 푸시합니다.
git push origin --force main
- 수정을 진행할 브랜치가 무엇인지 확인하고 명령어를 수정해야 합니다. 다른 Branch가 생성되어 수정을 원하는 브랜치로 Merge를 진행할 경우, 커밋이 수정되는 게 아닌 수정된 내용으로 커밋이 하나 더 올라가게 됩니다.
- master를 사용한다면
git push origin --force --all
- master를 사용한다면
- 수정을 진행할 브랜치가 무엇인지 확인하고 명령어를 수정해야 합니다. 다른 Branch가 생성되어 수정을 원하는 브랜치로 Merge를 진행할 경우, 커밋이 수정되는 게 아닌 수정된 내용으로 커밋이 하나 더 올라가게 됩니다.
결과
가장 최근에 작업한 config.py를 제외하고 모든 config.py에 대한 파일 자체가 사라지는 것을 확인할 수 있었습니다.
가장 좋은 방법은 실수를 하지 않는 것..
참고
BFG Repo-Cleaner by rtyley
$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re
rtyley.github.io
'Server > ETC.' 카테고리의 다른 글
웹 API 설계 원칙을 통한 REST API 설계 패턴과 실전 사례 (1) | 2024.11.24 |
---|---|
[Github] Code Review (1) | 2023.07.02 |
[Github] Pull Request (0) | 2023.07.02 |
[Github] Issue 생성 (0) | 2023.07.02 |
[Postman] DTO와 File을 동시에 전송하는 법 (1) | 2023.01.27 |