detect-secrets
는 코드 베이스 내에서 비밀을 감지하기 위한 (놀랍게도) 적절한 이름의 모듈입니다.
그러나 비밀 검색에만 초점을 맞춘 다른 유사한 패키지와 달리 이 패키지는 엔터프라이즈 클라이언트를 염두에 두고 설계되었습니다. 즉, 이전 버전과 호환되고 체계적인 수단을 제공합니다.
새로운 비밀이 코드 베이스에 입력되는 것을 방지하고,
그러한 예방 조치가 명시적으로 우회되었는지 감지
롤링할 비밀 체크리스트를 제공하고 보다 안전한 스토리지로 마이그레이션합니다.
이렇게 하면 우려 사항을 분리할 수 있습니다. 현재 대규모 저장소(이것이 기준선 이라고 함)에 비밀이 숨겨져 있을 수 있다는 점을 인정하지만 잠재적으로 막대한 노력을 기울이지 않고도 이 문제가 더 커지는 것을 방지할 수 있습니다. 기존 비밀을 멀리 옮기는 것입니다.
새로운 비밀이 커밋되었는지 확인하기 위해 경험적으로 제작된 정규식 문에 대해 정기적인 diff 출력을 실행하여 이를 수행합니다. 이렇게 하면 모든 Git 기록을 파헤치는 오버헤드와 매번 전체 저장소를 스캔해야 하는 필요성을 피할 수 있습니다.
최근 변경 사항을 보려면 CHANGELOG.md를 참조하세요.
기여하고 싶다면 CONTRIBUTING.md를 참조하세요.
더 자세한 문서를 보려면 다른 문서를 확인하세요.
현재 git 저장소에서 발견된 잠재적 비밀의 기준선을 만듭니다.
$ 비밀 검색 검사 > .secrets.baseline
또는 다른 디렉터리에서 실행하려면 다음을 수행하세요.
$ 감지 비밀 -C /path/to/directory 스캔 > /path/to/directory/.secrets.baseline
Git이 아닌 추적 파일 검색:
$ 감지 비밀 스캔 test_data/ --all-files > .secrets.baseline
그러면 코드베이스가 다시 스캔되고 다음이 수행됩니다.
최신 버전과 호환되도록 기준선을 업데이트/업그레이드하세요.
찾은 새로운 비밀을 기준선에 추가하세요.
더 이상 코드베이스에 없는 비밀을 제거하세요.
이렇게 하면 라벨이 지정된 모든 비밀도 보존됩니다.
$ 감지 비밀 스캔 --baseline .secrets.baseline
버전 0.9보다 오래된 기준선의 경우 다시 생성하면 됩니다.
준비된 파일만 검사:
$ git diff --staged --name-only -z | xargs -0 감지-비밀-후크 --baseline .secrets.baseline
모든 추적 파일 검색:
$ git ls-files -z | xargs -0 감지-비밀-후크 --baseline .secrets.baseline
$ 비밀 검색 스캔 --list-all-plugins 인공물탐지기 AWSKeyDetector AzureStorageKeyDetector 기본인증감지기 CloudantDetector DiscordBotTokenDetector GitHubTokenDetector GitLab토큰 감지기 Base64HighEntropy문자열 16진수높은엔트로피문자열 IbmCloudIamDetector IbmCosHmac검출기 IPPublicDetector JwtTokenDetector 키워드감지기 메일침프감지기 Npm감지기 OpenAIDetector 개인키탐지기 PypiTokenDetector SendGridDetector 슬랙디텍터 Softlayer검출기 SquareOAuth감지기 스트라이프디텍터 TelegramBotTokenDetector TwilioKeyDetector
$ 감지-비밀 스캔 --disable-plugin KeyDetector --disable-plugin AWSKeyDetector
특정 플러그인 만 실행하려면 다음을 수행하세요.
$ 비밀 감지 스캔 --list-all-plugins | grep -v 'BasicAuthDetector' | sed "s#^#--disable-plugin #g" | xargs 감지 비밀 검사 test_data
이는 기준선의 결과에 레이블을 지정하는 선택적 단계입니다. 마이그레이션할 비밀 체크리스트의 범위를 좁히거나 신호 대 잡음비를 개선하도록 플러그인을 더 잘 구성하는 데 사용할 수 있습니다.
$ 비밀 감지 감사 .secrets.baseline
기본 사용:
detector_secrets import SecretsCollectionfrom detector_secrets.settings import default_settingssecrets = SecretsCollection()with default_settings():secrets.scan_file('test_data/config.ini')import jsonprint(json.dumps(secrets.json(), indent=2))
보다 고급 구성:
from detector_secrets import SecretsCollectionfrom detector_secrets.settings import temporary_settingssecrets = SecretsCollection()with temporary_settings({# 이 플러그인으로만 스캔을 실행합니다.# 이 형식은 생성된 기준선에 저장된 형식과 동일합니다.'plugins_used': [# 예 내장 플러그인 구성{'name': 'Base64HighEntropyString','limit': 5.0, },# 커스텀 플러그인 사용 예{'name': 'HippoDetector','path': 'file:///Users/aaronloo/Documents/github/Detect-secrets/testing/plugins.py', }, ],# 원하는 추가 필터를 지정할 수도 있습니다.# 이것은 로컬 파일 `./private-filters/example.py` 내에서 # `is_identified_by_ML_model` 함수를 사용하는 예입니다.'filters_used': [ {'경로': 'file://private-filters/example.py::is_identified_by_ML_model', }, ] }) 설정으로:# 생성된 설정 개체를 추가로 조정하려는 경우(예: # 기본 필터 비활성화), such.settings.disable_filters('Detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign','Detect_secrets)와 같이 할 수 있습니다. .filters.heuristic.is_likely_id_string', )secrets.scan_file('test_data/config.ini')
$ pip 설치 비밀 감지 ?
Brew를 통해 설치:
$ 양조 설치 비밀 감지
detect-secrets
세 가지 도구가 함께 제공되며 어떤 도구를 사용해야 할지 혼동이 되는 경우가 많습니다. 이 편리한 체크리스트를 사용하면 다음 사항을 결정하는 데 도움이 됩니다.
기준선에 비밀을 추가하시겠습니까? 그렇다면 detect-secrets scan
사용하십시오.
기준선에 없는 새로운 비밀에 대해 경고하시겠습니까? 그렇다면 detect-secrets-hook
사용하세요.
기준선 자체를 분석하고 있나요? 그렇다면 detect-secrets audit
사용하세요.
$ detect-secrets scan --help usage: detect-secrets scan [-h] [--string [STRING]] [--only-allowlisted] [--all-files] [--baseline FILENAME] [--force-use-all-plugins] [--slim] [--list-all-plugins] [-p PLUGIN] [--base64-limit [BASE64_LIMIT]] [--hex-limit [HEX_LIMIT]] [--disable-plugin DISABLE_PLUGIN] [-n | --only-verified] [--exclude-lines EXCLUDE_LINES] [--exclude-files EXCLUDE_FILES] [--exclude-secrets EXCLUDE_SECRETS] [--word-list WORD_LIST_FILE] [-f FILTER] [--disable-filter DISABLE_FILTER] [path [path ...]] Scans a repository for secrets in code. The generated output is compatible with `detect-secrets-hook --baseline`. positional arguments: path Scans the entire codebase and outputs a snapshot of currently identified secrets. optional arguments: -h, --help show this help message and exit --string [STRING] Scans an individual string, and displays configured plugins' verdict. --only-allowlisted Only scans the lines that are flagged with `allowlist secret`. This helps verify that individual exceptions are indeed non-secrets. scan options: --all-files Scan all files recursively (as compared to only scanning git tracked files). --baseline FILENAME If provided, will update existing baseline by importing settings from it. --force-use-all-plugins If a baseline is provided, detect-secrets will default to loading the plugins specified by that baseline. However, this may also mean it doesn't perform the scan with the latest plugins. If this flag is provided, it will always use the latest plugins --slim Slim baselines are created with the intention of minimizing differences between commits. However, they are not compatible with the `audit` functionality, and slim baselines will need to be remade to be audited. plugin options: Configure settings for each secret scanning ruleset. By default, all plugins are enabled unless explicitly disabled. --list-all-plugins Lists all plugins that will be used for the scan. -p PLUGIN, --plugin PLUGIN Specify path to custom secret detector plugin. --base64-limit [BASE64_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 4.5. --hex-limit [HEX_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 3.0. --disable-plugin DISABLE_PLUGIN Plugin class names to disable. e.g. Base64HighEntropyString filter options: Configure settings for filtering out secrets after they are flagged by the engine. -n, --no-verify Disables additional verification of secrets via network call. --only-verified Only flags secrets that can be verified. --exclude-lines EXCLUDE_LINES If lines match this regex, it will be ignored. --exclude-files EXCLUDE_FILES If filenames match this regex, it will be ignored. --exclude-secrets EXCLUDE_SECRETS If secrets match this regex, it will be ignored. --word-list WORD_LIST_FILE Text file with a list of words, if a secret contains a word in the list we ignore it. -f FILTER, --filter FILTER Specify path to custom filter. May be a python module path (e.g. detect_secrets.filters.common.is_invalid_file) or a local file path (e.g. file://path/to/file.py::function_name). --disable-filter DISABLE_FILTER Specify filter to disable. e.g. detect_secrets.filters.common.is_invalid_file
$ detect-secrets-hook --help usage: detect-secrets-hook [-h] [-v] [--version] [--baseline FILENAME] [--list-all-plugins] [-p PLUGIN] [--base64-limit [BASE64_LIMIT]] [--hex-limit [HEX_LIMIT]] [--disable-plugin DISABLE_PLUGIN] [-n | --only-verified] [--exclude-lines EXCLUDE_LINES] [--exclude-files EXCLUDE_FILES] [--exclude-secrets EXCLUDE_SECRETS] [--word-list WORD_LIST_FILE] [-f FILTER] [--disable-filter DISABLE_FILTER] [filenames [filenames ...]] positional arguments: filenames Filenames to check. optional arguments: -h, --help show this help message and exit -v, --verbose Verbose mode. --version Display version information. --json Print detect-secrets-hook output as JSON --baseline FILENAME Explicitly ignore secrets through a baseline generated by `detect-secrets scan` plugin options: Configure settings for each secret scanning ruleset. By default, all plugins are enabled unless explicitly disabled. --list-all-plugins Lists all plugins that will be used for the scan. -p PLUGIN, --plugin PLUGIN Specify path to custom secret detector plugin. --base64-limit [BASE64_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 4.5. --hex-limit [HEX_LIMIT] Sets the entropy limit for high entropy strings. Value must be between 0.0 and 8.0, defaults to 3.0. --disable-plugin DISABLE_PLUGIN Plugin class names to disable. e.g. Base64HighEntropyString filter options: Configure settings for filtering out secrets after they are flagged by the engine. -n, --no-verify Disables additional verification of secrets via network call. --only-verified Only flags secrets that can be verified. --exclude-lines EXCLUDE_LINES If lines match this regex, it will be ignored. --exclude-files EXCLUDE_FILES If filenames match this regex, it will be ignored. --exclude-secrets EXCLUDE_SECRETS If secrets match this regex, it will be ignored. -f FILTER, --filter FILTER Specify path to custom filter. May be a python module path (e.g. detect_secrets.filters.common.is_invalid_file) or a local file path (e.g. file://path/to/file.py::function_name). --disable-filter DISABLE_FILTER Specify filter to disable. e.g. detect_secrets.filters.common.is_invalid_file
이를 커밋 전 후크로 설정하는 것이 좋습니다. 이를 수행하는 한 가지 방법은 사전 커밋 프레임워크를 사용하는 것입니다.
# .pre-commit-config.yamlrepos: - 저장소: https://github.com/Yelp/Detect-secretsrev: v1.5.0hooks: - ID: detector-secretsargs: ['--baseline', '.secrets.baseline']exclude: package.lock.json
기준선을 만들지 않고 커밋 차단에서 거짓 긍정을 제외하려는 경우가 있습니다. 다음과 같이 주석을 추가하면 됩니다.
secret = "hunter2" # pragma: 허용 목록 비밀
또는
// pragma: 허용 목록 nextline secretconst secret = "hunter2";
$ 비밀 감지 감사 --help 사용법: 비밀 감지 감사 [-h] [--diff] [--stats] [--report] [--only-real | ---거짓만] [--json] 파일 이름 [파일 이름 ...] 기준선 감사를 통해 분석가는 결과에 라벨을 붙이고 해당 환경에 가장 높은 신호 대 잡음비를 제공하도록 플러그인을 최적화할 수 있습니다. 위치 인수: filename 주어진 기준 파일을 감사하여 차이점을 구별합니다. 거짓 긍정과 참 긍정 사이. 선택적 인수: -h, --help 이 도움말 메시지를 표시하고 종료합니다. --diff 두 개의 기준 파일을 비교할 수 있습니다. 다양한 플러그인의 차이점을 효과적으로 구분 구성. --stats 대화형 감사 세션의 결과를 표시합니다. 기본 파일에 저장되었습니다. --report 감지된 비밀이 포함된 보고서를 표시합니다. 보고: 모든 결과와 내린 결정이 포함된 요약을 표시합니다. 보고서 모드(--report)와 함께 사용됩니다. --only-real 보고서에는 실제 비밀만 포함됩니다. --only-false 보고서에는 가양성만 포함됩니다. 해석학: 라벨이 지정된 결과를 기반으로 플러그인의 성공을 정량화합니다. 기준선. 통계 모드(--stats)와 함께 사용됩니다. --json 결과를 기계가 읽을 수 있는 형식으로 출력합니다.
이 도구는 플러그인 과 필터 시스템을 통해 작동합니다.
플러그인은 코드에서 비밀을 찾습니다
필터는 스캐닝 정밀도를 높이기 위해 오탐지를 무시합니다.
정밀도/재현율 요구 사항에 맞게 두 가지를 모두 조정할 수 있습니다.
코드에서 비밀을 찾기 위해 우리가 사용하는 세 가지 전략이 있습니다.
정규식 기반 규칙
이는 가장 일반적인 유형의 플러그인이며 잘 구조화된 비밀과 잘 작동합니다. 이러한 비밀은 선택적으로 확인할 수 있으므로 검색 정밀도가 높아집니다. 그러나 이들에만 의존하면 스캔 리콜에 부정적인 영향을 미칠 수 있습니다.
엔트로피 검출기
다양한 경험적 접근 방식을 통해 "비밀처럼 보이는" 문자열을 검색합니다. 이는 구조화되지 않은 비밀에 적합하지만 검색 정밀도를 조정하려면 조정이 필요할 수 있습니다.
키워드 감지기
이는 비밀 값을 무시하고 하드 코딩된 값으로 비밀을 할당하는 것과 자주 연관되는 변수 이름을 검색합니다. 이는 "비밀로 보이지 않는" 문자열(예: le3tc0de 비밀번호)에 적합하지만 검색 정밀도를 조정하려면 필터를 조정해야 할 수도 있습니다.
현재 파악하지 못한 비밀을 찾고 싶으신가요? 또한 (쉽게) 자신만의 플러그인을 개발하고 엔진과 함께 사용할 수도 있습니다! 자세한 내용은 플러그인 설명서를 확인하세요.
detect-secrets
귀하의 필요에 맞는 여러 가지 내장 필터가 함께 제공됩니다.
때로는 특정 패턴과 일치하는 경우 스캔에서 특정 라인을 전체적으로 허용할 수 있기를 원합니다. 다음과 같이 정규식 규칙을 지정할 수 있습니다.
$ 비밀 검색 스캔 --exclude-lines '비밀번호 = (어쩌구|가짜)'
또는 다음과 같이 여러 정규식 규칙을 지정할 수 있습니다.
$ 비밀 검색 스캔 --exclude-lines 'password = 어쩌구' --exclude-lines 'password = 가짜'
때로는 스캔에서 특정 파일을 무시할 수 있기를 원할 수도 있습니다. 이를 위해 정규식 패턴을 지정할 수 있으며, 파일 이름이 이 정규식 패턴과 일치하면 검색되지 않습니다.
$ 비밀 탐지 스캔 --exclude-files '.*.signature$'
또는 다음과 같이 여러 정규식 패턴을 지정할 수 있습니다.
$ 비밀 검색 --exclude-files '.*.signature$' --exclude-files '.*/i18n/.*'
때로는 스캔에서 특정 비밀 값을 무시할 수 있기를 원할 수도 있습니다. 다음과 같이 정규식 규칙을 지정할 수 있습니다.
$ 비밀 비밀 검색 --exclude-secrets '(fakesecret|${.*})'
또는 다음과 같이 여러 정규식 규칙을 지정할 수 있습니다.
$ 비밀 검색 스캔 --exclude-secrets 'fakesecret' --exclude-secrets '${.*})'
경우에 따라 전역적으로 제외하는 대신 특정 행에 제외를 적용하려는 경우가 있습니다. 다음과 같이 인라인 허용 목록을 사용하여 그렇게 할 수 있습니다.
API_KEY = '이것은 플러그인에 의해 일반적으로 감지됩니다' # pragma: 허용 목록 비밀
이 댓글은 여러 언어로 지원됩니다. 예를 들어
const GoogleCredentialPassword = "여기에 뭔가 비밀이 있습니다"; // pragma: 허용 목록 비밀
다음을 사용할 수도 있습니다.
# pragma: 허용 목록 nextline secretAPI_KEY = 'WillAlsoBeIgnored'
이는 전체 기준을 다시 생성할 필요 없이 비밀을 무시할 수 있는 편리한 방법일 수 있습니다. 이러한 허용 목록에 있는 비밀을 명시적으로 검색해야 하는 경우 다음을 수행할 수도 있습니다.
$ 비밀 비밀 검색 --only-allowlisted
오탐지를 필터링하기 위해 더 많은 사용자 정의 논리를 작성하고 싶으십니까? 필터 설명서에서 이 작업을 수행하는 방법을 확인하세요.
--exclude-secrets
플래그를 사용하면 비밀 값을 제외하는 정규식 규칙을 지정할 수 있습니다. 그러나 대신에 큰 단어 목록을 지정하려면 --word-list
플래그를 사용할 수 있습니다.
이 기능을 사용하려면 pyahocorasick
패키지를 설치하거나 다음을 사용하세요.
$ pip 설치 감지-비밀[단어_목록]
그런 다음 다음과 같이 사용할 수 있습니다.
$ 고양이 단어 목록.txt 진짜 비밀은 아니다 $ 고양이 샘플.ini 비밀번호 = 실제 비밀이 아님# 결과가 표시됩니다$ detector-secrets 스캔 샘플.ini# 결과가 없습니다.$ detector-secrets 스캔 --word-list wordlist.txt
Gibberish Detector는 실제 비밀 값이 단어와 유사하지 않다는 가정 하에 비밀 값이 실제로 횡설수설인지 여부를 확인하려고 시도하는 간단한 ML 모델입니다.
이 기능을 사용하려면 gibberish-detector
패키지를 설치하거나 다음을 사용하십시오.
$ pip 설치 비밀 감지[횡설수설]
모델 학습 방법에 대한 자세한 내용은 gibberish-Detector 패키지를 확인하세요. 쉽게 사용할 수 있도록 사전 훈련된 모델(RFC 처리를 통해 시드됨)이 포함됩니다.
다음과 같이 자신만의 모델을 지정할 수도 있습니다.
$ 비밀 검색 스캔 --횡설수설-모델 custom.model
이는 password
와 같은 비밀을 무시하므로 기본 플러그인이 아닙니다.
이는 비밀이 코드베이스에 들어가는 것을 방지하는 확실한 솔루션이 아닙니다. 적절한 개발자 교육만이 진정으로 그렇게 할 수 있습니다. 이 사전 커밋 후크는 비밀을 커밋하는 명백한 사례를 방지하기 위해 몇 가지 경험적 방법을 구현합니다.
예방할 수 없는 일:
여러 줄의 비밀
KeywordDetector
를 실행하지 않는 기본 비밀번호(예: login = "hunter2"
)
"git 저장소를 감지하지 못했습니다." git repo에 있는데도 경고가 발생했습니다.
git
버전이 1.8.5 이상인지 확인하세요. 그렇지 않은 경우 업그레이드한 후 다시 시도하십시오. 자세한 내용은 여기를 참조하세요.
detect-secrets audit
"유효한 기준 파일이 아닙니다!"가 표시됩니다. 기준선을 만든 후
기준 파일의 파일 인코딩이 UTF-8인지 확인하세요. 자세한 내용은 여기를 참조하세요.