Како да се заштити серверот 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
.
Ажурирајте го индексот на локалниот пакет и инсталирајте со внесување:
- sudo apt-get update
- sudo apt-get install nginx
Услугата fail2ban
е корисна за заштита на влезните точки за најавување. За да може ова да биде корисно за инсталација на Nginx, мора да се имплементира автентикација на лозинка за барем подгрупа од содржината на серверот. Можете да го следите ова упатство за да ја конфигурирате заштитата со лозинка за вашиот сервер Nginx.
Инсталирајте Fail2Ban
Откако ќе работи вашиот Nginx сервер и ќе биде овозможена автентикацијата на лозинката, можете да продолжите и да инсталирате fail2ban
(вклучуваме повторно преземање на друго складиште во случај да веќе сте го поставиле Nginx во претходните чекори):
- sudo apt-get update
- sudo apt-get install fail2ban
Ова ќе го инсталира софтверот. Стандардно, fail2ban
е конфигуриран да забранува само неуспешни обиди за најавување на SSH. Треба да овозможиме некои правила што ќе го конфигурираат да ги проверува нашите логови на Nginx за обрасци што укажуваат на злонамерна активност.
Прилагодување на општите поставки во Fail2Ban
За да започнеме, треба да ја приспособиме конфигурациската датотека што ја користи fail2ban
за да одреди кои дневници на апликации да се следат и какви дејства да се преземат кога ќе се најдат навредливи записи. Доставената датотека /etc/fail2ban/jail.conf
е главниот обезбеден ресурс за ова.
За да направиме модификации, треба да ја копираме оваа датотека на /etc/fail2ban/jail.local
. Ова ќе спречи нашите промени да бидат препишани ако ажурирањето на пакетот обезбеди нова стандардна датотека:
- sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Отворете ја новокопираната датотека за да можеме да го поставиме нашето следење на дневникот на Nginx:
- 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.
Започнете со промена во директориумот со филтри:
- cd /etc/fail2ban/filter.d
Навистина сакаме да започнеме со прилагодување на претходно обезбедениот Nginx филтер за автентикација за да одговара на дополнителна неуспешна шема за евиденција за најавување. Отворете ја датотеката за уредување:
- 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. Можеме да ја користиме оваа датотека како што е, но ќе ја копираме во ново име за јасност. Ова се совпаѓа со тоа како го референциравме филтерот во конфигурацијата на затворот:
- sudo cp apache-badbots.conf nginx-badbots.conf
Следно, ќе создадеме филтер за нашиот затвор [nginx-noscript]
:
- sudo nano nginx-noscript.conf
Вметнете ја следнава дефиниција внатре. Слободно прилагодете ги наставките на скриптата за да ги отстраните јазичните датотеки што вашиот сервер легитимно ги користи или да додадете дополнителни суфикси:
[Definition]
failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
Зачувајте ја и затворете ја датотеката.
Следно, креирајте филтер за затворот [nginx-nohome]
:
- sudo nano nginx-nohome.conf
Ставете ги следните информации за филтерот во датотеката:
[Definition]
failregex = ^<HOST> -.*GET .*/~.*
ignoreregex =
Зачувајте ја и затворете ја датотеката кога ќе завршите.
Конечно, можеме да го создадеме филтерот за затворот [nginx-noproxy]
:
- sudo nano nginx-noproxy.conf
Оваа дефиниција за филтер ќе одговара на обидите за користење на вашиот сервер како прокси:
[Definition]
failregex = ^<HOST> -.*GET http.*
ignoreregex =
Зачувајте ја и затворете ја датотеката кога ќе завршите.
Активирање на вашите затвори Nginx
За да ги имплементирате промените во конфигурацијата, ќе треба да ја рестартирате услугата fail2ban
. Можете да го направите тоа со пишување:
- sudo service fail2ban restart
Услугата треба да се рестартира, имплементирајќи ги различните политики за забрана што сте ги конфигурирале.
Добивање информации за овозможените затвори
Можете да ги видите сите ваши овозможени затвори со користење на командата fail2ban-client
:
- sudo fail2ban-client status
Треба да видите список на сите затвори што сте ги овозможиле:
OutputStatus
|- Number of jail: 6
`- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-http-auth, nginx-badbots, ssh
Можете да погледнете во iptables
за да видите дека fail2ban
ги измени правилата на вашиот заштитен ѕид за да создаде рамка за забрана на клиенти. Дури и без претходни правила за заштитен ѕид, сега ќе имате овозможена рамка која дозволува fail2ban
селективно да ги забранува клиентите со нивно додавање во наменски изградени синџири:
- 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
повторно:
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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 адреса е забранета од страницата:
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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
со внесување:
- 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