Как отбрасывать запросы с пустым user agent?

Мой сайт на Discourse подвергается множеству атак со стороны плохих ботов/краулеров с пустым user agent. Обычно я редактировал бы конфигурацию nginx, но при использовании метода установки через Docker это недоступно. Я не хочу добавлять отдельный RP-сервер только для этого, если можно избежать.

Вы можете посмотреть discourse_docker/templates/web.ratelimited.template.yml at main · discourse/discourse_docker · GitHub как пример того, как изменить конфигурацию nginx внутри контейнера.

Для всех остальных, кто хочет сделать именно это, я создал файл /var/discourse/templates/web.blockemptyua.yml со следующим содержимым:

run:
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen 443 ssl http2;
       if ($http_user_agent = "") { return 403; }

Затем в файле /var/discourse/containers/app.yml я добавил этот новый файл шаблона в конец списка шаблонов в верхней части файла, после чего выполнил команду ./launcher rebuild app.

Теперь Nginx отклоняет все запросы с пустым User-Agent.

Редактирование: Изменил место для совпадения и замены, чтобы оно было более подходящим.

Я не знаком с Docker, поэтому, чтобы быть уверенным, так как я буду нервничать каждый раз, когда вижу replace в любом месте…

Это не полная замена содержимого discourse.conf, а добавление этого, верно?

Это заменяет строку внутри файла. Таким образом, оно находит первое вхождение:

listen 443 ssl http2;

и заменяет его на

listen 443 ssl http2;
if ($http_user_agent = "") { return 403; }

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

Как я уже говорил ранее, я не знаю Docker. Я просто бедный конечный пользователь с докторской степенью по копированию и вставке.

Поэтому вот одно замечание для будущих поисковиков:

web.blockemptyua.yml не может быть первым из объявленных шаблонов. Точнее, он должен идти после web.template.yml (или, возможно, даже после каждого шаблона web.*).

Здесь порядок имеет значение, насколько я понимаю, и если мы пытаемся использовать его первым, пересборка/инициализация останавливается с ошибкой, потому что в этот момент файла /etc/nginx/conf.d/discourse.conf ещё нет.

Ну, каждый день что-то новое :wink:

Действительно, это должно быть в конце. Я отредактировал свой пост, чтобы добавить это :+1: