깃허브에 실수로 개인정보를 커밋했다면? BFG 사용하기!

sanghyunna·2023년 2월 23일
0

CAUnotify

목록 보기
3/3
post-thumbnail

나 같은 개발 초보라면 비슷한 경험이 있을 수 있었으리라 생각한다.

첫 개발하던 프로젝트에서는 AWS IAM 개인키를 실수로 깃허브에 올려 이런 무서운 메일도 받아봤다..

이 때의 대참사 이후 깃허브에 업로드하는 내용을 꽤 조심하고 있다고 생각하며 사용했지만, 최근 멋쟁이사자처럼에 지원하려고 깃허브를 돌아보다가 이상한 점을 발견했다.

내가 운영 중인 서비스의 깃 리포의 유저DB에 유저 데이터가 전부 공개 되고 있었던 것..

.gitignore 에 추가 했어야 했는데 까먹은 것 같다..

문제는 이제 와서 지우고 커밋하기에는 이미 리포 히스토리에 해당 파일들을 쓰고 지운 내역이 다 남아 있어서, 자칫 누가 살펴보기라도 한다면 개인정보를 확인할 수 있었을 것이다.

따라서 리포 히스토리를 전부 지우기 위해 BFG 라는 툴을 활용했다.

본론

리포의 히스토리를 관리하는 툴에는 두 가지가 있다.
하나는 깃허브에서 공식적으로 제공하는 방법인 git filter-repo이다.
다른 하나는 위의 툴을 대체하기 위해 유저 커뮤니티에서 제작한 BFG Repo-Cleaner 이다.

이 포스트는 내가 사용한 BFG Repo-Cleaner 를 활용해 문제를 해결한 기록이다.

(이 포스트의 내용은 깃허브 공식 문서 의 내용을 참고했습니다.)

설치

먼저 링크를 통해 해당 툴을 내려받는다.

이 때, 수정할 리포를 새로 clone 해야 하는 것을 고려해, 새 디렉토리를 만들어 저장하는 것을 추천한다.

나는 CAUnotify 서비스의 문제를 해결하려 했기 때문에 새로 clone하기 위해 cloneOfCaunotify라는 디렉토리를 만들어 bfg-1.14.0.jar를 내려받았다.

다음, BFG의 prerequisite인 자바 런타임을 설치한다.

이제 (윈도우 기준 )powershell이나 cmd를 켜고 새로 만든 디렉토리로 찾아가 준다. 내 경우 C:\dev\cloneOfCaunotify 였다.

사용

git clone --mirror {자기 리포의 https 주소}를 입력하여 새 디렉토리에 클론해준다.

--mirror 옵션을 주어 클론하면 재미있는 것을 볼 수 있는데,

자기 리포의 내용이 아닌 전혀 생뚱맞은 내용이 클론 된 것이다.

이는 사실 'bare repo' 라고 하는데, 리포지토리가 실제로 깃허브에 저장된 그대로를 가져온 것이라, 우리가 저장한 그대로의 내용이 아니다.

과거 커밋 기록을 삭제하기 위해서는 'bare repo'가 필요하다.

cd {자기 리포 디렉토리 이름} 를 통해 자기 리포로 이동한 후, 명령어를 입력해 작업을 수행한다.


내 경우, userDB_log이라는 폴더에 저장된 모든 파일의 기록을 지우는 것이 목적이였기 때문에, 해당 폴더의 기록만을 지우도록 BFG 명령에 --delete-folders 옵션을 추가해 주었다.

BFG에서 제공하는 옵션은 다음과 같다:
--delete-folders {폴더이름} {리포 디렉토리.git}: 해당 폴더를 모든 커밋 기록에서 삭제한다.
--delete-files {파일이름} {리포 디렉토리.git}: 해당 파일을 모든 커밋 기록에서 삭제한다.
--replace-text {비밀번호.txt} {리포 디렉토리.git}: 리포 내에서, {비밀번호.txt}에서 주어진 모든 비밀번호를 검색해 ***REMOVED***로 대체한다.
--strip-blobs-bigger-than {크기} {리포 디렉토리.git}: {크기} 이상의 모든 blob을 삭제한다.

  • 리포 디렉토리를 전달하지 않은 경우, 현재 있는 리포를 기준으로 동작함.

이 이외에도 몇가지 옵션이 더 있지만, 가장 많이 쓰일 것은 위의 내용들이다.'

명령어 실행이 완료되었다면,

터미널에서 제공된 해당 명령들을 수행해주고, git push 해주어 깃에 반영해준다.

이제 실제 깃허브에 들어가서 살펴보면 말끔히 사라져 있고, 기록조차 조회되지 않는다!

위의 커밋은 유저DB를 push했던 내용이 담겨 있던 커밋 기록인데, 커밋 사실만 남아있고 모든 내용이 제거되었음을 확인할 수 있다.

유의점

.gitignore 에 추가하기

사실 BFG 툴을 사용하는 대부분의 이유는 깃허브에 공개해서는 안될 파일이나 내용을 실수로 공개했기 때문일 것이다.

따라서 이러한 일이 다시 발생하지 않도록, 반드시 .gitignore 파일에 추가하도록 하자!

백업하기

처음 사용하는 툴인만큼, 완벽하게 다룰 것이라 보장할 수 없을 것이다.
더구나 리포의 내용을 일괄적으로 삭제하는 굉장히 강력한 툴이므로, 반드시 작업 수행 전 백업해두어 불상사에 대비해야 한다.

트러블슈팅

전부 실행했는데, 제대로 삭제되지 않았을 경우

BFG는 기본적으로 과거 커밋 기록을 조작하는 툴이다. 즉, 가장 최근의 커밋은 프로젝트의 배포판인 경우가 많으므로, 최근 커밋에 포함된 파일은 수정하거나 삭제하지 않는다.
이런 경우는 프롬프트 메시지를 보면 알 수 있다.

명령을 실행했을 때 위와 같이 Protected commits 이 발생했다면, 이는 가장 최근 커밋에 존재하는 파일이라 수정하지 않았음을 의미한다.

이를 해결하기 위해서는 삭제하고자 하는 파일을 포함하지 않는 새로운 커밋을 푸시하여 보호 대상에서 제외해야 한다.

profile
wannabe dev

0개의 댓글