최근 회사에서 Credential 내역이 노출되어 보안 위협이 된 사례가 발생을 하였다.
즉, 아이디/패스워드, AWS 토큰 값들을 소스파일 안에 적어놓고
그것을 그대로 commit 하여 push 까지 해버린 것이다.
그래서, 소스코드에 이러한 Credential 정보가 들어있는지 점검하는 것을 강화하였다.
자동으로 분석하도록 한 것이다.
문제는 이러한 Credential 정보가 들어있는 파일을 발견했을 때
개발자들이 어떻게 조치를 취해야하는지에 대한 가이드가 부재하고 있다는...
1. 기본 배경
- 개발자들이 특정 API 사용을 위한 인증 정보를 파일에 적어놓고 무심코 commit을 했을 경우를 전제 해보자
- 즉, 아래 그림과 같이 "commit D"에 token 값이 있다는 것을 발견한 것이다!!!
2. 최악의 해결 방법
- Credential 정보가 발견되었다는 경고를 받은 개발자는 당황한 나머지 아래와 같이 작업을 할 수 있다.
- 설마! 라고 하지만 정말로 저렇게 할 수 있다 !!!
- 위와 같이 하면 "commit E"에서는 Credential 정보가 안보이지만, "commit D"로 checkout을 하면 볼 수 있게 되기에 해결책이 아니다 !!!!!
3. 기본적인 해결 방법
- 실습을 위해 아래와 같이 실제 commit들을 만들어보았다.
- 마지막 commit인 "2651682"에서 Credential 정보가 발견되었을 경우에 대한 대처법을 알아보자.
$ git clone git@github.com:whatwant/whatwant.git
Cloning into 'whatwant'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (11/11), done.
Resolving deltas: 100% (2/2), done.
remote: Total 11 (delta 2), reused 8 (delta 2), pack-reused 3
$ cd whatwant/
$ git log --oneline
2651682 (HEAD -> master, origin/master, origin/HEAD) write token in no002.txt
a2004f0 add no002.txt
93afc28 add no001.txt
2b73c6e Initial commit
$ git reset --hard HEAD^
HEAD is now at a2004f0 add no002.txt
$ git log --oneline
a2004f0 (HEAD -> master) add no002.txt
93afc28 add no001.txt
2b73c6e Initial commit
$ git push origin master
To github.com:whatwant/whatwant.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git push -f origin master
Total 0 (delta 0), reused 0 (delta 0)
To github.com:whatwant/whatwant.git
+ 2651682...a2004f0 master -> master (forced update)
- 위와 같이 진행하고 commit 현황을 보면 "2651682" commit이 사라진 것을 볼 수 있다.
- 아래 그림과 같이 표현할 수 있을 것이다
- "git reset"은 매우 위험한 명령이기에 그냥 push를 하고자 하면 reject을 당한다! 그래서 "-f" 옵션을 통해 force 실행해야 한다!!!
4. 특정 파일의 이력을 모두 삭제하는 방법
- 이번 포스팅을 하게 된 이유이다 !!!
- 위와 같이 commit들이 있다고 해보자. 그림으로 표현하면 아래와 같다.
- 즉, 예전에 이미 Credential 정보를 넣었는데... 불행하게도 뒤늦게 (이미 commit들이 쌓이고 난 뒤에) Credential 정보를 발견하게 된것이다.
- 문제가 된 파일과 관련된 모든 이력을 지워보자.
$ git clone git@github.com:whatwant/whatwant.git
Cloning into 'whatwant'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (7/7), done.
Receiving objects: 100% (13/13), done.
Resolving deltas: 100% (3/3), done.
remote: Total 13 (delta 3), reused 7 (delta 1), pack-reused 4
$ cd whatwant/
$ git log --oneline
d81bb67 (HEAD -> master, origin/master, origin/HEAD) add no003.txt
df3c9e0 write token in no002.txt
ea11c2d add no002.txt
83bc6a8 add no001.txt
2b73c6e Initial commit
$ git filter-branch --tree-filter "rm -f no002.txt" HEAD
Rewrite d81bb67affec459cd3e25fa57b98cf64a1bf05be (3/5) (1 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten
$ ls -al
total 9
drwxr-xr-x 1 chani 197121 0 11월 9 20:41 ./
drwxr-xr-x 1 chani 197121 0 11월 9 20:40 ../
drwxr-xr-x 1 chani 197121 0 11월 9 20:41 .git/
-rw-r--r-- 1 chani 197121 0 11월 9 20:40 no001.txt
-rw-r--r-- 1 chani 197121 0 11월 9 20:40 no003.txt
-rw-r--r-- 1 chani 197121 10 11월 9 20:40 README.md
$ git log --oneline
69c84e3 (HEAD -> master) add no003.txt
94413d9 write token in no002.txt
1a2d568 add no002.txt
83bc6a8 add no001.txt
2b73c6e Initial commit
$ git push origin master
To github.com:whatwant/whatwant.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:whatwant/whatwant.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git push -f origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 515 bytes | 515.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:whatwant/whatwant.git
+ d81bb67...69c84e3 master -> master (forced update)
- 실제 commit이 어떻게 되어있는지 확인해 보자.
- 무엇이 바뀌었는지 그림으로 확인해 보자.
- 위의 방법은 문제가 발생한 파일과 관련한 내용을 전체 히스토리에서 삭제를 하는 것이다.
→ 그렇기 때문에, 영향을 받은 commit을 보면 앞의 commit 까지 포함이 된다.
※ 주의사항
- 문제가 발생한 정확한 위치를 찾기가 어렵기 때문에 문제가 발생한 파일을 전체 history에서 삭제를 해버리는 방식이다.
→ 해당 파일에 Credential 정보 외의 내역도 있고 이에 대한 내용도 중요하다고 하면 문제가 있을 수 있는 방법이라는 말이다.
- 그리고, 기존 commit ID 값도 변경이 된다.
→ commit ID 이력을 관리하고 있는 상황인 경우 문제가 있을 수 있다는 말이다.
이러한 번거로움을 피하기 위해서는 애초에 Credential 정보를 파일안에 기재하는 일이 없어야 하겠다.
'SCM > Git-GitHub' 카테고리의 다른 글
git clone [bare/mirror] 에 대해서 알아보기 (0) | 2020.01.01 |
---|---|
git 저장소 용량 줄이기 (git repo size reduce) (0) | 2019.11.24 |
Login with GitHub OAuth using PHP (0) | 2019.08.04 |
repo (git-repo) : 복수 저장소 다루기 (#2) in Windows (0) | 2019.06.18 |
repo (git-repo) : 복수 저장소 다루기 (#1) in Ubuntu (0) | 2019.06.17 |