Deadshot — это сканер запросов на включение, который ищет введение секретов через PR, сопоставляя каждую строку сравнения с набором известных секретных выражений.
Служба несет ответственность за:
Сервис НЕ:
Deadshot — это многоконтейнерное приложение Flask-Celery-Redis, которое устанавливается как приложение Github и запускается при каждом запросе на включение, созданном в основной ветке репозитория, в котором установлено приложение Github.
Контейнер Flask является точкой входа для службы, предоставляя маршруты API, определенные в blueprints.py. Как только полезная нагрузка запроса на извлечение получена на маршруте API, служба пересылает полезную нагрузку в очередь Redis, чтобы контейнер Celery мог ее подобрать и просканировать разницу запроса на включение. После того как контейнер сельдерея сканирует заданные секретные регулярные выражения, он комментирует запросы на запросы, Slack уведомляет канал группы безопасности или создает билет JIRA для последующей обработки командой. Приложение Github настроено с использованием URL-адреса Flask API и общего секрета, используемого для создания контрольной суммы SHA полезной нагрузки.
Один из способов настройки URL-адреса API — развертывание этого кода на хосте и назначение этому хосту балансировщика нагрузки приложения.
Примечание. При создании приложения убедитесь, что у вас есть готовый DNS для хоста, на котором вы будете развертывать контейнеры Deadshot, и безопасная секретная строка для секрета веб-перехватчика.
Администраторам Github необходимо будет создать и установить приложение Github на Github перед запуском или развертыванием приложения Deadshot. Чтобы узнать больше о создании приложения Github, прочтите это руководство.
Имя приложения: Deadshot (все строчные буквы. Это важно, поскольку служба использует это имя для получения предыдущих комментариев к PR)
URL-адрес вебхука: http(s)://your-hosted-deadshot-dns/api/v1/deadshot-webhook.
Чтобы протестировать это локально, вы можете создать конечную точку ngrok для передачи в раздел веб-перехватчика вашего приложения Github.
Чтобы это приложение работало, вашему приложению Github необходимо включить следующие разрешения и подписки на странице разрешений приложения Github: Разрешения репозитория:
Все остальные разрешения остаются неизменными, со значением по умолчанию «Нет доступа».
Подпишитесь на события:
Наконец нажмите «Создать приложение GitHub». После успешного создания приложения перейдите по ссылке «Создать закрытый ключ» в верхней части веб-страницы приложения.
После создания закрытого ключа сохраните его в безопасном месте. Этот сгенерированный закрытый ключ является одним из фрагментов данных, используемых для создания токена сеанса для взаимодействия с приложением.
После создания закрытого ключа установите приложение во всех организациях, которые вы хотите отслеживать.
Это многоконтейнерное приложение, предназначенное для запуска всех трех контейнеров (Flask, Celery, Redis) через /bin/run.sh, поэтому запуск образа Dockerfile должен открыть все приложение.
Три переменные ниже представляют собой однострочные значения, предоставленные пользователем.
Приведенные ниже переменные среды загружают путь к файлам с учетными данными. Прежде чем запускать приложение, загрузите значения ключей файла JSON в файлы, доступные здесь.
Примечание. Если вы не переместите расположение файлов секретов JSON, вам не нужно обновлять значения трех вышеуказанных переменных среды, уже присутствующих в Dockerfiles или docker-compose.yaml.
Эта команда будет использовать docker-compose.yaml для открытия всех контейнеров. Прежде чем запускать приведенную ниже команду, обновите файл Configuration/environment/localdev.env, указав значения, соответствующие вашей организации.
make serve
Как только вы это сделаете и не собираетесь использовать Dockerfile для обслуживания приложения, перейдите к разделу «Проверка работоспособности сервера».
Существует два способа создания и запуска Dockerfiles. В репозитории присутствуют четыре файла Dockerfile, три из которых используются для создания отдельного образа для каждого контейнера, необходимого для работы этого сервиса, а четвертый — это настройка Dockerfile для создания образа, который можно использовать либо для вызова Приложение Flask или работник сельдерея в зависимости от предоставленного значения переменной среды DEADSHOT_RUN_MODE (api или worker). Чтобы выполнить любой из приведенных ниже шагов, вам необходимо присутствовать в корневой папке репозитория.
Примечание. Убедитесь, что вы обновили переменные среды в файлах Dockerfile.api и Dockerfile.celery.
Для этого шага важны три файла Dockerfile. Dockerfile.api, Dockerfile.celery и Dockerfile.redis
docker build -f Dockerfile.api -t deadshot-api:<version> .
docker build -f Dockerfile.celery -t deadshot-worker:<version> .
docker build -f Dockerfile.redis -t deadshot-redis:<version> .
Все три образа, созданные на предыдущих шагах, работают в отдельных сетях, из-за чего они не смогут взаимодействовать друг с другом. Чтобы включить связь между контейнерами, нам нужно добавить их в контейнерную сеть.
docker network create deadshot-network
Запустите образы, используя созданную сеть, в следующем порядке: Запустите контейнер Redis:
docker run --net deadshot-network --name redis deadshot-redis:<version>
Запустите контейнер сельдерея:
docker run --net deadshot-network deadshot-worker:<version>
Запустите контейнер API Flask:
docker run --net deadshot-network -p 9001:9001 deadshot-api:<version>
Чтобы создать единый образ докера для вызова API и рабочего процесса сельдерея на основе переменной среды DEADSHOT_RUN_MODE.
make build
Эта команда также создаст образ Redis, необходимый для службы.
Если построенный образ запускается с переменной среды DEADSHOT_RUN_MODE=api, он запускает приложение Flask. Если образ запускается с переменной среды DEADSHOT_RUN_MODE=worker, то будет запущен рабочий процесс сельдерея.
Теперь, когда API готов принимать запросы, переходящие по адресу http://localhost:9001/api/v1/heartbeat
в браузере, он должен возвращать действительный ответ, или вы можете выполнить завиток.
curl localhost:9001/api/v1/healthcheck
Оба должны показать следующее сообщение: {"healthcheck": "ready"}
Если у вас есть полезная нагрузка веб-перехватчика приложения Github для вашего запроса на извлечение, вы можете запустить следующую команду curl локально, чтобы протестировать свое приложение:
curl -X POST -H " content-type: application/json " -H " X-GitHub-Enterprise-Host: github.mockcompany.com " -H " X-Hub-Signature: sha1=85df4936c6396c149be94144befab41168149840 " -H " X-GitHub-Event: pull_request " -d @tests/fixtures/good_pr.json http://localhost:9001/api/v1/deadshot-webhook
Если вы хотите, чтобы инструмент отслеживал другие типы секретов, добавьте регулярные выражения в файл regex.json.
Примечание. Флаг проверки энтропии позволяет искать результаты с высокой энтропией в дополнение к совпадению с регулярным выражением.
В настоящее время Deadshot тестировался только с Github Enterprise, но должен работать и с облаком Github.