최근 회사에서 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 정보를 파일안에 기재하는 일이 없어야 하겠다.



반응형

+ Recent posts