시크릿 푸시 보호

Tier: Ultimate Offering: GitLab.com, 자체 관리, GitLab Dedicated
자체 관리 GitLab에서는 기본적으로 이 기능을 사용할 수 있습니다. 기능을 숨기려면 관리자에게 기능 플래그 비활성화 요청하세요. pre_receive_secret_detection_push_check이라는 플래그입니다.

시크릿 푸시 보호는 키 및 API 토큰과 같은 시크릿이 GitLab에 푸시되는 것을 차단합니다. 각 커밋의 내용이 GitLab에 푸시될 때 시크릿을 확인합니다. 시크릿이 감지되면 해당 푸시는 차단됩니다.

시크릿 푸시 보호와 함께 파이프라인 시크릿 탐지를 사용하여 보안을 더 강화하세요.

개요는 시크릿 푸시 보호로 시작하기 플레이리스트를 참조하세요.

Git 클라이언트에 상관없이 GitLab은 푸시가 차단될 때 다음 내용을 포함한 메시지를 표시합니다:

  • 시크릿이 포함된 커밋 ID.
  • 시크릿이 포함된 파일명 및 라인.
  • 시크릿의 유형.

예를 들어, Git CLI를 사용하여 푸시가 차단될 때 반환되는 메시지의 일부 내용은 다음과 같습니다. GitLab Web IDE를 비롯한 다른 클라이언트를 사용할 때 메시지 형식이 다르지만 내용은 동일합니다.

remote: PUSH BLOCKED: Secrets detected in code changes
remote: Secret push protection found the following secrets in commit: 37e54de5e78c31d9e3c3821fd15f7069e3d375b6
remote:
remote: -- test.txt:2 GitLab Personal Access Token
remote:
remote: To push your changes you must remove the identified secrets.

시크릿 푸시 보호가 커밋에서 시크릿을 감지하지 않으면 메시지가 표시되지 않습니다.

감지된 시크릿

GitLab은 GitLab에 푸시되는 시크릿을 차단하는 데 사용되는 일련의 규칙을 유지합니다.

낮은 확신도의 패턴에 대한 스캔은 타임아웃이 발생하거나 푸시 확인에 실패할 수 있습니다. 따라서 우리는 코드를 푸시할 때 성능을 보장하고 잘못된 경고 수를 줄이기 위해 높은 확신도의 패턴만 포함하기로 결정했습니다.

시크릿 푸시 보호에서 사용자 정의 규칙 세트를 사용하는 것은 현재 불가능합니다.

시크릿 푸시 보호 활성화

GitLab Dedicated 및 자체 관리 인스턴스에서는 시크릿 푸시 보호를 전체 인스턴스에서 활성화한 다음 프로젝트 단위로 활성화해야 합니다.

GitLab.com에서는 이 설정이 전체 인스턴스에서 활성화되었습니다. 프로젝트 단위로 활성화해야 합니다.

GitLab 인스턴스에서 시크릿 푸시 보호 사용 허용

note
이 옵션을 설정하면 GitLab 인스턴스의 프로젝트가 시크릿 푸시 보호를 활성화할 수 있는 권한을 부여받습니다. 시크릿 푸시 보호를 사용하려면 각 프로젝트에서도 활성화해야 합니다. 자세한 내용은 프로젝트에서 시크릿 푸시 보호 활성화를 참조하세요.

필수 조건:

  • GitLab 인스턴스의 관리자이어야 합니다.
  1. 관리자로서 GitLab 인스턴스에 로그인합니다.
  2. 왼쪽 사이드바에서 하단에서 관리를 선택합니다.
  3. 설정 > 보안 및 준수를 선택합니다.
  4. 비밀 감지 아래에서 시크릿 푸시 보호 허용을 선택합니다.

프로젝트에서 시크릿 푸시 보호 활성화

필수 조건:

  • 프로젝트의 유지 관리자 역할 이상이어야 합니다.

프로젝트에서 시크릿 푸시 보호를 활성화하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
  2. 왼쪽 사이드바에서 보안 > 보안 구성을 선택합니다.
  3. 시크릿 푸시 보호 토글을 켭니다.

커버리지

시크릿 푸시 보호는 커밋이 GitLab에 푸시될 때 각 커밋의 내용을 확인합니다. 그러나 다음의 조건이 적용됩니다:

시크릿 푸시 보호는 다음 중 하나가 적용될 때 시크릿을 차단하지 않습니다:

시크릿 푸시 보호는 다음의 경우 파일을 확인하지 않습니다:

  • 파일이 바이너리 파일인 경우.
  • 파일이 1MiB보다 큰 경우.
  • 파일의 diff 패치가 1MiB보다 큰 경우 (diff 스캔 사용 시).
  • 파일이 이름이 변경되었거나, 삭제되었거나, 다른 파일에 내용 변경이 없이 이동되었을 경우.
  • 파일의 내용이 소스 코드 내 다른 파일의 내용과 동일한 경우.
  • 파일이 저장소를 생성한 초기 푸시로 포함된 경우.

Diff 스캔

시크릿 푸시 보호는 기본적으로 수정된 파일의 모든 내용을 스캔합니다. 이로 인해 파일에 시크릿이 포함되어 있는 경우 예상치 못한 차단이 발생할 수 있습니다. Spp_scan_diffs 기능 플래그를 프로젝트에 활성화하여 시크릿 푸시 보호를 변경하여 새로 커밋된 변경 사항(또는 diff)만 스캔하고 나머지 파일은 스캔하지 않도록 할 수 있습니다.

spp_scan_diffs가 활성화된 경우 CLI 기반 푸시의 경우 Secret Push Protection은 diffs를 스캔합니다. WebIDE를 통해 커밋된 변경에 대해서는 기술적 제한으로 인해 전체 파일이 스캔됩니다. Issue 491282가 WebIDE 변경에 대해 diffs만 스캔되도록 제한을 처리합니다.

