Как использовать fail2ban с Meteor на Nginx - PullRequest
0 голосов
/ 09 марта 2020

Я устанавливаю каплю Digital Ocean под управлением Ubuntu 18.04 для размещения моего приложения Meteor 1.8 через Phusion Passenger / Nginx. Я настрою его на использование SSL с Lets Encrypt.

fail2ban - это рекомендуемый инструмент для защиты от атак методом перебора, но я не могу понять, как использовать его с Meteor, или даже если это уместно. Я прочитал несколько учебников , но есть кое-что базовое c Я не понимаю.

Я использовал блоки местоположения сервера в моей конфигурации Nginx файл, который блокирует доступ ко всем URL-адресам по умолчанию и разрешает только необходимые:

# deny all paths by default
location / { deny all; }

# allow sockjs
location /sockjs { }

# allow required paths
location = / { }
location /my-documents { }
location /login { }
location /register { }
...

# serve js and css
location ~* "^/[a-z0-9]{40}\.(css|js)$" {
  root /var/www/myapp/bundle/programs/web.browser;
  access_log off;
  expires max;
}

# serve public folder
location ~ \.(jpg|jpeg|png|gif|mp3|ico|pdf|svg) {
  root /var/www/myapp/bundle/pubilc;
  access_log off;
  expires max;
}

# deny unwanted requests
location ~ (\.php|.aspx|.asp|myadmin) {
  return 404;
}

Мой базовый c вопрос: будет ли fail2ban обнаруживать неудачные попытки входа в мое приложение Meteor, и если да, то как ? Если нет, то какова цель этого? Ищет неудачные попытки входа на сам сервер? Я отключил парольный доступ к дроплету - вы можете подключиться к серверу только через s sh.

И как это связано с Nginx защитой паролем разделов сайта ? Опять же, для чего это нужно и нужно ли это мне? Как это будет работать с приложением Meteor?

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Любое современное одностраничное приложение, использующее React / Vue / Blaze в качестве движка рендеринга, просто не отправляет URL-запросы на сервер для каждой страницы в пользовательском интерфейсе.

Meteor загружает все свои ресурсы на начальной странице загрузка, а остальное выполняется через сокеты с использованием DDP. Он может загружать ресурсы c как отдельные запросы.

Любые вызовы API сервера, реализованные как методы Meteor, также не отображаются в журналах сервера.

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

Вы можете адаптировать приложение для обнаружения неудачных входов в систему и вызывать API-интерфейс fail2ban для войти их (если это возможно). В противном случае я не уверен, подходит ли он для защиты метеорного сервера.

0 голосов
/ 10 марта 2020

Мой вывод таков: да, fail2ban стоит использовать с Meteor. Насколько я могу судить, Nginx защита паролем не имеет значения, но есть и другие полезные вещи, которые вы можете сделать.

Во-первых, я думаю, что стоит использовать fail2ban на любом сервере, чтобы блокировать атаки методом перебора. Мой тестовый сервер был в сети только пару дней без ссылок, указывающих на него, и я уже вижу пробы на пути, такие как wp-admin и robots.txt в журналах Nginx. Эти пробники ничего не могут достичь, потому что файлы не существуют, но я думаю, что безопаснее запретить повторные вызовы.

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

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

Вот как я изменили мое приложение:

сервер / основной. js

const buildServerLogText = ((text) => {
    const connection = Meteor.call('auth.getClientConnection');

    return `${moment(new Date()).format('YYYY/MM/DD HH:mm:ss')} ${text}, client: ${connection.clientAddress}, host: "${connection.httpHeaders.host}"`;
});
// log failed login attempts so fail2ban can find them in the Nginx logs
Accounts.onLoginFailure(() => {
    const text = buildServerLogText('[error]: Meteor login failure');
    console.log(text);
});

Это пишет неудачные попытки входа на сервер в этой форме:

2020/03/10 15:40:20 [error]: Meteor login failure, client: 86.180.254.102, host: "209.97.135.5"

формат даты важен, в этом случае сбои fail2ban.

Мне также пришлось установить passenger_disable_log_prefix on; в моем файле конфигурации Phusion Passenger, чтобы префикс был добавлен в запись журнала. При развертывании моего приложения с Phusion Passenger конфигурация Nginx находится в конфигурационном файле Passenger.

Тогда мой фильтр fail2ban выглядит так:

/ etc / fail2ban / filter. d / nginx -login-fault.conf

[Definition]
failregex = ^ \[error\]:.*Meteor login failure.*, client: <HOST>, .*$

ignoreregex =
...