Како да се заштити серверот Nginx со Fail2Ban на Ubuntu 14.04


Вовед

Кога ракувате со веб-сервер, важно е да се имплементираат безбедносни мерки за заштита на вашиот сајт и корисниците. Заштита на вашите веб-страници и апликации со политики за заштитен ѕид и ограничување на пристапот до одредени области со автентикација со лозинка е одлична почетна точка за обезбедување на вашиот систем. Сепак, секое јавно пристапно барање за лозинка веројатно ќе привлече обиди за брутална сила од малициозни корисници и ботови.

Поставувањето fail2ban може да помогне да се ублажи овој проблем. Кога корисниците постојано не успеваат да се автентицираат на услугата (или се впуштаат во друга сомнителна активност), fail2ban може да издаде привремени забрани за навредливата IP адреса со динамичка модификација на политиката за заштитниот ѕид што работи. Секој fail2ban \jail“ работи со проверка на дневниците напишани од услуга за шеми кои укажуваат на неуспешни обиди. Поставувањето fail2ban за следење на дневниците на Nginx е прилично лесно со користење на некои од вклучени филтри за конфигурација, а некои ќе ги создадеме самите.

Во ова упатство, ќе покажеме како да инсталирате fail2ban и да го конфигурирате да ги следи вашите логови на Nginx за обиди за упад. Ќе користиме сервер Ubuntu 14.04.

Предуслови

Пред да започнете, треба да имате поставено Ubuntu 14.04 сервер со не-root сметка. Оваа сметка треба да биде конфигурирана со привилегии sudo за да се издаваат административни команди. За да научите како да поставите корисник со привилегии sudo, следете го нашиот првичен водич за поставување сервер за Ubuntu 14.04.

Инсталирање на Nginx и конфигурирање на автентикација со лозинка

Ако сте заинтересирани да го заштитите вашиот Nginx сервер со fail2ban, можеби веќе имате поставено и работи сервер. Ако не, можете да инсталирате Nginx од стандардните складишта на Ubuntu користејќи apt.

Ажурирајте го индексот на локалниот пакет и инсталирајте со внесување:

  1. sudo apt-get update
  2. sudo apt-get install nginx

Услугата fail2ban е корисна за заштита на влезните точки за најавување. За да може ова да биде корисно за инсталација на Nginx, мора да се имплементира автентикација на лозинка за барем подгрупа од содржината на серверот. Можете да го следите ова упатство за да ја конфигурирате заштитата со лозинка за вашиот сервер Nginx.

Инсталирајте Fail2Ban

Откако ќе работи вашиот Nginx сервер и ќе биде овозможена автентикацијата на лозинката, можете да продолжите и да инсталирате fail2ban (вклучуваме повторно преземање на друго складиште во случај да веќе сте го поставиле Nginx во претходните чекори):

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

Ова ќе го инсталира софтверот. Стандардно, fail2ban е конфигуриран да забранува само неуспешни обиди за најавување на SSH. Треба да овозможиме некои правила што ќе го конфигурираат да ги проверува нашите логови на Nginx за обрасци што укажуваат на злонамерна активност.

Прилагодување на општите поставки во Fail2Ban

За да започнеме, треба да ја приспособиме конфигурациската датотека што ја користи fail2ban за да одреди кои дневници на апликации да се следат и какви дејства да се преземат кога ќе се најдат навредливи записи. Доставената датотека /etc/fail2ban/jail.conf е главниот обезбеден ресурс за ова.

За да направиме модификации, треба да ја копираме оваа датотека на /etc/fail2ban/jail.local. Ова ќе спречи нашите промени да бидат препишани ако ажурирањето на пакетот обезбеди нова стандардна датотека:

  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Отворете ја новокопираната датотека за да можеме да го поставиме нашето следење на дневникот на Nginx:

  1. sudo nano /etc/fail2ban/jail.local

Менување на стандардните

