application.yml 관련 트러블 슈팅 : git-filter-repo 를 이용한 application.yml 커밋 내역 지우기

조대훈·2024년 10월 30일
post-thumbnail

0. GitGuardian Mail 수신

진행 하던 프로젝트 back 코드를 public 으로 변경 후 해당 메일을 수신 받았다. 알아보니 git과 직접적인 관련이 없는 독립적인 보안 회사이지만 gitHub, gitLab 등의 공개 저장소를 자동으로 스캔하고, API키나 패스워드 등을 민감한 정보가 노출시에 이를 수집하고 발견된 문제를 당사자에게 메일로 보낸다. 즉 영업 메일이지만 이 경고를 엄중하게 받아들일 필요가 있고 즉각 수정 조치가 필요하다.

1. 문제 및 원인 파악

내 경우에 application.properties 에서 application.yml 변경하는 과정에서 한 번의 커밋을 거치고 추후에 삭제조치 했던 것이 내역이 남아 해당 값들이 노출된 것으로 보였다. 단순히 cache된 파일만 지우면 된다고 안일하게 생각했었다. commit 내역을 보면 고스란히 아래와 같이 코드가 전부 노출 되어있다.

1-1 해당 문제 커밋 내역 확인


omg..

해당 코드 아래로 api 와 aws 와 관련된 모든 값들이 그대로 노출 되어 있었다.

2. 추가로 필요한 조치

2-1 git-filter-repo 설치


git-filter-repo: 이전 commit 내역에 해당하는 파일을 검색하고 지울 툴
git filter-brach 보다 속도와 안정성이 향상된 툴이 git filter-repo 이다.

주의 사항

  • 파일 자체뿐만 아니라 해당 파일과 관련된 모든 커밋 내역이 삭제된다.
  • 삭제는 영구적이며 되돌릴 수 없다.
  • 다른 파일들의 커밋 히스토리는 그대로 유지.
  • 커밋 해시값들이 모두 변경. (히스토리가 재작성되기 때문)
  • 이 작업은 민감한 정보(예: AWS 키)를 커밋 히스토리에서 완전히 제거하고 싶을 때 사용하는 가장 효과적인 방법.
  • 반드시 백업이 사전에 필요
  • 팀프로젝트일 시에 다른 팀원에게 미리 공지 필요
  • 강제 push 후 팀원들은 새 clone 을 받아야 한다.

해당 tool을 이용하려면 python이 필요해서 brew를 이용, 설치 부터 진행했다.

brew install python
python3 -m pip --version
brew install git-filter-repo

brew install git-filter-repo
==> Downloading https://ghcr.io/v2/homebrew/core/git-filter-repo/manifests/2.45.0-2
########################################################################################################################################################################## 100.0%
==> Fetching git-filter-repo
==> Downloading https://ghcr.io/v2/homebrew/core/git-filter-repo/blobs/sha256:8e88f02ddedf105ed6992b99298869d4eae1a521f001663c1cd34fc0adee3b73
########################################################################################################################################################################## 100.0%
==> Pouring git-filter-repo--2.45.0.all.bottle.2.tar.gz
🍺  /opt/homebrew/Cellar/git-filter-repo/2.45.0: 9 files, 294KB
==> Running `brew cleanup git-filter-repo`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

git filter-repo --version
설치가 완료된 모습

해당하는 파일을 제외하고 전부 유지 하겠다는 명령어
아래 커맨드 입력시 매우 주의가 필요하다.

# 1. 파일의 정확한 경로 확인 (일반적인 Spring 프로젝트 경우)
git filter-repo --invert-paths --path src/main/resources/application.yml

# 또는 루트에 있는 경우
git filter-repo --invert-paths --path application.yml

2-2 git remote 저장소 연결


remote 저장소가 연결이 안되 있어서 push 메세지를 보내니 아래와 같이 오류가 발생했다.

