
Фреймворк для тестирования решений по безопасности и фильтрации почты.
Тестовый фреймворк для решений по безопасности и фильтрации почты.
ВАЖНО: Не делайте ничего злого с этим! Тестирование облачных или иных хостинговых решений всегда должно быть одобрено тестируемым провайдером. Используйте только свои собственные тестовые аккаунты и не досаждайте никому кучей тестовых писем.
Фреймворк для тестирования безопасности почты работает с Python >=3.5. Просто клонируйте этот репозиторий и приступайте. Никаких дополнительных зависимостей не требуется.
Скрипт mail-tester.py запускает тесты. Прочитайте справку с помощью ./mail-tester.py --help и проверьте список
тестов и модулей обхода с помощью ./mail-tester.py -l, чтобы получить обзор возможностей и использования
скрипта. Несколько советов:
--smtp-server и --to.--. Эти конфигурационные файлы можно
использовать, вызвав ./mail-tester.py @tester.conf (конфигурация содержится в tester.conf).--to для тестирования различных конфигураций фильтров.--auto-delay для автоматического
ограничения скорости отправки писем. Это можно тонко настроить с помощью --delay-step, --delay-max и --delay.--spam-folder и --malware-folder. Образцы не включены в этот репозиторий (и не будут).
Хорошие места для получения вредоносного ПО — theZoo, Das Malwerk или
другие коллекции. Спам можно экспортировать прямо из вашей папки со спамом, но он должен быть в формате EML.--blacklist; они используются в качестве адресов отправителей.--evasion content-disposition. Они использовались
в прошлом для запутывания решений AV/песочниц и пропуска вредоносных писем.--log. Поставщики фильтрации почты часто отклоняют письма в диалоге SMTP,
что отражается в сгенерированном логе.--output в виде обычных файлов в каталог, в формате MBox (--mbox) или MailDir (--maildir).
Это полезно для тестирования почтовых клиентов без отправки писем, для документирования или проверки сгенерированных тестовых случаев.Собственные тесты можно реализовать с помощью класса в одном из существующих или вновь созданных файлов Python в каталоге tests/.
Класс должен быть подклассом MailTestBase, расположенного в модуле tests.base этого проекта. Вновь реализованные
тесты обнаруживаются автоматически, когда переменная класса active установлена в True. Кроме того (если вы планируете
вернуть тесты обратно в основной репозиторий), переменные класса identifier, name и description должны быть
установлены соответствующим образом.
Существуют следующие базовые классы с методами или переменными класса, предназначенными для переопределения:
MailTestBase: Базовый класс тестов для общих тестов.
generateTestCases(): Генерирует тестовые сообщения. Они должны создаваться с помощью классов MIME* из пакетов Python
email.mime.* или с помощью класса Message из email.message, чтобы обеспечить корректные почтовые сообщения.active: Логическое значение, указывающее, должен ли тест быть активным.identifier: Краткий идентификатор теста. Он используется для включения или отключения тестов в параметрах.name: Краткое название теста.description: Более длинное описание теста, должно укладываться примерно в 100 символов.delivery_sender и delivery_recipient: Логические значения, по умолчанию False. Обычно отправитель и получатели устанавливаются в
сообщении, и модуль Python SMTP берет их оттуда. Иногда желательно явно задать их в библиотеке SMTP, что можно
настроить, установив эти значения в True.finalizeMessage(msg): По умолчанию базовый класс теста устанавливает заголовки From и To соответствующим образом. Это
поведение можно переопределить, если это требуется для тестового случая.MailAttachmentTestBase: Базовый класс тестов для тестовых случаев с вложениями. Он генерирует полностью валидное письмо с темой
и текстовой частью и прикрепляет к нему тестовый случай. Производный от MailTestBase, поэтому методы/переменные из него
также могут быть переопределены здесь.
generateAttachments(): Генерирует тестовые случаи в виде кортежей (описание, вложение).subject: Устанавливает тему. Заполнитель {} заменяется описанием, полученным из
generateAttachments().generateTestCases(): уже переопределен реализацией генерации сообщений, описанной выше, но может быть дополнительно
адаптирован при необходимости.Настоятельно рекомендуется устанавливать темы создаваемых сообщений, чтобы можно было распознавать тесты во входящих письмах получателя.
Классы обхода реализуют методы для обхода распознавания определенных свойств писем решениями безопасности почты. В настоящее время реализован метод обхода, который пытается скрыть вложения от таких решений с помощью намеренно сломанных заголовков Content-Disposition.
Обходы реализуются с помощью паттерна фабричных классов. Класс DeliveryBase создает экземпляр фабричного класса, производного от
класса BaseEvasionFactory. Конструктор фабрики получает флаг, указывающий, активирован ли обход. Экземпляр
фабрики обхода затем передается классу теста и сохраняется в его атрибуте evasions, который содержит словарь
с идентификаторами обходов в качестве ключей. Внутри теста класс обхода (на основе EvasionBase) создается с помощью
`getEvasionGenerator()». Параметры конструктора определяются индивидуально для каждого метода обхода.
Для реализации обходов используются следующие базовые классы:
BaseEvasionFactory: Фабрики обходов должны быть основаны на этом классе. Обычно следует устанавливать только следующие
переменные класса:
active: Установите в True, если обход должен быть активным.identifier: Краткий идентификатор модуля обхода, используемый для его включения в конфигурации тестов.name: Краткое название метода обхода.description: Более длинное описание метода обхода. Должно укладываться примерно в 100 символов.generator_evasion: Класс обхода, который создается, если обход включен.generator_default: Класс обхода, который создается, если обход отключен.BaseEvasion: Реализация обходов должна быть подклассом этого базового класса. Следующий метод должен быть
переопределен:
__init__(): Должен создавать экземпляр класса с базовым сообщением или вложением, которое должно быть обработано методами
обхода.generate(): Применить метод обхода к объекту, переданному конструктору, и передать его вызывающему коду в виде
кортежа (описание, объект с примененным обходом).