InfoGrab DocsInfoGrab Docs

튜토리얼: 커밋에서 시크릿 제거하기

요약

애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다.

애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 시크릿이 원격 리포지터리에 푸시되면 해당 리포지터리에 접근할 수 있는 누구나 사용자나 애플리케이션을 사칭할 수 있습니다. 실수로 시크릿을 커밋했더라도 푸시하기 전이라면 제거할 수 있습니다.

이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다. 시크릿이 리포지터리에 푸시된 경우의 대처 방법도 함께 다룹니다.

이 튜토리얼은 GitLab Unfiltered 영상 Remove a secret from your commits를 바탕으로 작성되었습니다.

시작하기 전에#

이 튜토리얼을 진행하기 전에 다음을 준비합니다.

  • 테스트 프로젝트. 원하는 프로젝트를 사용해도 되지만, 이 튜토리얼 전용 테스트 프로젝트를 만드는 방법을 권장합니다.
  • 명령줄 Git에 대한 기본적인 이해.

시크릿 커밋#

GitLab은 문자, 숫자, 기호의 특정 패턴을 대조해 시크릿을 식별합니다. 이 패턴은 시크릿의 유형을 식별하는 데도 사용됩니다. 예를 들어 가짜 시크릿 glpat-12345678901234567890 은 glpat- 문자열로 시작하므로 개인 액세스 토큰입니다.

많은 시크릿을 형식으로 식별할 수 있지만, 리포지터리에서 작업하다 보면 시크릿을 실수로 커밋할 수 있습니다. 시크릿을 실수로 커밋하는 상황을 재현합니다.

  1. 테스트 리포지터리에서 새 브랜치를 체크아웃합니다.

    git checkout -b secret-tutorial
    
  2. 다음 내용으로 새 텍스트 파일을 만듭니다. 개인 액세스 토큰의 형식과 정확히 일치하도록 - 앞뒤의 공백은 제거합니다.

    fake-secret: glpat - 12345678901234567890
    message: hello, world!
    
  3. 파일을 브랜치에 커밋합니다.

    git add .
    git commit -m "Add fake secret"
    

여기서 문제가 발생합니다. 변경 사항이 푸시되면 텍스트 파일에 든 개인 액세스 토큰이 유출됩니다. 계속 진행하려면 커밋 히스토리에서 시크릿을 제거해야 합니다.

히스토리에서 시크릿 제거#

시크릿이 포함된 커밋이 Git 히스토리의 가장 최근 커밋뿐이라면, 히스토리를 수정해 시크릿을 제거할 수 있습니다.

  1. 텍스트 파일을 열고 가짜 시크릿을 제거합니다.

    fake-secret:
    message: hello, world!
    
  2. 변경 사항으로 이전 커밋을 덮어씁니다.

    git add .
    git commit --amend
    
  3. 변경 사항을 원격 브랜치에 푸시합니다.

    git push --force-with-lease
    

    커밋 히스토리를 다시 작성했으므로 일반 git push는 실패합니다. --force-with-lease 플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.

파일과 커밋 히스토리에서 시크릿이 제거되었습니다.

여러 커밋 수정#

시크릿을 추가한 뒤 커밋을 몇 번 더 하고 나서야 이를 알아차리는 경우도 있습니다. 이때는 가장 최근 커밋에서 시크릿을 지우는 것만으로 충분하지 않습니다. 시크릿이 추가된 이후의 모든 커밋을 수정해야 합니다.

  1. 파일에 가짜 시크릿을 추가하고 브랜치에 커밋합니다.

  2. 커밋을 최소 한 번 더 수행합니다. 히스토리를 확인하면 다음과 같이 표시됩니다.

    $ git log
    commit 456def
    
        Do other things
    
    commit 123abc
    
        Add fake secret
    
    ...
    

    커밋 456def에서 시크릿을 제거하더라도 히스토리에는 그대로 남아 있으므로, 지금 변경 사항을 푸시하면 시크릿이 노출됩니다.

  3. 히스토리를 바로잡으려면 시크릿이 추가된 커밋부터 대화형 리베이스를 시작합니다.

    git rebase -i 123abc~1
    
  4. 편집 창에서 시크릿이 포함된 모든 커밋의 pick을 edit로 변경합니다.

    edit 456def Do other things
    edit 123abc Add fake secret
    
  5. 텍스트 파일을 열고 가짜 시크릿을 제거합니다.

  6. 변경 사항을 커밋합니다.

    git add .
    git commit --amend
    
  7. 선택 사항. 시크릿을 지우면 해당 커밋의 유일한 diff가 사라질 수 있습니다. 이 경우 Git은 다음 메시지를 표시합니다.

    No changes
    You asked to amend the most recent commit, but doing so would make it empty.
    

    빈 커밋을 제거합니다.

    git reset HEAD^
    
  8. 리베이스를 계속합니다.

    git rebase --continue
    
  9. 다음 커밋에서 시크릿을 제거하고 리베이스를 계속합니다. 리베이스가 끝날 때까지 이 과정을 반복합니다.

    Successfully rebased and updated refs/heads/secret-tutorial
    
  10. 변경 사항을 원격 브랜치에 푸시합니다.

    git push --force-with-lease
    

    커밋 히스토리를 다시 작성했으므로 일반 git push는 실패합니다. --force-with-lease 플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.

커밋 히스토리에서 시크릿이 제거되었습니다.

시크릿을 푸시했을 때 해야 할 일#

변경 사항에 시크릿이 들어 있다는 사실을 알아차리기 전에 푸시하는 경우가 있습니다. 프로젝트에 시크릿 푸시 보호가 활성화되어 있으면 푸시가 자동으로 차단되고 문제가 된 커밋이 표시됩니다.

그러나 시크릿이 원격 리포지터리에 푸시되었다면 그 시크릿은 더 이상 안전하지 않으므로 즉시 폐기해야 합니다. 해당 시크릿에 접근할 수 있는 사람이 많지 않다고 판단되더라도 반드시 교체합니다. 노출된 시크릿은 상당한 보안 위험입니다.

다음 단계#

애플리케이션 보안을 강화하려면 프로젝트에서 시크릿 탐지 방식 중 최소한 하나를 활성화하는 방안을 검토합니다.

튜토리얼: 커밋에서 시크릿 제거하기

GitLab v19.5
원문 보기

요약

애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다.

애플리케이션이 외부 리소스를 사용한다면 대개 토큰이나 키 같은 시크릿으로 애플리케이션을 인증해야 합니다. 시크릿이 원격 리포지터리에 푸시되면 해당 리포지터리에 접근할 수 있는 누구나 사용자나 애플리케이션을 사칭할 수 있습니다. 실수로 시크릿을 커밋했더라도 푸시하기 전이라면 제거할 수 있습니다.

이 튜토리얼에서는 가짜 시크릿을 커밋한 다음, 프로젝트에 푸시하기 전에 커밋 히스토리에서 그 시크릿을 제거합니다. 시크릿이 리포지터리에 푸시된 경우의 대처 방법도 함께 다룹니다.

이 튜토리얼은 GitLab Unfiltered 영상 Remove a secret from your commits를 바탕으로 작성되었습니다.

시작하기 전에#

이 튜토리얼을 진행하기 전에 다음을 준비합니다.

  • 테스트 프로젝트. 원하는 프로젝트를 사용해도 되지만, 이 튜토리얼 전용 테스트 프로젝트를 만드는 방법을 권장합니다.
  • 명령줄 Git에 대한 기본적인 이해.

시크릿 커밋#

GitLab은 문자, 숫자, 기호의 특정 패턴을 대조해 시크릿을 식별합니다. 이 패턴은 시크릿의 유형을 식별하는 데도 사용됩니다. 예를 들어 가짜 시크릿 glpat-12345678901234567890 은 glpat- 문자열로 시작하므로 개인 액세스 토큰입니다.

많은 시크릿을 형식으로 식별할 수 있지만, 리포지터리에서 작업하다 보면 시크릿을 실수로 커밋할 수 있습니다. 시크릿을 실수로 커밋하는 상황을 재현합니다.

  1. 테스트 리포지터리에서 새 브랜치를 체크아웃합니다.

    git checkout -b secret-tutorial
    
  2. 다음 내용으로 새 텍스트 파일을 만듭니다. 개인 액세스 토큰의 형식과 정확히 일치하도록 - 앞뒤의 공백은 제거합니다.

    fake-secret: glpat - 12345678901234567890
    message: hello, world!
    
  3. 파일을 브랜치에 커밋합니다.

    git add .
    git commit -m "Add fake secret"
    

여기서 문제가 발생합니다. 변경 사항이 푸시되면 텍스트 파일에 든 개인 액세스 토큰이 유출됩니다. 계속 진행하려면 커밋 히스토리에서 시크릿을 제거해야 합니다.

히스토리에서 시크릿 제거#

시크릿이 포함된 커밋이 Git 히스토리의 가장 최근 커밋뿐이라면, 히스토리를 수정해 시크릿을 제거할 수 있습니다.

  1. 텍스트 파일을 열고 가짜 시크릿을 제거합니다.

    fake-secret:
    message: hello, world!
    
  2. 변경 사항으로 이전 커밋을 덮어씁니다.

    git add .
    git commit --amend
    
  3. 변경 사항을 원격 브랜치에 푸시합니다.

    git push --force-with-lease
    

    커밋 히스토리를 다시 작성했으므로 일반 git push는 실패합니다. --force-with-lease 플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.

파일과 커밋 히스토리에서 시크릿이 제거되었습니다.

여러 커밋 수정#

시크릿을 추가한 뒤 커밋을 몇 번 더 하고 나서야 이를 알아차리는 경우도 있습니다. 이때는 가장 최근 커밋에서 시크릿을 지우는 것만으로 충분하지 않습니다. 시크릿이 추가된 이후의 모든 커밋을 수정해야 합니다.

  1. 파일에 가짜 시크릿을 추가하고 브랜치에 커밋합니다.

  2. 커밋을 최소 한 번 더 수행합니다. 히스토리를 확인하면 다음과 같이 표시됩니다.

    $ git log
    commit 456def
    
        Do other things
    
    commit 123abc
    
        Add fake secret
    
    ...
    

    커밋 456def에서 시크릿을 제거하더라도 히스토리에는 그대로 남아 있으므로, 지금 변경 사항을 푸시하면 시크릿이 노출됩니다.

  3. 히스토리를 바로잡으려면 시크릿이 추가된 커밋부터 대화형 리베이스를 시작합니다.

    git rebase -i 123abc~1
    
  4. 편집 창에서 시크릿이 포함된 모든 커밋의 pick을 edit로 변경합니다.

    edit 456def Do other things
    edit 123abc Add fake secret
    
  5. 텍스트 파일을 열고 가짜 시크릿을 제거합니다.

  6. 변경 사항을 커밋합니다.

    git add .
    git commit --amend
    
  7. 선택 사항. 시크릿을 지우면 해당 커밋의 유일한 diff가 사라질 수 있습니다. 이 경우 Git은 다음 메시지를 표시합니다.

    No changes
    You asked to amend the most recent commit, but doing so would make it empty.
    

    빈 커밋을 제거합니다.

    git reset HEAD^
    
  8. 리베이스를 계속합니다.

    git rebase --continue
    
  9. 다음 커밋에서 시크릿을 제거하고 리베이스를 계속합니다. 리베이스가 끝날 때까지 이 과정을 반복합니다.

    Successfully rebased and updated refs/heads/secret-tutorial
    
  10. 변경 사항을 원격 브랜치에 푸시합니다.

    git push --force-with-lease
    

    커밋 히스토리를 다시 작성했으므로 일반 git push는 실패합니다. --force-with-lease 플래그는 다른 기여자의 커밋을 덮어쓰지 않도록 보호하면서 푸시를 강제합니다.

커밋 히스토리에서 시크릿이 제거되었습니다.

시크릿을 푸시했을 때 해야 할 일#

변경 사항에 시크릿이 들어 있다는 사실을 알아차리기 전에 푸시하는 경우가 있습니다. 프로젝트에 시크릿 푸시 보호가 활성화되어 있으면 푸시가 자동으로 차단되고 문제가 된 커밋이 표시됩니다.

그러나 시크릿이 원격 리포지터리에 푸시되었다면 그 시크릿은 더 이상 안전하지 않으므로 즉시 폐기해야 합니다. 해당 시크릿에 접근할 수 있는 사람이 많지 않다고 판단되더라도 반드시 교체합니다. 노출된 시크릿은 상당한 보안 위험입니다.

다음 단계#

애플리케이션 보안을 강화하려면 프로젝트에서 시크릿 탐지 방식 중 최소한 하나를 활성화하는 방안을 검토합니다.