
Предотвращает случайную фиксацию секретов и учетных данных в git-репозиториях.
.. contents:: :depth: 2
::
git secrets --scan [-r|--recursive] [--cached] [--no-index] [--untracked] [<файлы>...]
git secrets --scan-history
git secrets --install [-f|--force] [<целевой-каталог>]
git secrets --list [--global]
git secrets --add [-a|--allowed] [-l|--literal] [--global] <шаблон>
git secrets --add-provider [--global] <команда> [аргументы...]
git secrets --register-aws [--global]
git secrets --aws-provider [<файл-учётных-данных>]
git-secrets сканирует коммиты, сообщения коммитов и слияния --no-ff,
чтобы предотвратить попадание секретов в ваши git-репозитории. Если коммит,
сообщение коммита или любой коммит в истории слияния --no-ff соответствует
одному из настроенных вами запрещённых шаблонов регулярных выражений, то
коммит отклоняется.
git-secrets должен быть помещён в вашу переменную PATH, чтобы git мог
его найти при выполнении git secrets.
*nix (Linux/macOS)
Вы можете использовать цель ``install`` из предоставленного Makefile для установки ``git secrets`` и man-страницы.
Вы можете настроить путь установки с помощью переменных PREFIX и MANPREFIX.
::
make install
Windows
~~~~~~~
Запустите предоставленный PowerShell-скрипт ``install.ps1``. Он скопирует необходимые файлы
в каталог установки (по умолчанию ``%USERPROFILE%/.git-secrets``) и добавит
этот каталог в переменную PATH текущего пользователя.
::
PS > ./install.ps1
Homebrew (для пользователей macOS)
::
brew install git-secrets
.. warning::
**Вы ещё не закончили! Вы ОБЯЗАТЕЛЬНО должны установить git-хуки для каждого репозитория, в котором
хотите использовать** ``git secrets --install``.
Вот краткий пример того, как обеспечить сканирование git-репозитория на наличие секретов при каждом коммите::
cd /path/to/my/repo
git secrets --install
git secrets --register-aws
Добавьте шаблон конфигурации, если хотите добавлять хуки во все репозитории, которые вы инициализируете или клонируете в будущем.
::
git secrets --register-aws --global
Добавьте хуки во все ваши локальные репозитории.
::
git secrets --install ~/.git-templates/git-secrets
git config --global init.templateDir ~/.git-templates/git-secrets
Добавьте собственные поставщики для сканирования учётных данных безопасности.
::
git secrets --add-provider -- cat /path/to/secret/file/patterns
С помощью git-secrets также можно сканировать репозиторий, включая все ревизии:
::
git secrets --scan-history
Режимы работы
Каждый из этих параметров должен быть первым в командной строке.
``--install``
Устанавливает git-хуки для репозитория. После установки хуков для git-репозитория
коммиты и не-ff слияния для этого репозитория будут предотвращены от
добавления секретов.
``--scan``
Сканирует один или несколько файлов на наличие секретов. Если файл содержит секрет,
совпавший текст из сканируемого файла будет выведен в stdout, и
скрипт завершится с ненулевым статусом. Каждая совпавшая строка будет выведена с
именем файла, который совпал, двоеточием, номером совпавшей строки,
двоеточием и затем текстом совпавшей строки. Если файлы не указаны,
сканируются все файлы, возвращаемые ``git ls-files``.
``--scan-history``
Сканирует репозиторий, включая все ревизии. Если файл содержит секрет,
совпавший текст из сканируемого файла будет выведен в stdout, и
скрипт завершится с ненулевым статусом. Каждая совпавшая строка будет выведена с
именем файла, двоеточием, номером строки, двоеточием и затем текстом строки.
``--list``
Выводит конфигурацию ``git-secrets`` для текущего репозитория или в глобальной
конфигурации git.
``--add``
Добавляет запрещённый или разрешённый шаблон.
``--add-provider``
Регистрирует поставщика секретов. Поставщики секретов — это исполняемые файлы, которые
при вызове выводят запрещённые шаблоны, которые ``git-secrets`` должен
считать запрещёнными.
``--register-aws``
Добавляет общие шаблоны AWS в git-конфиг и гарантирует, что ключи,
присутствующие в ``~/.aws/credentials``, не будут обнаружены ни в одном коммите.
Добавляются следующие проверки:
- Идентификаторы ключей доступа AWS через ``(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}``
- Ключи API Amazon Bedrock. Долгоживущие через ``ABSK[A-Za-z0-9+/]{109,}=*`` и краткосрочные через ``bedrock-api-key-YmVkcm9jay5hbWF6b25hd3MuY29t``
- Назначения секретных ключей доступа AWS через ":" или "=" с возможными кавычками
- Назначения идентификаторов аккаунта AWS через ":" или "=" с возможными кавычками
- Разрешённые шаблоны для примеров ключей AWS (``AKIAIOSFODNN7EXAMPLE`` и
``wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY``)
- Известные учётные данные из ``~/.aws/credentials``
.. note::
Хотя шаблоны, зарегистрированные этой командой, должны обнаруживать большинство
экземпляров учётных данных AWS, эти шаблоны **не гарантируют** их обнаружения
**всех**. ``git-secrets`` следует использовать как дополнительное средство
защиты — вам всё равно нужно проявлять должную осмотрительность, чтобы
не допустить добавления учётных данных в репозиторий.
``--aws-provider``
Поставщик секретов, который выводит учётные данные, найденные в INI-файле. Вы можете
дополнительно указать путь к INI-файлу.
Параметры для ``--install``
-f, --force
Перезаписывает существующие хуки, если они присутствуют.
<целевой-каталог>
При указании устанавливает git-хуки в заданный каталог. Если
<целевой-каталог> не указан, используется текущий каталог.
Если указанный ``<целевой-каталог>`` не находится в git-репозитории,
каталог будет создан, а хуки будут помещены в
``<целевой-каталог>/hooks``. Это может быть полезно для создания каталогов шаблонов git,
используемых с ``git init --template <целевой-каталог>``.
Вы можете выполнить ``git init`` в репозитории, который уже был инициализирован.
Из `документации git init <https://git-scm.com/docs/git-init>`_:
Из документации git: Выполнение ``git init`` в существующем репозитории
безопасно. Он не перезаписывает уже существующие файлы.
Основная причина повторного запуска ``git init`` — применить вновь добавленные
шаблоны (или переместить репозиторий в другое место, если указан
``--separate-git-dir``).
Устанавливаются следующие git-хуки:
1. ``pre-commit``: Используется для проверки, не содержат ли файлы, изменённые в коммите,
запрещённых шаблонов.
2. ``commit-msg``: Используется для определения, содержит ли сообщение коммита
запрещённые шаблоны.
3. ``prepare-commit-msg``: Используется для определения, приведёт ли коммит слияния
к истории, содержащей запрещённый шаблон в какой-либо точке.
Обратите внимание, что этот хук вызывается только для не-ff слияний.
.. note::
Git позволяет выполнять только один скрипт на хук. Если репозиторий
содержит подкаталоги в стиле Debian, такие как ``pre-commit.d``
и ``commit-msg.d``, то git-хуки будут установлены в эти
каталоги, предполагая, что вы настроили соответствующие
хуки на выполнение всех скриптов, находящихся в этих каталогах. Если
эти подкаталоги git отсутствуют, то git-хуки будут установлены
в каталог ``.git/hooks`` git-репозитория.
Примеры ^^^^^^^^
Установить git-хуки в текущий каталог::
cd /path/to/my/repository
git secrets --install
Установить git-хуки в репозиторий, отличный от текущего каталога::
git secrets --install /path/to/my/repository
Создать git-шаблон с установленным git-secrets, а затем скопировать этот
шаблон в git-репозиторий::
git secrets --install ~/.git-templates/git-secrets
git init --template ~/.git-templates/git-secrets
Перезаписать существующие хуки, если они присутствуют::
git secrets --install -f
Параметры для --scan
``-r, --recursive``
Сканирует указанные файлы рекурсивно. Если встречается каталог,
он будет просканирован. Если ``-r`` не указан, каталоги игнорируются.
``-r`` нельзя использовать вместе с ``--cached``, ``--no-index`` или
``--untracked``.
``--cached``
Ищет blobs, зарегистрированные в индексном файле.
``--no-index``
Ищет файлы в текущем каталоге, не управляемые git.
``--untracked``
В дополнение к поиску в отслеживаемых файлах в рабочем дереве,
``--scan`` также ищет в неотслеживаемых файлах.
``<файлы>...``
Путь к одному или нескольким файлам на диске для сканирования на секреты.
Если файлы не указаны, сканируются все файлы, возвращаемые ``git ls-files``.
Примеры
^^^^^^^^
Сканировать все файлы в репозитории::
git secrets --scan
Сканировать один файл на секреты::
git secrets --scan /path/to/file
Сканировать каталог рекурсивно на секреты::
git secrets --scan -r /path/to/directory
Сканировать несколько файлов на секреты::
git secrets --scan /path/to/file /path/to/other/file
Можно сканировать по маске::
git secrets --scan /path/to/directory/*
Сканировать из stdin::
echo 'hello!' | git secrets --scan -
Параметры для ``--list``
--global
Выводит только конфигурацию git-secrets из глобального git-конфига.
Параметры для --add
``--global``
Добавляет шаблоны в глобальный git-конфиг
``-l, --literal``
Экранирует специальные символы регулярных выражений в указанном шаблоне, так
что шаблон ищется буквально.
``-a, --allowed``
Помечает шаблон как разрешённый вместо запрещённого. Разрешённые шаблоны
используются для фильтрации ложных срабатываний.
``<шаблон>``
Регулярное выражение для поиска.
Примеры
^^^^^^^^
Добавить запрещённый шаблон в текущий репозиторий::
git secrets --add '[A-Z0-9]{20}'
Добавить запрещённый шаблон в глобальный git-конфиг::
git secrets --add --global '[A-Z0-9]{20}'
Добавить строку, которая ищется буквально (``+`` экранирован)::
git secrets --add --literal 'foo+bar'
Добавить разрешённый шаблон::
git secrets --add -a 'allowed pattern'
Параметры для ``--register-aws``
--global
Добавляет специфичные для AWS переменные конфигурации в глобальный git-конфиг.
Параметры для --aws-provider
``[<файл-учётных-данных>]``
Если указан, задаёт пользовательский путь к INI-файлу для сканирования. Если не
указан, используется ``~/.aws/credentials``.
Параметры для ``--add-provider``
--global
Добавляет поставщика в глобальный git-конфиг.
<команда>
Команда поставщика для вызова. При вызове команда должна выводить
запрещённые шаблоны, разделённые новыми строками, в stdout. Любые дополнительные аргументы
передаются команде.
Примеры ^^^^^^^^
Регистрирует поставщика секретов с аргументами::
git secrets --add-provider -- git secrets --aws-provider
Извлекает секреты из файла::
git secrets --add-provider -- cat /path/to/secret/file/patterns
Для определения, содержит ли коммит или сообщение коммита запрещённые шаблоны,
используются регулярные выражения, совместимые с egrep. Эти регулярные выражения
определяются с помощью команды git config. Важно отметить, что
в разных системах используются разные версии egrep. Например, при работе на
macOS вы будете использовать другую версию egrep, чем при работе, например, на
Ubuntu (BSD vs GNU).
Вы можете добавить запрещённые шаблоны регулярных выражений в свой git-конфиг с помощью
git secrets --add <шаблон>.
Иногда регулярное выражение может давать ложные срабатывания. Например, SHA коммитов git очень похожи на ключи доступа AWS. Вы можете указать множество различных шаблонов регулярных выражений как ложные срабатывания с помощью следующей команды:
::
git secrets --add --allowed 'my regex pattern'
Вы также можете добавить шаблоны регулярных выражений для фильтрации ложных срабатываний в
файл .gitallowed, находящийся в корневом каталоге репозитория. Строки, начинающиеся
с #, пропускаются (строка комментария), а пустые строки также пропускаются.
Сначала git-secrets извлекает все строки из файла, содержащие запрещённое совпадение. В результаты совпадений включается полный путь к имени файла, который был сопоставлен, затем ':', затем номер строки, которая была сопоставлена, и затем вся строка из файла, которая была сопоставлена с шаблоном секрета. Затем, если вы определили разрешённые регулярные выражения, git-secrets проверяет, соответствуют ли все сопоставленные строки хотя бы одному из ваших зарегистрированных разрешённых регулярных выражений. Если все строки, которые были помечены как секретные, отменяются разрешённым совпадением, то проверяемый текст не содержит секретов. Если хотя бы одна из сопоставленных строк не соответствует разрешённому регулярному выражению, то git-secrets отклоняет коммит/слияние/сообщение.
.. important::
Точно так же, как плохой практикой является добавление слишком «жадных» запрещённых шаблонов,
также плохой практикой является добавление слишком «снисходительных» разрешённых шаблонов.
Обязательно тестируйте свои шаблоны с помощью ad-hoc вызовов
``git secrets --scan $имя_файла``, чтобы убедиться, что они работают как задумано.
Иногда вам нужно проверить точное совпадение шаблона с набором известных
секретов. Например, вы можете гарантировать, что ни одни учётные данные, присутствующие в
~/.aws/credentials, никогда не появятся в коммите. В таких случаях лучше
оставить эти секреты в одном месте, а не распространять их по git-репозиториям
в git-конфигах. Вы можете использовать «поставщиков секретов» для получения таких
типов учётных данных. Поставщик секретов — это исполняемый файл, который при вызове
выводит запрещённые шаблоны, разделённые новыми строками.
Вы можете добавить поставщиков секретов с помощью команды --add-provider::
git secrets --add-provider -- git secrets --aws-provider
Обратите внимание на использование --. Это гарантирует, что любые аргументы, связанные с
поставщиком, передаются поставщику каждый раз при его вызове при сканировании
секретов.
Давайте рассмотрим пример. Дано следующее проверяемое текст (сохранён в
/tmp/example)::
This is a test!
password=ex@mplepassword
password=******
More test...
И следующие зарегистрированные шаблоны:
::
git secrets --add 'password\s*=\s*.+'
git secrets --add --allowed --literal 'ex@mplepassword'
Выполнение git secrets --scan /tmp/example приведёт
к следующей ошибке в выводе::
/tmp/example:3:password=******
[ERROR] Matched prohibited pattern
Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- Use --no-verify if this is a one-time false positive
Разберём это. Значение запрещённого шаблона password\s*=\s*.+ будет
соответствовать следующим строкам::
/tmp/example:2:password=ex@mplepassword
/tmp/example:3:password=******
...Но первое совпадение будет отфильтровано благодаря тому, что оно соответствует
разрешённому регулярному выражению ex@mplepassword. Поскольку осталась
строка, которая не была сопоставлена, она считается секретом.
Поскольку совпадающие строки помещаются в строки, начинающиеся с имени файла
и номера строки (например, /tmp/example:3:...), вы можете создавать разрешённые
шаблоны, которые учитывают имена файлов и номера строк в регулярном выражении.
Например, вы можете внести весь файл в белый список, используя что-то
вроде::
git secrets --add --allowed '/tmp/example:.*'
git secrets --scan /tmp/example && echo $?
# Вывод: 0
В качестве альтернативы вы можете разрешить конкретный номер строки файла, если эта строка вряд ли изменится, используя что-то подобное:
::
git secrets --add --allowed '/tmp/example:3:.*'
git secrets --scan /tmp/example && echo $?
# Вывод: 0
Помните об этом при создании разрешённых шаблонов, чтобы ваши разрешённые шаблоны случайно не совпали из-за того, что имя файла включено в проверяемый текст, с которым сравниваются разрешённые шаблоны.
Используйте параметр --no-verify в случае ложного срабатывания при
коммите, слиянии или сообщении коммита. Это пропустит выполнение
git-хука и позволит вам выполнить коммит или слияние.
Michael Dowling <https://github.com/mtdowling>_https://github.com/awslabs/git-secrets <https://github.com/awslabs/git-secrets>_Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.