remote 저장소 연결도 필요하고, 최근 GitHub에서는 보안상의 이유로 master 브랜치에 대한 force push를 기본적으로 제한하고 있다. 다음과 같은 조치가 추가로 필요했다. remote 저장소 추가는 아래 권한설정 이후에 진행하도록 한다.

  • 브랜치 보호 설정 확인 및 변경

    	- GitHub 레포지토리 → Settings → Branches
    	- Branch protection rules에서 master 브랜치 보호 설정 확인
    	- 임시로 "Allow force pushes" 활성화 (주의: 작업 후 다시 비활성화 추천)
    	- force-push 명령어 시도

*위의 명령어 삽입 이전에 remote 저장소 추가 조치가 필요했다.*
`git remote -v` : 원격 저장소 확인 커맨드 ( 추가가 되지 않음 확인.)
`git status` : status 확인차 입력 했지만 해당 확인 내용은 remote 저장소가 아닌 local 저장소 였다.
`git remote add origin git@github.com:*userName*/*repoName*.git` : 리모드 저장소를 추가 하는 커맨드.

```bash
~/Downloads/SimpleChatApp git:[master]
git remote -v
~/Downloads/SimpleChatApp git:[master]
git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        get-pip.py
        src/main/java/com/.DS_Store
        src/main/java/com/example/simplechatapp/entity/.DS_Store

nothing added to commit but untracked files present (use "git add" to track)
~/Downloads/SimpleChatApp git:[master]
git remote add origin git@github.com:CHOHUNE/TOGERUN_BACK.git
~/Downloads/SimpleChatApp git:[master]
git remote -v
origin  git@github.com:CHOHUNE/TOGERUN_BACK.git (fetch)
origin  git@github.com:CHOHUNE/TOGERUN_BACK.git (push)
~/Downloads/SimpleChatApp git:[master]

2-3 remote 저장소 연결 후 SSH key 발급 필요

git push -u origin master
The authenticity of host 'github.com (20.200.245.247)' can't be established.
*** key fingerprint is ***.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

SSH key가 설정되어 있지 않아서 추가로 오류가 발생했다.
GitHub에 SSH key를 등록해야 한다.


# 1. SSH 키 생성
ssh-keygen -t ed25519 -C "your-github-email@example.com"
# 엔터를 눌러 기본 위치에 저장
# 비밀번호는 선택사항 (그냥 엔터 눌러도 됨)

# 2. SSH 에이전트 시작
eval "$(ssh-agent -s)"

# 3. SSH 키 추가
ssh-add ~/.ssh/id_ed25519

# 4. 공개키 내용 확인 (이 내용을 GitHub에 등록)
cat ~/.ssh/id_ed25519.pub
그 다음 GitHub에 키 등록:

GitHub.com → Settings
SSH and GPG keys → New SSH key
아무 Title 입력 (예: "MacBook")
cat 명령어로 본 내용을 Key에 붙여넣기
Add SSH key 클릭

연결 완료 : 보안상의 이유로 서버에 직접 로그인(shell access)는 허용하지 않고 git 작업 (push, pull 등) 만 허용 한다는 메세지다.

등록 후:

# 연결 테스트 ( 이메일을 본인 이메일로 변경하지 않고 그대로 입력 한다.)
ssh -T git@github.com

# 성공하면 다시 push 시도
git push -u origin master

성공 메세지 확인.

3. 강제 push 후 필요한 추후 조치

3-1 해당 문제 commit 내역 확인

다시 문제가된 커밋을 확인 해본다.

파일이 잘 삭제됨 확인.

3-2 force push 허용 branch rule 삭제

임시로 만든 branch rule 도 삭제 해준다.

3-3유출된 AWS accessKey, secretKey 재발급


IAM 해당 탭에서 삭제-재발급 (csv 파일로 저장 필수 - 이후에는 secretkey 값을 확인 불가하다.)

3-4 github secrets 값 변경


3분 전에 변경된 내역 확인

단 한 번의 실수로 매우매우 귀찮은 과정을 겪어야 하니 앞으로 또 조심하도록 하자....

profile
백엔드 개발자를 꿈꾸고 있습니다.

0개의 댓글