튜토리얼: 커밋에서 비밀 제거하기

애플리케이션이 외부 리소스를 사용하는 경우, 일반적으로 비밀(token 또는 key와 같은)로 애플리케이션을 인증해야 합니다. 비밀이 원격 저장소에 푸시되면, 해당 저장소에 접근할 수 있는 누구나 당신 또는 당신의 애플리케이션을 가장할 수 있습니다. 만약 실수로 비밀을 커밋했다면, 푸시하기 전에 여전히 이를 제거할 수 있습니다.

이 튜토리얼에서는 가짜 비밀을 커밋한 다음, 이를 프로젝트에 푸시하기 전에 커밋 히스토리에서 비밀을 제거하는 방법을 배웁니다. 비밀이 저장소에 푸시되었을 때 무엇을 해야 하는지도 배우게 됩니다.

이 튜토리얼은 GitLab Unfiltered 비디오 커밋에서 비밀 제거하기에서 수정되었습니다.

시작하기 전에

이 튜토리얼을 완료하기 전에 다음을 준비하세요:

  • 테스트 프로젝트. 원하는 프로젝트를 사용할 수 있지만, 이 튜토리얼을 위해 특별히 테스트 프로젝트를 만드는 것이 좋습니다.
  • 커맨드라인 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
    

비밀이 파일과 커밋 히스토리에서 제거되었으며, 안전하게 변경 사항을 푸시할 수 있습니다.

여러 커밋 수정하기

때로는 여러 추가 커밋을 만든 후에 비밀이 추가되었다는 것을 알게 됩니다. 이 경우, 가장 최근 커밋에서 비밀을 삭제하는 것만으로는 충분하지 않습니다. 비밀이 추가된 이후의 모든 커밋을 수정해야 합니다:

  1. 가짜 비밀을 파일에 추가하고 브랜치에 커밋합니다.
  2. 추가 커밋을 최소한 하나 더 만듭니다. 히스토리를 검사하면 다음과 같은 내용을 볼 수 있습니다:

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

    비록 456def 커밋에서 비밀을 삭제하더라도, 여전히 히스토리에 존재하며 지금 푸시하면 노출됩니다.

  3. 히스토리를 수정하려면 비밀을 도입한 커밋에서 인터랙티브 리베이스를 시작합니다:

    git rebase -i 123abc~1
    
  4. 편집 창에서 비밀이 포함된 각 커밋에 대해 pickedit으로 변경합니다:

    edit 456def Do other things
    edit 123abc Add fake secret
  5. 텍스트 파일을 열고 가짜 비밀을 제거합니다.
  6. 변경 사항을 커밋합니다:

    git add .
    git commit --amend
    
  7. 선택 사항: 비밀을 삭제하면 커밋에서 유일한 차이가 사라질 수 있습니다. 이럴 경우 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
    

비밀이 제거되었고, 이제 안전하게 원격으로 변경 사항을 푸시할 수 있습니다.

비밀을 푸시했을 때 할 일

때때로, 사람들은 변경 내용에 비밀이 포함되어 있다는 것을 알기 전에 변경 사항을 푸시합니다. 프로젝트에서 비밀 푸시 보호가 활성화되어 있다면,

푸시는 자동으로 차단되며, 문제가 있는 커밋이 표시됩니다.

하지만 비밀이 원격 저장소에 성공적으로 푸시되었다면, 더 이상 안전하지 않으므로 즉시 폐기해야 합니다.

많은 사람들이 비밀에 접근할 수 없다고 생각하더라도 교체해야 합니다. 노출된 비밀은 상당한 보안 위험을 초래합니다.

다음 단계

응용 프로그램 보안을 개선하기 위해 프로젝트에서 최소한 하나의 비밀 탐지 방법을 활성화하는 것을 고려하세요.