
Фреймворк для тестирования решений по безопасности и фильтрации почты.
Тестовый фреймворк для решений по безопасности и фильтрации почты.
ВАЖНО: Не делайте ничего злого с этим! Тестирование облачных или иных хостинговых решений всегда должно быть одобрено тестируемым провайдером. Используйте только свои собственные тестовые аккаунты и не досаждайте никому кучей тестовых писем.
Фреймворк для тестирования безопасности почты работает с 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: Логические значения, по умолчанию . Обычно отправитель и получатели устанавливаются в
сообщении, и модуль Python SMTP берет их оттуда. Иногда желательно явно задать их в библиотеке SMTP, что можно
настроить, установив эти значения в .Настоятельно рекомендуется устанавливать темы создаваемых сообщений, чтобы можно было распознавать тесты во входящих письмах получателя.
Классы обхода реализуют методы для обхода распознавания определенных свойств писем решениями безопасности почты. В настоящее время реализован метод обхода, который пытается скрыть вложения от таких решений с помощью намеренно сломанных заголовков Content-Disposition.
Обходы реализуются с помощью паттерна фабричных классов. Класс DeliveryBase создает экземпляр фабричного класса, производного от
класса BaseEvasionFactory. Конструктор фабрики получает флаг, указывающий, активирован ли обход. Экземпляр
фабрики обхода затем передается классу теста и сохраняется в его атрибуте evasions, который содержит словарь
с идентификаторами обходов в качестве ключей. Внутри теста класс обхода (на основе EvasionBase) создается с помощью
`getEvasionGenerator()». Параметры конструктора определяются индивидуально для каждого метода обхода.
Для реализации обходов используются следующие базовые классы:
BaseEvasionFactory: Фабрики обходов должны быть основаны на этом классе. Обычно следует устанавливать только следующие
переменные класса:
active: Установите в True, если обход должен быть активным.identifier: Краткий идентификатор модуля обхода, используемый для его включения в конфигурации тестов.name: Краткое название метода обхода.description: Более длинное описание метода обхода. Должно укладываться примерно в 100 символов.generator_evasion: Класс обхода, который создается, если обход включен.generator_default: Класс обхода, который создается, если обход отключен.BaseEvasion: Реализация обходов должна быть подклассом этого базового класса. Следующий метод должен быть
переопределен:
__init__(): Должен создавать экземпляр класса с базовым сообщением или вложением, которое должно быть обработано методами
обхода.generate(): Применить метод обхода к объекту, переданному конструктору, и передать его вызывающему коду в виде
кортежа (описание, объект с примененным обходом).В общем, класс обхода должен выдавать все варианты обхода и передавать вариант по умолчанию как отдельный тестовый случай, в то время как классы обхода по умолчанию просто передают заданный объект или создают необходимые структуры данных, такие как заголовки.
Методы обхода используются в тестовых случаях, где они применимы. Например, если метод обхода изменяет заголовок письма или вложения, необходимо реализовать следующие шаги:
self.evasions, например:
evasion_items = self.evasions["evasion_identifier"].getEvasionGenerator(message)for evasion_item in evasion_items:
yield evasion_item
Метод обхода Content-Disposition уже реализован в фреймворке и должен использоваться для всех тестовых случаев,
направленных на распознавание вредоносных вложений. Конструктор получает вложение и предполагаемое имя файла.
Затем класс обхода возвращает кортежи (имя обхода, вложение с примененным методом обхода), которые могут быть
напрямую возвращены методом generateAttachments() теста.
finalizeMessage(msg): По умолчанию базовый класс теста устанавливает заголовки From и To соответствующим образом. Это
поведение можно переопределить, если это требуется для тестового случая.MailAttachmentTestBase: Базовый класс тестов для тестовых случаев с вложениями. Он генерирует полностью валидное письмо с темой
и текстовой частью и прикрепляет к нему тестовый случай. Производный от MailTestBase, поэтому методы/переменные из него
также могут быть переопределены здесь.
generateAttachments(): Генерирует тестовые случаи в виде кортежей (описание, вложение).subject: Устанавливает тему. Заполнитель {} заменяется описанием, полученным из
generateAttachments().generateTestCases(): уже переопределен реализацией генерации сообщений, описанной выше, но может быть дополнительно
адаптирован при необходимости.