CampusMeet

[CS] .env 파일 유출 문제와 해결 방안

dong_seok 2024. 8. 28. 18:01
1. 발생 문제
2. 해결 과정
3. 추가 문제 발생 및 해결 과정

 

1. 발생 문제

CampusMeet 프로젝트를 진행하면서 형상관리는 GitHub를 통해 이루어졌고, 저장소는 public으로 관리하고 있었습니다. 개발 도중 GitHub를 확인하던 중, .env 파일이 그대로 저장소에 노출된 것을 발견했습니다. 다행히 초반이었고 파일에는 로컬 DB에 대한 간단한 정보만 담겨 있었지만, 이후에는 API 키나 비밀번호 등 민감한 정보들이 다뤄질 예정이었기 때문에, 이를 미리 해결하기로 했습니다.

 

2. 해결 과정

1 ) .env 파일 제거 및 .gitignore 설정

먼저, .env 파일이 앞으로 푸시되지 않도록 .gitignore 파일에 추가해줍니다.

 

echo ".env" >> .gitignore

 

명령어를 입력하면 .gitignore 파일이 새롭게 만들어지고 그 안에 .env 파일이 추가됩니다. 이제 .env 파일을 제거하도록 하겠습니다.

 

git rm --cached .env

 

 

'git rm --cached .env' 명령어는 .env 파일을 Git의 추적 목록에서만 제거하고, 실제 파일 시스템에서는 삭제하지 않습니다. 즉, 로컬 디렉토리에는 .env 파일이 그대로 남아있어 파일 내용을 확인하거나 수정할 수 있지만, Git에서는 더 이상 추적되지 않게 됩니다.

 

2 ) 커밋 기록 삭제

커밋을 아직 push하지 않았다면 위의 방법만으로도 충분히 문제를 해결할 수 있습니다. 그러나 저처럼 이미 commit을 push한 경우, 이후의 commit에서 .env 파일을 제거하더라도 이전 commit 기록에는 .env 파일이 여전히 남아있게 됩니다. 따라서 이전 커밋들에서도 .env 파일을 완전히 삭제해야 합니다. branch를 재작성하는 git-filter-branch 명령으로 이런 작업을 할 수 있지만 사용이 어렵고 속도가 느린 단점이 있기 때문에 BFG를 사용해서 커밋 히스토리를 정리 해보도록 하겠습니다.

 

BFG 는 java로 작성되어서 JRE가 필요하며 아래 명령어를 사용하여 .jar 파일을 다운받아줍니다.

wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar

 

 

--mirror 옵션을 사용해서 로컬에 작업할 Git 저장소를 복제합니다. 이 복제본은 BFG 작업을 수행할 저장소입니다.

git clone --mirror https://github.com/11kkw/hoseo-meet.git

cd hoseo-meet.git

 

'--mirror' 옵션을 사용하면 단순히 clone했을 때와 달리, 저장소의 모든 브랜치와 태그를 포함한 완전한 복제가 이루어집니다. 이로 인해 .git 디렉토리가 생성되는데, 일반적인 clone을 했을 때처럼 개별 파일들이 나타나지 않으니 놀라지 않으셔도 됩니다. 이후 .git 디렉토리로 이동해주시면 됩니다.

 

이제 BFG를 사용하여 .env 파일을 제거해주도록 하겠습니다.

java -jar bfg-1.14.0.jar --delete-files .env

 

위 명령어는 Git 히스토리에서 .env 파일을 제거합니다.

 

 

 

그런데 "Error: Unable to access jarfile bfg-1.14.0.jar"가 발생하였습니다. 찾아보니 이는 앞에서 설치한 .jar 파일을 찾을 수 없을때 발생하는 에러였습니다. 제가 .jar를 루트디렉터리에 설치해서 경로가 잘못 되어서 생긴 에러였습니다. 파일을 옮겨준 후 다시 실행해보았습니다.

 

 

 

