
Автоматизированный, воспроизводимый фреймворк для тестирования безопасности сети, использующий Ansible и BATS для проверки DNS, доступности хостов, открытых портов и конфигурации TLS из нескольких точек обзора.
Этот проект использует Ansible для генерации тестовых файлов BATS, проверяющих допущения безопасности о сетевой инфраструктуре. Тесты запускаются с probe-машин ("узлов-зондов"), на которые развернут Prober.
Этот инструмент предназначен для воспроизводимого автоматизированного тестирования собственных сетей. Он поддерживает несколько узлов-зондов, выполняющих тесты, каждый со своим представлением тестируемой сети — например, из внешней зоны, из внутренней зоны и из DMZ.
Использование Prober для сканирования сетей, на которые у вас нет разрешения, может быть незаконным.
На Ansible master, используемом для развертывания тестов на узлах-зондах:
ansible (очевидно!)python*-netaddr (на GNU/Linux) / py*-netaddr (на FreeBSD)На самих узлах-зондах:
bashsshnmapdig/kdigtestsslНа системе, где вы просматриваете результаты (файлы *.tap), возможно, стоит установить tappy. Результаты хранятся на каждом узле-зонде в локальных git-репозиториях (по умолчанию в /var/run/prober/results/, см. ниже параметры конфигурации), с коммитами, помеченными датой завершения каждого сканирования, для ведения истории и удобного сравнения.
Ansible используется для генерации тестов на узлах-зондах. Узлом-зондом может быть любой хост FreeBSD или GNU/Linux, если на него можно установить зависимости Prober. Он не обязательно должен быть выделен только для тестирования, но это рекомендуется — сканирование сети разумного размера займет часы, потребует много процессора и создаст значительный трафик.
Имеет смысл развернуть Prober на нескольких разных машинах, чтобы проверить, как ваша сеть выглядит с разных точек обзора (например: внутренняя сеть, DMZ, Интернет).
В тестовом каталоге на узлах-зондах создается скрипт run-tests.sh для упрощения запуска тестов. Тесты запускаются таким образом, чтобы одновременно выполнялось <simultaneous_tests_count> тестов — эта переменная является основным способом контроля того, сколько ресурсов использует сканирование и сколько пропускной способности ему требуется.
Затем результаты тестов сохраняются в локальном git-репозитории, с коммитами, помеченными датой завершения запуска (которая может отличаться от даты начала для некоторых длительных сканирований).
При работе с инфраструктурой, состоящей более чем из нескольких хостов, может иметь смысл использовать такой инструмент, как Mitogen, чтобы значительно ускорить генерацию тестов.
Подготовьте сервер Debian или FreeBSD для использования в качестве узла-зонда (назовем его prober.example.com), убедитесь, что у вас есть SSH-доступ к нему и возможность выполнять sudo.
Скопируйте пример инвентаризации как inventories/test/.
В этой инвентаризации test:
group_vars/all.yml и установите zone_nameserver, zone_domains, address_blocks по своему усмотрению; предположим, вы добавили example.com как единственный домен для сканированияhosts, настроив ваш узел-зонд prober.example.com в разделе [prober-nodes]; скажем, вы установили в .Теперь вы можете выполнить ssh на узел-зонд и просмотреть сгенерированные тесты в /opt/prober/. Когда вы будете удовлетворены, вы можете запустить их, выполнив: /opt/prober/run_tests.sh. Результаты будут сохранены в /var/run/prober/results.
Переменные конфигурации (определены в probers.yml):
tests_directory (по умолчанию: /opt/prober):
директория на узлах-зондах, куда генерируются тестовые файлы (файлы *.bats).
results_repo_directory (по умолчанию: /var/run/prober/results)
директория репозитория для результатов тестов (файлов *.tap); там инициализируется git-репозиторий и создается поддиректория tap/ для самих результатов; результаты коммитятся в git-репозиторий, коммиты помечаются датой в формате гггг-мм-дд (например, коммит с результатами теста, завершившегося 19 марта 2020 года, помечен как 2020-03-19).
simultaneous_tests_count (по умолчанию: 20):
сколько тестов выполняется одновременно.
prober_dev (по умолчанию: не определено):
пропускать некоторые задачи, не имеющие смысла на dev-машине (например, настройку cron или ).
Зоны определяются в файлах ./data/<zone_name>.yml, где корневым ключом является строка "tested_zone_settings", которая затем содержит ключи:
name: имя зоны, соответствующее имени файла (без расширения); например: "internal", "external", "dmz"default (опционально): настройки по умолчанию для всех хостов в этой зоне^"), соответствующие нескольким FQDNКлюч default, каждый ключ-регулярное выражение и каждый доменный ключ, в свою очередь, могут содержать следующие ключи:
resolve: должен ли хост разрешаться в соответствующий IP-адрес (bool true/false или строка "skip")ping: должен ли хост отвечать на ping (bool true/false или строка "skip")ports: список TCP и UDP портов, которые могут быть открыты (подключи "tcp" и "udp", каждый содержит массив целых чисел, определяющих разрешенные для открытия порты, или строку "skip"), и порты с поддержкой TLS для более глубокой проверки (подключ tls, содержащий словарь с номерами портов в качестве ключей и типом TLS-сервиса или словом "skip" в качестве значения)
является сокращением для:
Типы TLS-сервисов — это любые, поддерживаемые для опции , для HTTPS-теста (включая заголовки) или "" для общего TLS-теста.
: TLS-тесты выполняются, если порт также не отмечен как открытый в ключе "".Пример конфигурации можно посмотреть здесь.
Глобальные значения по умолчанию определены в probers.yml. Затем для каждого проверяемого хоста они объединяются (с помощью combine) с соответствующими настройками зоны по умолчанию, затем с ключами-регулярными выражениями, соответствующими данному hostname, и наконец с конкретными настройками хоста.
Это означает, что настройки конкретных хостов в данной зоне имеют приоритет над настройками из ключей, соответствующих регулярным выражениям, которые, в свою очередь, имеют приоритет над настройками зоны по умолчанию, которые, в свою очередь, имеют приоритет над глобальными настройками по умолчанию.
Ключ ports обрабатывается немного особым образом: если определенные порты перечислены где-то в цепочке наследования конфигурации, их невозможно исключить ниже по цепочке, можно только добавить дополнительные номера портов или полностью пропустить тесты для всех портов данного протокола ("skip").
Файлы зон выбираются на основе переменной tested_zone, установленной для каждого узла-зонда.
Некоторые тесты имеют смысл в контексте отдельных IP-адресов, независимо от того, сколько доменов/hostnames на них разрешается; например, проверка, открыты ли определенные порты. Допустим, a.example.com и b.example.com указывают на один и тот же IP-адрес. В конфигурации из примера выше это означает, что порты 8080/tcp и 8443/tcp должны быть открыты, а на порту 8443/tcp ожидается HTTPS.
Некоторые тесты имеют смысл в контексте комбинаций конкретного домена/hostname и IP-адреса; например, если TLS-сертификат, предоставленный для определенного доменного имени на определенном IP-адресе, является действительным.
Эти два типа тестов реализуются путем генерации двух отдельных списков целей:
<ip-address> <hostname1> (<hostname2> <hostname3> ... <hostnameN>)<ip-address> <hostname>Затем некоторые тестовые файлы генерируются только для целей из первого списка (например, тестирование открытых портов), а некоторые — только для целей из второго списка (например, связанные с TLS).
Некоторые тесты не имеют смысла, если определенные порты не открыты. Тесты, связанные с TLS, генерируются для данного хоста, только если в данной зоне какие-либо соответствующие TCP-порты настроены как open.
По умолчанию, если какой-либо из общеизвестных портов с поддержкой TLS настроен как открытый в ключе ports.tcp, для них будут сгенерированы TLS-тесты. Список общеизвестных портов с поддержкой TLS определен в переменной default_host_settings.
В целом, отличие Prober от многих других подобных инструментов или сервисов обычно сводится к некоторой комбинации следующих факторов:
Shodan сканирует Интернет в поисках открытых систем. Prober сканирует вашу собственную инфраструктуру, чтобы проверить ваши предположения о ней, из сколь угодно многих точек обзора. Он ориентирован на воспроизводимость результатов с помощью четко определенных тестов и регулярных запланированных запусков и пытается предоставить логический результат "пройдено/не пройдено" для каждого из проверяемых допущений (с возможностью просмотра полных данных сканирования).
BitSight проверяет свои представления о разумных допущениях относительно вашей инфраструктуры, не давая вам контроля или информации о том, когда именно будет проводиться сканирование, а также не предоставляя необработанные данные сканирования. Prober проверяет ваши допущения о вашей инфраструктуре, делает это по вашему расписанию и предоставляет полные необработанные данные для просмотра.
Natlas, похоже, ближе к Shodan (сканирование для поиска открытых хостов, отображение результатов в ответ на запросы), но с возможностью самостоятельного размещения (и, следовательно, запуска агента Natlas в разных местах внутри и за пределами вашей инфраструктуры, как узлы Prober). Prober выполняет регулярные сканирования вашей инфраструктуры для проверки ваших собственных допущений о ней, выраженных в конфигурации.
Логотип основан на Увеличительном стекле от verry obito, ID; CC-By и Сети от Creative Stall, PK; CC-By через the Noun Project.
tested_zonetestСкопируйте пример конфигурации зоны как data/<tested_zone>.yml (в нашем случае: data/test.yml) и отредактируйте его; как минимум, ключ tested_zone_settings.name должен содержать tested_zone (то есть test).
Экспортируйте вашу DNS-зону и сохраните как data/<dns_zone>.zone (в нашем случае: example.com).
Запустите плейбук:
ansible-playbook prober.yml -i inventories/test/ -vvv
Это сгенерирует тесты на узле-зонде и настроит задачу cron для их запуска каждую ночь в 01:00.
zabbixports: "skip"ports:
tcp: "skip"
udp: "skip"
tls: "skip"
-t/--starttls"https"tlstcpskip: следует ли полностью пропустить хост (логическое значение)