Треба да започнеме со проценка на стандардните поставки во датотеката за да видиме дали одговараат на нашите потреби. Тие ќе се најдат во делот [DEFAULT] во датотеката. Овие ставки ја поставуваат општата политика и секоја може да се отфрли во одредени затвори.

Една од првите ставки што треба да се погледне е списокот на клиенти кои не подлежат на политиките fail2ban. Ова е поставено со директивата ignoreip. Понекогаш е добра идеја да додадете своја сопствена IP адреса или мрежа на списокот со исклучоци за да избегнете да се заклучите. Ова е помалку проблем со најавувањата на веб-серверот, иако ако можете да одржите пристап до школка, бидејќи секогаш можете рачно да ја смените забраната. Можете да додадете дополнителни IP адреси или мрежи ограничени со празно место, на постојната листа:

[DEFAULT]

. . .
ignoreip = 127.0.0.1/8 your_home_IP

Друга ставка што можеби ќе сакате да ја прилагодите е bantime, која контролира колку секунди е забранет членот навредлив. Идеално е да го поставите ова на доволно долго време за да ги наруши напорите на злонамерниот актер, додека доволно кратко за да им овозможи на легитимните корисници да ги поправат грешките. Стандардно, ова е поставено на 600 секунди (10 минути). Зголемете ја или намалете ја оваа вредност како што ви одговара:

[DEFAULT]

. . .
bantime = 3600

Следните две ставки го одредуваат опсегот на линиите за дневници што се користат за одредување на навредливиот клиент. findtime одредува одредено време во секунди, а директивата maxretry го означува бројот на обиди што треба да се толерираат во тоа време. Ако клиентот направи повеќе од обиди за maxretry во временскиот период поставен од findtime, тој ќе биде забранет:

[DEFAULT]

. . .
findtime = 3600   # These lines combine to ban clients that fail
maxretry = 6      # to authenticate 6 times within a half hour.

Поставување известувања по пошта (опционално)

Можете да овозможите известувања преку е-пошта ако сакате да добивате пошта секогаш кога ќе има забрана. За да го направите тоа, ќе мора прво да поставите MTA на вашиот сервер за да може да испраќа е-пошта. За да научите како да користите Postfix за оваа задача, следете го ова упатство.

Откако ќе го поставите вашиот MTA, ќе мора да приспособите некои дополнителни поставки во делот [DEFAULT] во датотеката /etc/fail2ban/jail.local. Започнете со поставување на директивата mta. Ако поставите Postfix, како што покажува горното упатство, сменете ја оваа вредност во \mail:

[DEFAULT]

. . .
mta = mail

Треба да ја изберете адресата на е-пошта на која ќе се испраќаат известувања. Изменете ја директивата destemail со оваа вредност. Директивата име на испраќач може да се користи за менување на полето „Испраќач“ во е-пораките за известување:

[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = Fail2BanAlerts

Во fail2ban идиом, „акција“ е процедурата што се следи кога клиентот не успева да се автентицира премногу пати. Стандардното дејство (наречено action_) е едноставно да се забрани IP адресата од дотичната порта. Меѓутоа, има уште две претходно направени дејства што може да се користат ако имате поставено пошта.

Можете да го користите дејството action_mw за да го забраните клиентот и да испратите известување преку е-пошта до вашата конфигурирана сметка со извештај \whois за навредливата адреса. Можете исто така да го користите action_mwl акција, која го прави истото, но ги вклучува и навредливите линии за дневник што ја активираа забраната:

[DEFAULT]

. . .
action = %(action_mwl)s

Конфигурирање на Fail2Ban за следење на логовите на Nginx

Сега кога имате некои од општите поставки fail2ban, можеме да се концентрираме на овозможување на некои затвори специфични за Nginx кои ќе ги следат дневниците на нашиот веб-сервер за специфични модели на однесување.

Секој затвор во конфигурациската датотека е означен со заглавие што го содржи името на затворот во квадратни загради (секој дел освен делот [DEFAULT] означува одредена конфигурација на затворот). Стандардно, овозможен е само затворот [ssh].

За да овозможиме следење на дневниците за обиди за најавување на Nginx, ќе го овозможиме затворот [nginx-http-auth]. Уредете ја директивата овозможена во овој дел за да гласи \true”:

[nginx-http-auth]

enabled  = true
filter   = nginx-http-auth
port     = http,https
logpath  = /var/log/nginx/error.log
. . .

Ова е единствениот затвор специфичен за Nginx вклучен во пакетот fail2ban на Ubuntu. Сепак, можеме да создадеме свои затвори за да додадеме дополнителна функционалност. Инспирацијата и некои од деталите за имплементацијата на овие дополнителни затвори потекнуваат од тука.

Можеме да создадеме затвор [nginx-noscript] за да ги забраниме клиентите кои бараат скрипти на веб-локацијата за извршување и експлоатација. Ако не користите PHP или кој било друг јазик во врска со вашиот веб-сервер, можете да го додадете овој затвор за да ги забраните оние што бараат овие видови ресурси:

[nginx-noscript]

enabled  = true
port     = http,https
filter   = nginx-noscript
logpath  = /var/log/nginx/access.log
maxretry = 6
. . .

Можеме да додадеме дел наречен [nginx-badbots] за да запреме некои познати шеми на барања за злонамерни ботови:

[nginx-badbots]

enabled  = true
port     = http,https
filter   = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2

Ако не користите Nginx за да обезбедите пристап до веб-содржини во домашните директориуми на корисниците, можете да ги забраните корисниците кои ги бараат овие ресурси со додавање на затвор [nginx-nohome]:

[nginx-nohome]

enabled  = true
port     = http,https
filter   = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2

Треба да ги забраниме клиентите кои се обидуваат да го користат нашиот сервер Nginx како отворен прокси. Можеме да додадеме затвор [nginx-noproxy] за да одговара на овие барања:

[nginx-noproxy]

enabled  = true
port     = http,https
filter   = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

Кога ќе завршите со измените што ви се потребни, зачувајте ја и затворете ја датотеката. Сега треба да ги додадеме филтрите за затворите што ги создадовме.

Додавање на филтри за дополнителни затвори Nginx

Ја ажуриравме датотеката /etc/fail2ban/jail.local со некои дополнителни спецификации за затворот за да одговара и забрани поголем опсег на лошо однесување. Треба да ги создадеме датотеките со филтри за затворите што ги создадовме. Овие датотеки со филтри ќе ги специфицираат шемите што треба да се бараат во дневниците на Nginx.

Започнете со промена во директориумот со филтри:

  1. cd /etc/fail2ban/filter.d

Навистина сакаме да започнеме со прилагодување на претходно обезбедениот Nginx филтер за автентикација за да одговара на дополнителна неуспешна шема за евиденција за најавување. Отворете ја датотеката за уредување:

  1. sudo nano nginx-http-auth.conf

Под спецификацијата failregex, додадете дополнителна шема. Ова ќе одговара на линиите каде што корисникот не внел корисничко име или лозинка:

[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
            ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

Зачувајте ја и затворете ја датотеката кога ќе завршите.

Следно, можеме да ја копираме датотеката apache-badbots.conf за да ја користиме со Nginx. Можеме да ја користиме оваа датотека како што е, но ќе ја копираме во ново име за јасност. Ова се совпаѓа со тоа како го референциравме филтерот во конфигурацијата на затворот:

  1. sudo cp apache-badbots.conf nginx-badbots.conf

Следно, ќе создадеме филтер за нашиот затвор [nginx-noscript]:

  1. sudo nano nginx-noscript.conf

Вметнете ја следнава дефиниција внатре. Слободно прилагодете ги наставките на скриптата за да ги отстраните јазичните датотеки што вашиот сервер легитимно ги користи или да додадете дополнителни суфикси:

[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

Зачувајте ја и затворете ја датотеката.

Следно, креирајте филтер за затворот [nginx-nohome]:

  1. sudo nano nginx-nohome.conf

Ставете ги следните информации за филтерот во датотеката:

[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

Зачувајте ја и затворете ја датотеката кога ќе завршите.

Конечно, можеме да го создадеме филтерот за затворот [nginx-noproxy]:

  1. sudo nano nginx-noproxy.conf

Оваа дефиниција за филтер ќе одговара на обидите за користење на вашиот сервер како прокси:

[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

Зачувајте ја и затворете ја датотеката кога ќе завршите.

Активирање на вашите затвори Nginx

За да ги имплементирате промените во конфигурацијата, ќе треба да ја рестартирате услугата fail2ban. Можете да го направите тоа со пишување:

  1. sudo service fail2ban restart

Услугата треба да се рестартира, имплементирајќи ги различните политики за забрана што сте ги конфигурирале.

Добивање информации за овозможените затвори

Можете да ги видите сите ваши овозможени затвори со користење на командата fail2ban-client:

  1. sudo fail2ban-client status

Треба да видите список на сите затвори што сте ги овозможиле:

Output
Status |- Number of jail: 6 `- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh

Можете да погледнете во iptables за да видите дека fail2ban ги измени правилата на вашиот заштитен ѕид за да создаде рамка за забрана на клиенти. Дури и без претходни правила за заштитен ѕид, сега ќе имате овозможена рамка која дозволува fail2ban селективно да ги забранува клиентите со нивно додавање во наменски изградени синџири:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-badbots -N fail2ban-nginx-http-auth -N fail2ban-nginx-nohome -N fail2ban-nginx-noproxy -N fail2ban-nginx-noscript -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noproxy -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-nohome -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-badbots -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-noscript -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A fail2ban-nginx-badbots -j RETURN -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-nginx-nohome -j RETURN -A fail2ban-nginx-noproxy -j RETURN -A fail2ban-nginx-noscript -j RETURN -A fail2ban-ssh -j RETURN

Ако сакате да ги видите деталите за забраните што ги спроведува кој било затвор, веројатно е полесно да го користите fail2ban-client повторно:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

Тестирање на политиките за Fail2Ban

Важно е да ги тестирате вашите политики fail2ban за да се осигурате дека тие го блокираат сообраќајот како што се очекуваше. На пример, за барањето за автентикација Nginx, можете да дадете неточни ингеренции неколку пати. Откако ќе го надминете лимитот, треба да бидете забранети и да не можете да пристапите на страницата. Ако поставите известувања преку е-пошта, треба да видите пораки во врска со забраната во сметката за е-пошта што ја наведовте.

Ако го погледнете статусот со командата fail2ban-client, ќе видите дека вашата IP адреса е забранета од страницата:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 12 `- action |- Currently banned: 1 | `- IP list: 111.111.111.111 `- Total banned: 1

Кога сте задоволни дека вашите правила функционираат, можете рачно да ја отбанирате вашата IP адреса со fail2ban-client со внесување:

  1. sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

Сега треба да можете повторно да се обидете со автентикација.

Заклучок

Поставувањето fail2ban за заштита на вашиот сервер Nginx е прилично едноставно во наједноставен случај. Сепак, fail2ban обезбедува голема флексибилност за конструирање политики што ќе одговараат на вашите специфични безбедносни потреби. Со разгледување на променливите и обрасците во датотеката /etc/fail2ban/jail.local и датотеките од кои зависи во /etc/fail2ban/filter.d и директориумите /etc/fail2ban/action.d, можете да најдете многу парчиња за дотерување и менување како што се развиваат вашите потреби. Учењето на основите за тоа како да го заштитите вашиот сервер со fail2ban може да ви обезбеди голема безбедност со минимален напор.

Ако сакате да дознаете повеќе за fail2ban, проверете ги следните врски:

  • Како функционира Fail2Ban за да ги заштити услугите на серверот Линукс
  • Како да се заштити SSH со Fail2Ban на Ubuntu 14.04
  • Како да се заштити серверот на Apache со Fail2Ban на Ubuntu 14.04