Како да го заштитите SSH со Fail2Ban на Rocky Linux 9


Вовед

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

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

Распоредувањето на производството од големи размери за кои оваа одговорност е целосно неприфатлива обично ќе имплементира VPN како што е WireGuard пред нивната SSH услуга, така што е невозможно директно да се поврзе со стандардната SSH порта 22 од надворешен интернет без дополнителна апстракција на софтвер или порти. Овие VPN решенија имаат широка доверба, но ќе додадат сложеност и можат да скршат некои автоматизации или други мали софтверски куки.

Пред или како додаток на целосното поставување на VPN, можете да имплементирате алатка наречена Fail2ban. Fail2ban може значително да ги ублажи нападите со брутална сила со создавање правила кои автоматски ја менуваат конфигурацијата на вашиот заштитен ѕид за да забранат одредени IP-адреси по одреден број неуспешни обиди за најавување. Ова ќе му овозможи на вашиот сервер да се зацврсти против овие обиди за пристап без ваша интервенција.

Во ова упатство, ќе видите како да инсталирате и користите Fail2ban на серверот Rocky Linux 9.

Предуслови

За да го комплетирате овој водич, ќе ви требаат:

  • Сервер Роки Линукс 9 и корисник без корен со sudo привилегии. Можете да дознаете повеќе за тоа како да поставите корисник со овие привилегии во нашето Initial Server Setup with Rocky Linux 9 водич. Треба да имате и firewalld што работи на серверот, што е опфатено во нашиот првичен водич за поставување сервер.
  • Изборно, втор сервер од кој можете да се поврзете со вашиот прв сервер, кој ќе го користите за да тестирате дека сте намерно забранети.

Чекор 1 - Инсталирање Fail2ban

Fail2ban не е достапен во стандардните софтверски складишта на Роки. Сепак, тој е достапен во складиштето EPEL или Подобрени пакети за Enterprise Linux, кое вообичаено се користи за пакети од трети страни на Red Hat и Rocky Linux. Ако веќе не сте го додале EPEL на изворите на вашиот системски пакет, можете да го додадете складиштето користејќи dnf, како што би инсталирале кој било друг пакет:

  1. sudo dnf install epel-release -y

Управувачот со пакети dnf сега ќе го проверува EPEL покрај вашите стандардни извори на пакети при инсталирање на нов софтвер. Продолжете да инсталирате Fail2ban:

  1. sudo dnf install fail2ban -y

Fail2ban автоматски ќе постави услуга во заднина откако ќе се инсталира. Сепак, тој е стандардно оневозможен, бидејќи некои од неговите стандардни поставки може да предизвикаат несакани ефекти. Можете да го потврдите ова со користење на командата systemctl:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

Може да го вклучите Fail2ban веднаш, но прво, ќе прегледате некои од неговите карактеристики.

Чекор 2 - Конфигурирање на Fail2ban

Услугата fail2ban ги чува своите конфигурациски датотеки во директориумот /etc/fail2ban. Постои датотека со стандардни поставки наречена jail.conf. Одете во тој директориум и испечатете ги првите 20 линии од таа датотека користејќи head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]

Како што ќе видите, првите неколку редови од оваа датотека се коментирани - тие започнуваат со знаци # што укажуваат дека треба да се читаат како документација наместо како поставки. Како што исто така ќе видите, овие коментари ве упатуваат да не ја менувате оваа датотека директно. Наместо тоа, имате две опции: или креирајте индивидуални профили за Fail2ban во повеќе датотеки во директориумот jail.d/ или креирајте и соберете ги сите ваши локални поставки во jail.local датотека. Датотеката jail.conf периодично ќе се ажурира додека самиот Fail2ban се ажурира и ќе се користи како извор на стандардни поставки за кои не сте создале никакви отфрлања.

Во ова упатство, ќе креирате jail.local. Можете да го направите тоа со копирање на jail.conf:

  1. sudo cp jail.conf jail.local

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

  1. sudo vi jail.local

Додека се движите низ датотеката, ова упатство ќе прегледа некои опции што можеби сакате да ги ажурирате. Поставките лоцирани во делот [DEFAULT] во близина на врвот на датотеката ќе се применат на сите услуги поддржани од Fail2ban. На друго место во датотеката, има заглавија за [sshd] и за други услуги, кои содржат поставки специфични за услугата кои ќе се применуваат над стандардните.

[DEFAULT]
. . .
bantime = 10m
. . .

Параметарот bantime ја одредува должината на времето кога клиентот ќе биде забранет кога не успеал правилно да се автентицира. Ова се мери во секунди. Стандардно, ова е поставено на 10 минути.

