소개
컴퓨터에서 유용한 파일이라도 소스 코드 커밋에 포함하기에는 부적절할 수 있습니다. 이 새로운 DeskLite 저장소에는 작은 업무 변경 사항과 가상의 자격 증명이 담긴 비공개 설정이 있습니다. 비공개 파일은 실수로 스테이징되었지만 커밋된 적은 없습니다.
Git의 작업 영역, 스테이징 영역, 커밋 스냅샷을 배우고, 비공개 설정과 전달할 예제를 분리하며, 준비된 자격 증명 검사기를 사용합니다. Git 계정, 원격 저장소, 사전 Git 지식은 필요하지 않습니다.
작업 영역과 스테이징 영역 확인하기
이 단계에서는 Git이 저장하려고 준비 중인 파일을 확인합니다.
Git은 선택한 파일 버전을 저장소에 기록합니다. 작업 트리에는 편집하는 파일이 있습니다. 스테이징 영역에는 다음에 커밋하려는 스냅샷이 보관됩니다. 커밋은 스테이징된 스냅샷을 로컬 이력에 저장하며, 자동으로 무언가를 업로드하지는 않습니다.
cd /home/labex/project/desklite-git
git status는 이러한 영역을 비교합니다.
git status
준비된 터미널에서는 파일 범주가 색상으로 표시될 수 있지만 중요한 것은 문구입니다. 서로 다른 두 범주를 찾아보세요. private.env는 커밋할 변경 사항 아래에 나타납니다. 내용이 이미 스테이징된 상태입니다. service/app.py는 커밋하도록 스테이징되지 않은 변경 사항 아래에 나타납니다. 업무 수정이 아직 작업 트리에만 있는 상태입니다. 브랜치 이름은 다를 수 있으며 이 작업에 영향을 주지 않습니다.
git ls-files는 첫 커밋을 위해 스테이징된 새 파일을 포함하여 추적 중인 경로를 나열합니다.
git ls-files
비공개 파일은 커밋되지 않았는데도 나타납니다. 지금이 유출을 방지할 시점입니다. 최초 커밋 이력에는 자격 증명이 없습니다. 아직 커밋하지 마세요. 먼저 커밋에 무엇이 들어갈지 확인해야 합니다.
두 종류의 변경 사항 비교하기
이 단계에서는 업무 수정과 스테이징된 비공개 설정을 비교합니다.
git --no-pager diff는 스테이징되지 않은 변경 사항을 보여줍니다. 전역 옵션 --no-pager는 출력을 터미널에 바로 표시하므로 별도 뷰어를 닫을 필요가 없습니다. 경로를 지정하여 업무 파일로 범위를 제한하세요.
git --no-pager diff service/app.py
-로 시작하는 줄은 이전 내용을, +로 시작하는 줄은 새 내용을 보여줍니다. 새 프로그램은 DeskLite tickets ready를 출력합니다. 이 의도된 업무 변경은 유지하세요.
반면 git --no-pager diff --cached는 스테이징된 내용을 보여줍니다. --cached 옵션은 스테이징 영역을 선택합니다.
git --no-pager diff --cached
private.env와 그 안의 SERVICE_NAME 및 API_TOKEN 키가 보여야 합니다. 토큰은 가상의 값으로 이 교육 과정 밖에서는 어디에서도 사용할 수 없습니다. 그렇더라도 비공개로 유지해야 하는 값의 종류를 나타냅니다.
스테이징된 스냅샷은 현재 디스크의 파일과 다를 수 있습니다. 따라서 작업 트리만 확인하면 커밋을 위해 이미 준비된 내용을 놓칠 수 있습니다. 커밋 전에 두 종류의 변경 사항을 모두 확인하세요.
저장소에는 로컬 예제 작성자 정보가 이미 설정되어 있습니다. 개인 정보를 제공하거나 Git을 외부 서비스에 연결할 필요가 없습니다.
값이 가려진 자격 증명 탐지 결과 읽기
이 단계에서는 준비된 검사기를 비공개 파일에 실행하고 탐지 결과를 해석합니다.
Gitleaks는 자격 증명과 관련된 텍스트 패턴을 탐지합니다. 교육용 실행 도구 course-secrets는 가상의 labex_ 토큰 형식에 대한 고정 로컬 규칙 하나로 Gitleaks 8.24.2를 실행합니다. 일치하는 값은 가리고 네트워크 요청은 보내지 않습니다. 이 제한된 교육용 규칙은 완전한 운영 환경용 비밀 정보 탐지 정책이 아닙니다.
실행 도구에 파일이나 디렉터리를 지정하면 현재 내용을 검사합니다.
course-secrets private.env
desklite-practice-token으로 식별되는 탐지 결과, 파일 이름/줄 번호, 가려진 비밀 값이 표시되어야 합니다. 자격 증명을 찾았으므로 명령이 의도적으로 종료 상태 1을 반환합니다. 탐지 결과가 있는 것과 도구 실행 자체가 실패한 것은 다릅니다.
이 명령은 Git 추적 여부와 관계없이 현재 파일을 검사합니다. 나중에 소개할 이력 검사는 커밋된 변경 사항을 확인합니다. 이력이 깨끗하더라도 이 커밋되지 않은 파일을 스테이징해도 안전해지는 것은 아닙니다.
여기서 비공개 값은 스테이징된 내용과 작업 내용에만 존재합니다. 실제 자격 증명이 이미 노출되었다면 새 커밋에서 제거해도 무효화되거나 이전 복사본이 지워지지 않습니다. 소유자가 폐기하거나 교체해야 합니다. 이 연습에서는 이력 재작성을 다루지 않습니다.
비공개 설정과 예제 분리하기
이 단계에서는 비공개 설정을 Git 추적에서 제거하고, 범위를 좁게 지정한 무시 규칙을 추가하며, 사용할 수 있는 공개 예제를 만듭니다.
git rm --cached는 로컬 파일을 유지하면서 스테이징/추적 영역에서 경로를 제거합니다. 여기서는 새 비공개 파일을 실수로 스테이징한 작업을 되돌립니다.
git rm --cached private.env
추적되지 않은 경로 중 무엇을 제외할지 Git에 알려주는 .gitignore를 여세요.
nano .gitignore
다음 규칙 하나를 입력한 다음 Ctrl+O, Enter, Ctrl+X로 저장하세요.
/private.env
맨 앞의 /는 규칙의 기준을 이 저장소의 루트로 고정합니다. service/는 전달해야 할 파일이 있으므로 무시하지 마세요. 무시 규칙은 이미 추적 중인 파일이나 이전 커밋을 자동으로 제거하지 않습니다. 그래서 앞의 명령이 필요했습니다.
동일한 설정 키를 사용하는 공개 예제를 만드세요.
nano service/config.example.env
다음 내용을 저장하세요.
SERVICE_NAME=DeskLite
API_TOKEN=REPLACE_ME
예제는 사용할 수 있는 자격 증명을 제공하지 않으면서 향후 운영자에게 어떤 설정이 필요한지 알려줍니다. 원본 비공개 파일은 로컬에 유지하세요.
ls private.env
git status
비공개 경로는 더 이상 스테이징되거나 추적되지 않은 파일로 나열되지 않아야 합니다. .gitignore와 공개 예제는 추적되지 않은 상태로, 명시적으로 스테이징할 준비가 되어 있어야 합니다. 기존 업무 변경 사항은 아직 스테이징되지 않은 상태입니다.
전달 파일만 스테이징하기
이 단계에서는 다음 커밋에 포함할 정확한 파일을 준비합니다.
git add는 지정한 경로의 현재 내용을 스테이징 영역에 복사합니다. 전달하려는 파일을 각각 명시적으로 지정하세요.
git add service/app.py service/config.example.env .gitignore
파일 범주와 스테이징된 내용을 모두 검토하세요.
git status
git --no-pager diff --cached
의도한 업무 수정, 범위를 좁게 지정한 무시 규칙, 안전한 예제만 있어야 합니다. 비공개 토큰은 없어야 합니다. git add 이후 파일을 다시 편집했다면 커밋 전에 갱신된 내용을 스테이징해야 합니다. Git은 이전에 스테이징한 스냅샷을 자동으로 교체하지 않습니다.
추적 중인 경로를 다시 나열하세요.
git ls-files
전달 경로 세 개가 표시되고 private.env는 표시되지 않아야 합니다. 이 확인은 ls와 다른 질문에 답합니다. 로컬 비공개 파일은 여전히 존재하지만 Git 추적에서는 제외된 상태입니다.
다음 단계에서는 전달할 디렉터리를 검사합니다. 의도적으로 제한한 전달 범위를 검사했다고 해서 컴퓨터의 다른 모든 파일에도 비밀 정보가 없다고 입증되는 것은 아닙니다.
전달 내용 검사하기
이 단계에서는 비공개 로컬 설정을 유지하면서 전달할 소스 디렉터리를 확인합니다.
동일한 고정 규칙 검사기를 service 디렉터리에 실행하세요.
course-secrets service
no leaks found와 성공 종료가 예상됩니다. 검사기는 실제 소스 및 예제 내용을 처리합니다. 수동으로 편집한 보고서에 의존하지 않습니다.
비공개 설정은 이 전달 디렉터리 밖인 저장소 루트에 있습니다. 해당 비공개 파일을 다시 검사하면 여전히 토큰이 탐지되며, 이는 예상된 결과입니다. 민감한 데이터가 사라졌다고 주장한 것이 아니라 이용 대상을 분리한 것입니다.
스테이징된 스냅샷을 한 번 더 확인하세요.
git --no-pager diff --cached
디렉터리 검사는 현재 파일을 확인하고 diff는 Git이 저장할 내용을 확인합니다. 둘 다 의도한 전달 내용과 일치해야 합니다. 탐지 결과가 없는 검사는 설정된 규칙과 범위만 뒷받침합니다. 가능한 모든 비밀 정보나 보안 결함이 없다고 입증할 수는 없습니다.
이제 검토된 스테이징 스냅샷이 준비되었습니다. 다음 단계에서는 이를 로컬 커밋으로 저장합니다.
로컬 커밋 저장하기
이 단계에서는 검토한 스테이징 스냅샷을 로컬 이력에 저장합니다.
git commit은 스테이징 영역을 기록합니다. -m 옵션은 변경 사항을 설명하는 짧은 메시지를 지정하며, 따옴표는 메시지의 단어들을 하나로 묶습니다.
git commit -m "Deliver ticket message and safe configuration example"
변경된 세 경로가 포함된 커밋 요약이 표시되어야 합니다. 커밋 ID와 파일 통계는 다를 수 있으므로 무엇이 포함되었는지에 집중하세요.
git status
작업 트리는 깨끗해야 합니다. 무시된 비공개 파일은 git status에 나열되지 않아도 여전히 존재합니다.
커밋은 로컬 작업입니다. 원격 서비스로 푸시하거나 업로드하거나 공유한 것은 없습니다. 개인 계정 없이도 안전한 전달을 준비하는 연습에는 이것으로 충분합니다.
Git이 커밋할 내용이 없다고 보고하면 git status, git ls-files, 스테이징된 diff를 이전 단계와 비교하세요. 예상치 못한 상태를 해결하려고 저장소나 기존 이력을 삭제하지 마세요.
이력과 업무 변경 확인하기
이 단계에서는 커밋 이력을 검사하고 유지한 작은 프로그램을 실행합니다.
실행 도구의 --history 옵션은 Gitleaks의 Git 이력 검사를 선택합니다. 마지막 .은 이 저장소를 의미합니다.
course-secrets --history .
no leaks found가 예상됩니다. 깨끗한 최초 커밋과 새 전달 커밋이 모두 고정 규칙을 통과해야 합니다. 앞에서 파일 검사가 성공했다는 사실만으로는 이 이력 검사 결과까지 입증되지 않습니다.
python3는 제공된 Python 프로그램을 실행합니다. 이 실습에서는 Python 문법을 편집하거나 이해할 필요가 없습니다.
python3 service/app.py
예상 출력은 다음과 같습니다.
DeskLite tickets ready
로컬 비공개 파일이 Git 추적에서 계속 제외되어 있는지 확인하세요.
ls private.env
git ls-files
이제 유용한 전달 파일, 안전한 설정 예제, 연습용 자격 증명이 없는 로컬 커밋이 준비되었습니다. 비공개 파일은 삭제되지 않았고 업무 변경도 계속 동작합니다. 검사 보고서를 복사하거나 조사 파일을 만들 필요는 없습니다.
요약
로컬 비공개 설정과 전달할 소스를 분리하고, 커밋 전에 스테이징 내용을 검토했으며, 고정 규칙을 사용하고 탐지 값을 가리는 자격 증명 검사로 현재 전달 파일과 로컬 Git 이력을 모두 확인했습니다. 업무 변경 사항과 유용한 공개 예제는 유지하면서 비공개 설정은 커밋에서 제외했습니다.