정상적으로 실행 된 모습을 볼 수 있습니다. BFG를 실행한 후에는 Git 저장소를 정리하여 파일이 완전히 제거되도록 합니다.

 

git reflog expire --expire=now --all && git gc --prune=now --aggressive

 

이 명령어는 Git의 기록을 정리하고, 삭제된 파일의 흔적을 제거합니다. 마지막으로 원격 저장소에 푸시를 해줍니다.

 

git push --mirror

 

--mirror 옵션은 저장소의 모든 참조를 원격에 동기화합니다. 모든 브랜치와 태그가 원격에 적용되며, .env 파일이 제거된 상태로 저장소가 업데이트됩니다.

 

 

실행이 성공적으로 완료된 모습을 볼 수 있습니다.

 

3. 추가 문제 발생 및 해결 과정

커밋 히스토리에 있는 .env 파일에 대한 기록은 잘 사라졌으니 이제 1번에서 사용했던 .gitignore 설정을 통해 새롭게 push를 해도 .env 파일이 반영되지 않는지 테스트 해봤습니다.

 

 

git을 사용한다면 흔히 발생하는 오류인데 오늘 글을 적은김에 한번 정리하고 넘어가야겠다고 느껴서 내용을 추가하였습니다.

해당 오류는 로컬 브랜치(feat_cicd)의 커밋이 원격 브랜치보다 오래된 경우에 발생합니다. 이는 원격 브랜치에 로컬 브랜치에 없는 새로운 커밋이 있어, 단순히 푸시하는 것이 허용되지 않기 때문입니다. 이 상황을 해결하려면 원격 브랜치의 변경 사항을 로컬 브랜치에 통합해야 합니다. 'git pull'로 간단하게 병합하는 방법과 'git rebase'로 변경 사항 통합하는 두가지 방법이 있는데 'git pull'은 기존에 써보기도 했고 'git rebase'가 커밋 로그를 깔끔하게 유지하는 데 좋다고 해서 새로운 방법을 시도해 보기로했습니다.

 

먼저 원격 저장소의 최신 변경 사항을 가져옵니다.

git fetch origin

 

그 후 로컬 브랜치의 커밋을 원격 브랜치의 최신 커밋 위로 재배치합니다.

 

git rebase origin/feat_cicd

 

여기서 에러가 길게 출력 되었습니다.

 

 

위 오류는 이전에 처리한 .env 파일과 관련된 문제로 발생한 것 입니다. git rebase를 실행할 때 .env와 같은 untracked 파일이 작업 디렉토리에 남아 있어서 충돌이 발생한 것입니다. 일반적으로 .env 파일은 로컬에 존재해도 git push 작업에 영향을 주지 않지만, git rebase와 같은 특정 Git 작업을 수행할 때는 untracked 파일(예: .env)이 충돌을 일으킬 수 있습니다. 이럴 때는 .env 파일을 잠시 다른 곳으로 옮기거나 삭제하는 것이 좋습니다. 실제로 .env 파일을 다른 위치로 이동한 후 push를 시도하니 정상적으로 완료되었습니다.

 

Rebase 작업중 오류가 복잡해지거나 충돌이 계속 발생할 경우 Rebase 중지 및 복원도 가능합니다.

git rebase --abort

 

위 명령어로 현재 rebase를 중지하고 원래 상태로 복원합니다.

 

위의 과정을 통해 .env 파일을 .gitignore에 추가하여 Git에서 관리되지 않도록 설정했습니다. 또한, 커밋 히스토리에서 .env 파일과 관련된 모든 내용을 삭제하여 이전 기록에서도 해당 파일이 완전히 제거되도록 처리했습니다.

'CampusMeet' 카테고리의 다른 글

[DNS] Nginx ingress controller 와 Domain  (0) 2024.09.15
[NKS] NKS를 활용한 배포 (1)  (0) 2024.09.08
[Backend] FastAPI  (0) 2024.08.14
[Crawling] Crawling 을 통한 데이터 수집  (2) 2024.08.11