[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

Следните два параметри се findtime и maxretry. Тие работат заедно за да ги утврдат условите под кои е утврдено дека клиентот е нелегитимен корисник кој треба да биде забранет.

Променливата maxretry го поставува бројот на обиди што клиентот треба да ги автентицира во временскиот прозорец дефиниран од findtime, пред да биде забранет. Со стандардните поставки, услугата fail2ban ќе забрани клиент кој неуспешно се обидува да се најави 5 пати во рок од 10 минути.

[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Ако треба да добивате предупредувања по е-пошта кога Fail2ban презема акција, треба да ги оцените поставките destemail, име на испраќач и mta. Параметарот destemail ја поставува адресата на е-пошта што треба да прима пораки за забрана. име на испраќач ја поставува вредноста на полето \Од во е-поштата. Параметарот mta конфигурира која услуга за пошта ќе се користи за испраќање пошта. Стандардно, ова е sendmail, но можеби ќе сакате да користите Postfix или друго решение за пошта.

[DEFAULT]
. . .
action = %(action_)s
. . .

Овој параметар го конфигурира дејството што го презема Fail2ban кога сака да воведе забрана. Вредноста action_ е дефинирана во датотеката кратко пред овој параметар. Стандардното дејство е да се ажурира конфигурацијата на вашиот заштитен ѕид за да се одбие сообраќајот од домаќинот што навредува додека не истече времето за забрана.

Стандардно се обезбедени други скрипти action_ кои можете да ги замените $ (action_) со горе:

…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

На пример, action_mw презема акција и испраќа е-пошта, action_mwl презема акција, испраќа е-пошта и вклучува евиденција, а action_cf_mwl ги прави сите горе, покрај испраќањето ажурирање на Cloudflare API поврзано со вашата сметка за да се забрани и таму престапникот.

Индивидуални поставки за затвор

Следен е делот од конфигурациската датотека што се занимава со поединечни услуги. Тие се специфицирани со заглавија на секциите, како [sshd].

Секој од овие делови треба да се овозможи поединечно со додавање на линија enabled=true под заглавието, со нивните други поставки.

[jail_to_enable]
. . .
enabled = true
. . .

За ова упатство, ќе го овозможите затворот SSH. Тоа треба да биде на врвот на поединечните поставки на затворот. Стандардните параметри ќе работат инаку, но ќе треба да додадете конфигурациска линија што вели enabled=true под заглавието [sshd].

#
# JAILS
#

#
# SSH servers
#

[sshd]

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Некои други поставки што се поставени овде се филтерот што ќе се користи за да се одлучи дали линијата во дневникот означува неуспешна автентикација и logpath што му кажува на fail2ban каде се дневниците за таа конкретна услуга се наоѓа.

Вредноста filter всушност е референца за датотека лоцирана во директориумот /etc/fail2ban/filter.d, со неговата екстензија .conf отстранета . Овие датотеки содржат регуларни изрази (обичен стенографија за парсирање на текст) кои одредуваат дали линијата во дневникот е неуспешен обид за автентикација. Нема да ги опфатиме овие датотеки длабински во ова упатство, бидејќи тие се прилично сложени и однапред дефинираните поставки добро се совпаѓаат со соодветните линии.

Сепак, можете да видите какви филтри се достапни ако погледнете во тој директориум:

  1. ls /etc/fail2ban/filter.d

Ако видите датотека што изгледа поврзана со услугата што ја користите, треба да ја отворите со уредувач на текст. Повеќето датотеки се прилично добро коментирани и треба да можете барем да кажете од каква состојба е дизајнирана скриптата да се заштити. Повеќето од овие филтри имаат соодветни (оневозможени) делови во датотеката jail.conf што можеме да ги овозможиме во датотеката jail.local ако сакате.

На пример, замислете дека опслужувате веб-локација користејќи Nginx и сфаќате дека дел од вашата страница заштитена со лозинка се удира со обиди за најава. Може да му кажете на fail2ban да ја користи датотеката nginx-http-auth.conf за да ја провери оваа состојба во датотеката /var/log/nginx/error.log.

Ова е всушност веќе поставено во делот наречен [nginx-http-auth] во вашата датотека /etc/fail2ban/jail.conf. Треба само да го додадете параметарот овозможен:

. . .
[nginx-http-auth]

enabled = true
. . .

Кога ќе завршите со уредувањето, зачувајте ја и затворете ја датотеката. Ако користите vi, користете :x за да зачувате и да излезете. Во овој момент, можете да ја овозможите вашата услуга Fail2ban, така што отсега натаму ќе работи автоматски. Прво, стартувајте systemctl enable:

  1. sudo systemctl enable fail2ban

Потоа, стартувајте го рачно за прв пат со systemctl start:

  1. sudo systemctl start fail2ban

Може да потврдите дека работи со status systemctl:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 2s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start Sep 14 20:48:40 rocky9-tester systemd[1]: Starting Fail2Ban Service... Sep 14 20:48:40 rocky9-tester systemd[1]: Started Fail2Ban Service. Sep 14 20:48:41 rocky9-tester fail2ban-server[39396]: Server ready

Во следниот чекор, ќе го демонстрирате Fail2ban во акција.

Чекор 3 - Тестирање на политиките за забрана (изборно)

Од друг сервер, кој нема да треба да се најави на вашиот сервер Fail2ban во иднина, можете да ги тестирате правилата со тоа што ќе го забраните вториот сервер. Откако ќе се најавите на вториот сервер, обидете се да го SSH на серверот Fail2ban. Може да се обидете да се поврзете користејќи непостоечко име:

  1. ssh blah@your_server

Внесете случајни знаци во барањето за лозинка. Повторете го ова неколку пати. Во одреден момент, грешката што ја добивате треба да се промени од Дозволата е одбиена во Поврзувањето е одбиено. Ова сигнализира дека вашиот втор сервер е забранет од серверот Fail2ban.

На вашиот сервер Fail2ban, можете да го видите новото правило со проверка на излезот на fail2ban-client. fail2ban-client е дополнителна команда обезбедена од Fail2ban за проверка на неговата конфигурација која работи.

  1. sudo fail2ban-client status
Output
Status |- Number of jail: 1 `- Jail list: sshd

Ако користите fail2ban-client status sshd, можете да ја видите листата на IP-адреси што се забранети од SSH:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

Содржините на Список со забранети IP треба да ја одразуваат IP адресата на вашиот втор сервер.

Заклучок

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

За информации за тоа како да користите fail2ban за заштита на други услуги, можете да прочитате за Како да заштитите сервер Nginx со Fail2Ban.