Проверка security.txt

Введите сайт и узнайте, сообщает ли он исследователям безопасности, куда сообщать о проблеме, и лежит ли этот файл в правильном месте, корректен ли он и не истёк ли его срок. Если файла нет, его можно составить ниже.

Важен только хост: у example.com и shop.example.com свои отдельные файлы.

Или попробуйте github.com, cloudflare.com, wikipedia.org

Составить security.txt

Заполните то, что подходит, и скопируйте результат. Файл собирается прямо на этой странице: ничего из введённого здесь нам не отправляется.

Адрес электронной почты или адрес формы https://. Используйте общий ящик, а не личный: люди уходят.

Страница, где сказано, что можно тестировать и чего автор сообщения может от вас ожидать.

Коды языков через запятую.

Добавляет строку Canonical, которая привязывает файл к его адресу.

По умолчанию через год от сегодняшнего дня: это максимальный срок, который рекомендует стандарт.

  1. Сохраните текст в файл с именем security.txt в кодировке UTF-8.
  2. Загрузите его в папку .well-known в корне сайта, чтобы он открывался по адресу https://your-domain/.well-known/security.txt.
  3. Запустите проверку выше: файл должен приходить по HTTPS как text/plain.
  4. Внесите дату истечения в календарь. Просроченный файл хуже, чем никакого: он выглядит заброшенным.

Парадная дверь для плохих новостей

Рано или поздно кто-то со стороны замечает неладное на вашем сайте: страницу, где видны заказы других клиентов, забытую админ-панель, сброс пароля, который можно повторить. Большинство таких людей хотят вам сообщить. Сложность в том, чтобы найти, кому сообщить. Форма обратной связи уходит в отдел продаж, чат поддержки требует номер заказа, а на info@ никто не отвечает.

Файл security.txt решает именно эту проблему. Это несколько строк простого текста по фиксированному адресу /.well-known/security.txt: куда отправлять сообщения и до какого числа эти сведения действительны. Формат опубликован как RFC 9116 в 2022 году. Сканеры, платформы bug bounty и национальные агентства по безопасности читают файл автоматически, когда им есть что передать.

Contact: mailto:security@example.com
Expires: 2027-01-31T00:00:00.000Z
Preferred-Languages: en, de
Canonical: https://example.com/.well-known/security.txt
Policy: https://example.com/security-policy

Что читает эта проверка

Наш сервер запрашивает https://your-host/.well-known/security.txt, а если там ничего нет, то старый адрес /security.txt в корне. Перенаправления отслеживаются. Ответ со статусом 200, который оказывается HTML-страницей, считается отсутствием файла: многие сайты отвечают на любой неизвестный адрес своей главной страницей.

Если файл есть, мы оцениваем его по трём пунктам.

ЧастьЧто должно выполняться
Как он отдаётсяПо адресу /.well-known/, по HTTPS, с Content-Type: text/plain. Перенаправление на другой домен отмечается.
ContactМинимум одно поле, каждое в виде URI: mailto:, https:// или tel:. Голый адрес почты без mailto: это ошибка.
ExpiresРовно одно, в виде полной метки времени, например 2027-01-31T00:00:00.000Z, в будущем. Истёкший срок это ошибка; меньше 30 дней в запасе или больше года вперёд это предупреждение.
Необязательные поляEncryption, Acknowledgments, Policy, Hiring и CSAF должны быть адресами https://. Preferred-Languages встречается один раз и содержит коды языков. Canonical должен включать адрес, с которого файл был прочитан.

Поля вне стандарта перечисляются без штрафа, поскольку расширения разрешены. Проверка также сообщает, обёрнут ли текст в подпись OpenPGP в открытом виде. Саму подпись она не проверяет.

Ошибки, которые мы видим чаще всего

Истёкшая дата
Кто-то однажды написал файл и забыл о нём. RFC 9116 говорит, что истёкшим файлом пользоваться не следует, так что сообщающему снова приходится гадать. Обновление занимает две минуты: подтвердить контакты, сдвинуть дату, опубликовать.
Нет Expires вообще
Файлы, написанные до 2022 года, следовали черновику, где это поле было необязательным. Теперь оно обязательно.
Contact: security@example.com
Значение должно быть URI. Пишите mailto:security@example.com.
Файл только в корне
/security.txt это запасной вариант. Положите файл в /.well-known/ и перенаправьте на него старый адрес.
Canonical, скопированный с другого сайта
Если поле есть и в нём нет адреса, с которого отдаётся файл, файл сам себе противоречит.

Как опубликовать файл, который будет жить

Сначала решите, кто читает почтовый ящик. Общий адрес вроде security@, который доходит до двух человек, лучше личного. Затем воспользуйтесь генератором на этой странице. Он добавляет mailto:, где нужно, форматирует дату и заранее ставит её на год вперёд.

Загрузите результат в папку .well-known в корне сайта. Большинство серверов отдают файлы .txt как text/plain без дополнительной настройки. Если ваш скрывает папки, начинающиеся с точки, добавьте исключение. В nginx:

location = /.well-known/security.txt {
    default_type text/plain;
    charset utf-8;
}

Подпись необязательна. С GnuPG команда gpg --clearsign security.txt создаёт подписанную версию, которую публикуют вместо исходной. Добавьте строку Canonical до подписи, чтобы подпись покрывала и адрес.

Эта страница читает один хост, один раз. Она не может сказать, отвечает ли кто-нибудь по контактному адресу, существует ли указанная политика и подлинна ли подпись. Отсутствие файла не уязвимость и здесь не снижает никакой оценки.

Частые вопросы

Отсутствие security.txt это уязвимость?

Нет. Файл это любезность, которая облегчает сообщение о проблемах, и сам по себе он ничего не защищает. Некоторые автоматические сканеры отмечают его отсутствие как находку низкой важности. Воспринимайте это как совет.

Где именно должен лежать security.txt?

По адресу https://your-domain/.well-known/security.txt, отдаваться по HTTPS как простой текст. Каждый хост отдельный, так что файл на example.com не распространяется на app.example.com.

Привлечёт ли опубликованный контактный адрес спам или фальшивые отчёты об ошибках?

Ожидайте некоторое количество автоматических малоценных отчётов, часто с просьбой о вознаграждении. Короткая страница политики, где сказано, что входит в рамки и платите ли вы вознаграждения, отсеивает большую их часть. Помогает и указание в Contact веб-формы вместо почтового ящика.

На какой срок ставить дату Expires?

Меньше чем на год вперёд, как рекомендует RFC. Дата это обещание, что контакты были верны на момент последней проверки файла, поэтому срок и должен быть коротким. Поставьте напоминание за месяц до него.

Нужно ли подписывать файл PGP?

Нет. Подпись помогает читателю убедиться, что файл не изменили на взломанном сервере, и работает она, только если ваш открытый ключ можно получить где-то ещё. Множество корректных файлов не подписаны.

Чем security.txt отличается от robots.txt?

Оба это текстовые файлы по известному адресу, которые читают программы. robots.txt говорит поисковым роботам, какие страницы не трогать. security.txt говорит людям, нашедшим проблему безопасности, как с вами связаться. Ни тот, ни другой ничего не навязывают принудительно.