
Инструмент для захвата всех git-секретов с использованием нескольких инструментов поиска с открытым исходным кодом
git-all-secrets — это инструмент, который может:
Сканирование выполняется несколькими инструментами с открытым исходным кодом, такими как:
ПРИМЕЧАНИЕ — при необходимости в будущем можно добавить и другие подобные инструменты!
ПРИМЕЧАНИЕ — Сканирование может выполняться всеми инструментами или любым одним из них, указав флаг toolName.
Если для сканирования используются все инструменты, итоговый вывод объединяет результаты всех файлов от всех инструментов в один консолидированный файл.
Самый простой способ запустить git-all-secrets — через Docker, и я настоятельно рекомендую установить Docker, если у вас его ещё нет. После установки Docker:
docker run --rm -it abhartiya/tools_gitallsecrets --help, чтобы понять, какие различные флаги он может принимать.docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<>. Вы также можете указать конкретный инструмент для сканирования, введя что-то вроде docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<> -toolName=<>. Допустимые значения — thog и repo-supervisor.thogEntropy следующим образом: docker run -it abhartiya/tools_gitallsecrets -token=<> -org=<> -toolName=thog -thogEntropy.docker ps -a.docker cp <container-id>:/root/results.txt ..-token = Персональный токен доступа GitHub. Он нужен, потому что неаутентифицированные запросы к API GitHub быстро достигают ограничения по количеству запросов!
-org = Название организации для сканирования. Будет сканировать все публичные репозитории в организации + все репозитории и gists всех пользователей в организации. Если вы используете токен пользователя, являющегося частью этой организации, он также клонирует и сканирует все секретные gists этого пользователя, а также все приватные репозитории в организации, к которым у пользователя есть доступ. Однако он НЕ будет клонировать и сканировать любые приватные репозитории этого пользователя, принадлежащие этой организации. Для сканирования приватных репозиториев пользователей используйте флаг scanPrivateReposOnly вместе с флагом user и SSH-ключом, смонтированным в томе.
-user = Имя пользователя для сканирования. Будет сканировать все репозитории и gists этого пользователя. Если предоставленный токен является токеном этого пользователя, секретные gists также будут клонированы и отсканированы. Но будут клонированы и отсканированы только публичные репозитории. Для сканирования приватных репозиториев этого пользователя используйте флаг scanPrivateReposOnly вместе с флагом user и SSH-ключом, смонтированным в томе.
-repoURL = HTTPS URL репозитория для сканирования. Будет сканировать только этот репозиторий. Для публичных репозиториев достаточно указать https URL. Однако, если вы хотите сканировать приватный репозиторий, вам нужно указать URL вместе с SSH-ключом, смонтированным в томе, и флагом .
Флаг token обязателен. Он не может быть пустым.
Флаги org, user, repoURL и gistURL не могут быть все пустыми одновременно. Вам нужно указать только одно из этих значений. Если вы укажете все или несколько значений вместе, порядок приоритета будет следующим: org > user > repoURL > gistURL. Например, если вы укажете оба флага -org=secretorg123 и -user=secretuser1 вместе, инструмент сообщит, что ему не нужно ничего вместе со значением org. Чтобы запустить его только для конкретного пользователя, нужно указать только флаг user, а не org.
Самый безопасный способ сканировать приватные репозитории — клонировать, используя SSH URL. Для этого нужно разместить соответствующий SSH-ключ, который был добавлен в учётную запись GitHub. У GitHub есть полезная документация по настройке вашей учётной записи. Убедитесь, что этот ключ не имеет парольной фразы. Получив SSH-ключ, просто смонтируйте его в контейнер Docker через том. Это так же просто, как ввести команды ниже:
docker run -it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -user=<> -scanPrivateReposOnly
ИЛИ
docker run -it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -repoURL=<> -scanPrivateReposOnly
Здесь я сопоставляю свой личный SSH-ключ id_rsa_personal, хранящийся локально, с /root/.ssh/id_rsa внутри контейнера, чтобы git-all-secrets пытался клонировать репозиторий через ssh и использовал SSH-ключ, хранящийся по пути /root/.ssh/id_rsa внутри контейнера. Таким образом, вы на самом деле не храните ничего конфиденциального внутри контейнера. Вы просто используете файл с вашего локального компьютера. После уничтожения контейнера он больше не имеет доступа к этому ключу.
API GitHub ограничивает обстоятельства, при которых сообщается о приватном репозитории. Если вы пытаетесь сканировать организацию с пользователем, который не является администратором, вам может потребоваться указать команду, которая предоставляет пользователю доступ к репозиторию. Для этого используйте флаг teamName вместе с флагом org. Пример ниже:
docker run --it -v ~/.ssh/id_rsa_personal:/root/.ssh/id_rsa abhartiya/tools_gitallsecrets -token=<> -org=<> -teamName <>
git-all-secrets теперь также поддерживает сканирование Github Enterprise. Если у вас есть собственный Github Enterprise, размещённый за VPN или чем-то подобным, убедитесь, что вы подключены к VPN или находитесь в правильной сети, имеющей доступ к репозиториям Github Enterprise. enterpriseURL — это то, что вам нужно для сканирования ваших репозиториев Github Enterprise. Ниже приведены несколько примеров:
Пример 1:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -repoURL https://github.<org>.com/<user>/<repo>.git
Здесь я монтирую SSH-ключ Github Enterprise в контейнер, затем указываю свой персональный токен доступа, URL предприятия, на который будут отправляться запросы, и репозиторий, который я хочу отсканировать.
Пример 2:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -repoURL https://github.<org>.com/<user>/<repo>.git -toolName thog -thogEntropy
Выше я запускаю только truffleHog против репозитория с настройками энтропии.
Пример 3:
docker run -it -v ~/.ssh/id_rsa_gitenterprise:/root/.ssh/id_rsa -token <token> -enterpriseURL https://github.<org>.com/api/v3 -user <username> -scanPrivateReposOnly
Выше я сканирую только приватные репозитории пользователя, чей токен предоставлен, всеми инструментами (repo-supervisor и thog), но без настройки энтропии truffleHog.
rules.json и включать его при выполнении docker run с помощью аргумента -v $(pwd)/rules.json:/root/truffleHog/rules.json.git-all-secrets.Я просмотрел большое количество инструментов с открытым исходным кодом, которые потенциально можно использовать для поиска секретов в репозиториях GitHub. Некоторые из лучших инструментов, которые я счёл хорошими: gitrob, truffleHog и git-secrets.
Gitrob — это автономный инструмент, который довольно сложно интегрировать с другими инструментами, потому что у него есть собственная база данных и интерфейс для просмотра всех обнаруженных секретов. Он также создаёт огромное количество ложных срабатываний, больше, чем truffleHog. И он не выделяет обнаруженные секреты. Он просто смотрит на файлы и их расширения, а не на фактическое содержимое. Таким образом, хотя Gitrob — отличный инструмент для начала, я бы рекомендовал запускать его время от времени, чтобы понять, как выглядит поверхность атаки, и проверить, изменилась ли она.
Затем есть truffleHog, который ищет секреты в фактическом содержимом файла, анализируя энтропию Шеннона, и выводит результаты на экран. Он принимает URL репозитория или директорию репозитория в качестве аргумента. Это довольно хороший инструмент, хотя у него тоже есть доля ложных срабатываний. Некоторые другие недостатки:
Наконец, есть git-secrets, который может помечать такие вещи, как секреты AWS. Лучшая часть — вы также можете добавлять свои собственные регулярные выражения для секретов, которые, как вы знаете, он должен искать. Основной недостаток — он не очень хорошо находит строки с высокой энтропией, как это делает truffleHog. Вы также можете сканировать только конкретную директорию, которая является репозиторием, поэтому рекурсивное сканирование из директории с репозиториями также невозможно.
Итак, как видите, есть достойные инструменты, но их нужно было как-то объединить. Также была необходимость рекурсивно сканировать несколько репозиториев, а не только один. А что насчёт gists? Есть организации и пользователи. Есть репозитории для организаций и пользователей. Также есть gists пользователей. Всё это должно быть отсканировано. И отсканировано таким образом, чтобы это можно было автоматизировать и легко использовать другими инструментами/фреймворками.
2/9/19 — Добавлен флаг blacklist для пропуска некоторых имён репозиториев при сканировании. Спасибо @sjqnn за PR. Собрал и опубликовал новый Docker-образ. Удачи!
7/31/18 — Упрощена установка trufflehog с помощью pip. @mhmdiaa исправил ошибку в функции вывода trufflehog, из-за которой объединение и сортировка работали неправильно. Обновлён файл регулярных выражений, добавлены такие вещи, как password. Собрал и опубликовал новый Docker-образ. Удачи!
7/15/18 — Обновлён форк repo-supervisor, так как в оригинальном репозитории были изменения. Пересобран новый Docker-образ с использованием последней версии Trufflehog. Предоставлен файл rules.json, содержащий все регулярные выражения, которые Trufflehog использует для поиска секретов. Добавлена возможность объединять результаты (в JSON) для обоих инструментов с помощью флага -mergeOutput. Значительно уменьшен размер Docker-образа за счёт использования многоступенчатой сборки и dep для управления зависимостями. Огромное спасибо @mhmdiaa за всё это!
12/12/17 — Для некоторых больших репозиториев truffleHog завершается с ошибкой и выходит. Но мы не хотим останавливаться на этом. Мы хотим уведомить пользователя, что сканирование этого репозитория не удалось, и продолжить сканирование других. Теперь это реализовано в последнем Docker-образе.
12/11/17 — Удалён gitsecrets, так как truffleHog теперь поддерживает функциональность регулярных выражений. Простое добавление своих регулярных выражений в файл rules.json и пересборка Docker-образа даёт нам функциональность, которую ранее предоставлял gitsecrets, поэтому необходимость в gitsecrets отпала. Также добавлена поддержка сканирования репозиториев и gists Github Enterprise. @high-stakes помог сделать PR, который (надеюсь) исправляет ошибку Goroutine, ограничивая количество потоков. Наконец, также была добавлена поддержка сканирования приватных репозиториев для организации.
12/08/17 — Удалён мой собственный форк truffleHog. Теперь используется оригинальная версия вместе с функциональностью регулярных выражений truffleHog + режим энтропии. Скоро, я полагаю, мы сможем заменить и gitsecrets, и repo-supervisor только truffleHog, как только некоторые проблемы будут исправлены.
Если хотите выразить поддержку, мой BTC-кошелёк: 1PtMhXWCcMZCitcDfaEBe7jnV9sjKoNvq7.
sshscanPrivateReposOnly-gistURL = HTTPS URL gist для сканирования. Будет сканировать только этот gist. Нет понятия публичного или секретного gist, пока у вас есть URL. Даже если у вас есть секретный gist, если кто-то знает HTTPS URL вашего секретного gist, он также может получить к нему доступ.
-output = Имя файла, в который будут сохранены все результаты. По умолчанию — results.txt.
-cloneForks = Необязательный булевый флаг для клонирования форков репозиториев организации и пользователя. По умолчанию установлен в 0, т.е. форки не клонируются. Если форки нужно клонировать, значение должно быть 1. Или просто укажите -cloneForks вместе с другими флагами.
-orgOnly = Необязательный булевый флаг для пропуска клонирования репозиториев пользователей, принадлежащих организации. По умолчанию установлен в 0, т.е. обычное поведение. Если репозитории пользователей не нужно сканировать, а нужно сканировать только репозитории организации, значение должно быть 1. Или просто укажите -orgOnly вместе с другими флагами.
-toolName = Необязательный строковый флаг для указания, какой инструмент использовать для сканирования. По умолчанию установлен в all, т.е. будут использоваться и thog, и repo-supervisor. Допустимые значения: thog или repo-supervisor.
-teamName = Имя команды организации, которая имеет доступ к приватным репозиториям для сканирования. Этот флаг не до конца протестирован, поэтому я не могу гарантировать его работоспособность.
-scanPrivateReposOnly = Необязательный булевый флаг для указания, хотите ли вы сканировать только приватные репозитории пользователя. Его указание НЕ будет сканировать публичные репозитории пользователя. И вам нужно предоставить SSH-ключ, смонтировав том в контейнер. Кроме того, это работает только с флагами user, repoURL или org.
При использовании флага org вместе с флагом scanPrivateReposOnly и без флага orgOnly будет сканировать публичные И приватные репозитории этой организации, к которым имеет доступ пользователь (чей токен предоставлен). Затем он продолжит сканировать ТОЛЬКО приватные репозитории пользователя (чей токен предоставлен). Наконец, он продолжит сканировать все публичные и секретные gists этого пользователя (чей токен предоставлен). Вкратце, флаг scanPrivateReposOnly действительно влияет только на флаги user и repoURL.
-enterpriseURL = Необязательный флаг для указания URL Github Enterprise, если вы хотите сканировать корпоративные репозитории. Должно быть что-то вроде https://github.org.com/api/v3 вместе с SSH-ключом, смонтированным в контейнер. См. сканирование github enterprise ниже.
-threads = Значение по умолчанию 10. Это для ограничения количества потоков, если ваша система недостаточно мощная. В большинстве случаев значение 10 должно подходить.
-thogEntropy = Необязательный флаг, который указывает, хотите ли вы получать секреты на основе высокой энтропии от truffleHog или нет. Секреты с высокой энтропией от truffleHog создают МНОГО шума, поэтому, если вы не хотите весь этот шум и запускаете git-all-secrets на большой организации, я рекомендую не указывать этот флаг. По умолчанию установлен в False, то есть truffleHog будет выдавать результаты только на основе регулярных выражений из файла rules.json. Если вы сканируете относительно небольшую организацию с ограниченным набором репозиториев или пользователя с несколькими репозиториями, указание этого флага имеет больше смысла.
-mergeOutput = Необязательный флаг для объединения и дедупликации вывода используемых инструментов (в настоящее время truffleHog и repo-supervisor). Значение по умолчанию — False.
-blacklist = Имена репозиториев, указанные через запятую, которые НЕ должны сканироваться.
При указании флага scanPrivateReposOnly:
-v.ssh URL при использовании этого флага, а не https URL.См. сканирование приватных репозиториев ниже.
При указании teamName важно, чтобы предоставленный token принадлежал пользователю, который является членом команды. В противном случае могут возникнуть непредвиденные результаты. См. сканирование команды организации ниже.
При указании флага enterpriseURL он всегда будет использовать SSH URL, даже если вы укажете https URL репозитория. Всё корпоративное клонирование/сканирование происходит через ssh URL, а не https URL.
Как упоминалось выше, убедитесь, что используемый SSH-ключ (для сканирования ssh URL) не имеет парольной фразы.
12/07/17 — Обновлена документация с дополнительными подробностями и пояснениями по различным флагам.
12/05/17 — Добавлена поддержка сканирования приватных репозиториев через SSH-ключ. Это была просьба в течение длительного времени, и теперь это стало возможным. Также изменена схема тегов Docker-образа. Теперь последний образ будет иметь тег latest. А все предыдущие версии будут помечены номером. Всё это стало возможным благодаря команде SimpliSafe, и особенно Мэттью Коксу (https://github.com/matthew-cox). Огромное спасибо тебе, Мэтт!
10/14/17 — Собран и опубликован новый образ abhartiya/tools_gitallsecrets:v6. В этом новом образе используется более новая версия git-secrets, а также repo-supervisor, то есть я объединил некоторые изменения из upstream в свой форк вместе с некоторыми дополнительными изменениями, которые я уже внёс в свой форк. Новый образ использует эти изменения, так что всё самое новое и лучшее!* 14.10.17 — Собрал и опубликовал новый образ abhartiya/tools_gitallsecrets:v5. Этот образ исправляет очень глупую и раздражающую ошибку, которая, возможно, приводила к сбою repo supervisor. Изменился способ чтения значений переменных окружения в Dockerfile, из-за чего repo supervisor перестал понимать, какой путь к node использовать. Ад с Node!
29.09.17 — Собрал и опубликовал новый образ с флагом orgOnly — abhartiya/tools_gitallsecrets:v4
22.08.17 — Добавлен переключатель -orgOnly от kciredor: анализирует указанный репозиторий организации и пропускает репозитории пользователя.
26.06.17 — Убрал часть вывода в repo-supervisor, которая печатала ошибки, когда секреты не найдены. Лишний вывод! Собрал и опубликовал новый образ — abhartiya/tools_gitallsecrets:v3
25.06.17 — Добавлен флаг toolName для указания, какой инструмент использовать для сканирования. Собрал и опубликовал новый образ — abhartiya/tools_gitallsecrets:v2
14.06.17 — Добавил repo-supervisor в качестве инструмента сканирования, также обновил и добавил номер версии в docker-образ — abhartiya/tools_gitallsecrets:v1
14.06.17 — Добавлен флаг cloneForks для предотвращения клонирования форков репозиториев организации и пользователя. По умолчанию он равен false. Если вы хотите сканировать форки, просто установите значение 1, т.е. -cloneForks=1