차단된 푸시 해결하기

비밀 푸시 보호가 푸시를 차단하면 다음 중 하나를 할 수 있습니다.

비밀을 제거합니다

차단된 비밀을 제거하여 커밋을 GitLab에 푸시할 수 있게 합니다. 비밀을 제거하는 방법은 최근에 커밋되었는지에 따라 다릅니다. 아래 지침은 Git CLI 클라이언트를 사용하지만, 다른 Git 클라이언트를 사용하여 동일한 결과를 얻을 수 있습니다.

브랜치에 가장 최근에 커밋된 것이 차단된 비밀인 경우:

  1. 파일에서 비밀을 제거합니다.
  2. 변경 사항을 git add <file-name>로 스테이징합니다.
  3. 변경된 파일을 포함하도록 가장 최근 커밋을 수정하기 위해 git commit --amend를 사용합니다.
  4. 변경 사항을 git push로 푸시합니다.

차단된 비밀이 Git 기록에서 더 이전에 나타나는 경우:

  1. 옵션. 커밋에서 비밀을 제거하는 단순한 데모를 시청합니다.
  2. 푸시 오류 메시지에서 커밋 SHA를 식별합니다. 여러 개인 경우 git log를 사용하여 가장 이른 것을 찾습니다.
  3. git switch --create copy-branch를 사용하여 작업할 복사 브랜치를 생성하여 리베이스가 문제가 발생할 경우 원래 브랜치로 재설정할 수 있도록 합니다.
  4. 상호작용 리베이스를 시작하기 위해 git rebase -i <commit-sha>~1를 사용합니다.
  5. 편집기에서 pick 명령을 edit로 변경하여 문제가 되는 커밋을 편집합니다.
  6. 파일에서 비밀을 제거합니다.
  7. 변경 사항을 git add <file-name>로 스테이징합니다.
  8. 변경된 파일을 git commit --amend로 커밋합니다.
  9. 모든 비밀이 제거될 때까지 git rebase --continue로 리베이스를 계속합니다.
  10. 변경 사항을 복사 브랜치에서 원래 원격 브랜치로 git push --force --set-upstream origin copy-branch:<original-branch>를 사용하여 푸시합니다.
  11. 변경 사항이 만족스러울 때 다음 선택적 정리 단계를 고려합니다.
    1. 옵션. git branch --delete --force <original-branch>를 사용하여 원래 브랜치를 삭제합니다.
    2. 옵션. git branch --move copy-branch <original-branch>를 사용하여 복사 브랜치 이름을 변경하여 원래 브랜치를 대체합니다.

비밀 푸시 보호 건너뛰기

일부 경우에는 비밀 푸시 보호를 건너뛰어야 할 수 있습니다. 예를 들어 개발자가 테스트를 위해 플레이스홀더 비밀을 커밋해야 하거나 Git 작업 시간 초과로 인해 비밀 푸시 보호를 건너뛰어야 하는 경우가 있을 수 있습니다.

감사 이벤트는 비밀 푸시 보호를 건너뛸 때 기록됩니다. 감사 이벤트 세부 정보는 다음을 포함합니다:

  • 사용된 건너뛰기 방법.
  • GitLab 계정 이름.
  • 비밀 푸시 보호가 건너뛰어진 날짜 및 시간.
  • 비밀을 푸시한 프로젝트 이름.

파이프라인 비밀 감지가 활성화되어 있는 경우 모든 커밋의 내용이 저장소로 푸시된 후에 스캔됩니다.

푸시의 모든 커밋에 대해 비밀 푸시 보호를 건너뛰려면 다음 중 하나를 수행합니다:

Git-CLI-클라이언트를 사용하는 경우 건너뛰기

Git CLI 클라이언트를 사용하여 비밀 푸시 보호를 건너뛰려면:

  • 푸시 옵션을 사용합니다.

    예를 들어, 하나의 커밋에 비밀이 있는 여러 커밋이 있어서 푸시할 수 없다고 차단되어 있다면, 비밀 푸시 보호를 건너뛰기 위해 푸시 옵션을 Git 명령에 추가합니다.

    git push -o secret_push_protection.skip_all
    

다른 Git 클라이언트를 사용하는 경우 건너뛰기

다른 Git 클라이언트를 사용하여 비밀 푸시 보호를 건너뛰려면:

  • 기존 라인이나 새 라인 중 하나에 [skip secret push protection]을 추가한 후에 커밋을 푸시합니다.

    예를 들어, GitLab Web IDE를 사용하고 있는데 여러 커밋 중 하나가 비밀을 포함하여 푸시를 차단하고 있다면, 최신 커밋 메시지를 편집하여 [skip secret push protection]을 추가한 후에 커밋을 푸시합니다.

문제 해결

비밀 푸시 보호를 사용하다 보면 다음과 같은 상황이 발생할 수 있습니다.

예기치 않게 푸시가 차단됨

비밀 푸시 보호는 수정된 파일의 모든 내용을 스캔합니다. 이로 인해 수정된 파일이 diff의 일부가 아닌 경우에도 비밀이 포함되어 있으면 푸시가 예기치 않게 차단될 수 있습니다.

spp_scan_diffs 기능 플래그를 활성화하여 새로 커밋된 변경 사항만 스캔되도록 합니다. 비밀을 포함한 파일에 웹 IDE 변경을 푸시하려면 비밀 푸시 보호를 건너뛰어야합니다.

파일이 스캔되지 않음

일부 파일은 스캔에서 제외됩니다. 제외 사항 목록은 커버리지를 참조하세요.