Стъпки за осигуряване на нашия VPS

Този урок показва как да подготвите и защитите виртуален частен сървър (VPS) с Debian GNU / Linux. Преди да започнем, се приемат някои неща:

  1. Имате междинно ниво на познаване на GNU / Linux.
  2. Има VPS за лична употреба, до който имаме достъп чрез SSH.
  3. VPS има специалния външен ipv4 250.250.250.155 и нашият доставчик притежава блока 250.250.0.0/16. (1)
  4. В нашия VPS ще имаме разрешени само http, https и ssh услуги за достъп отвън.
  5. Външният DNS няма да бъде активиран, тъй като обикновено се прави в панела на нашия доставчик. (2)
  6. Ще работи като суперпотребител.

Инсталация

Като първа стъпка, нека актуализираме сървъра и инсталираме някои пакети, които ще ни трябват:

# aptitude update & aptitude safe-upgrade # aptitude -RvW install dropbear gesftpserver sslh iptables-persistent ulogd fail2ban nginx-light apache2-utils dnsutils telnet ghostscript poppler-utils zip unzip unrar-free p7zip-full multitail tee mc

конфигурация

Сега ще създадем работен потребител. Работата като root на сървър е несигурна, затова първо ще създадем специален потребител:

adduser оператор usermod -aG sudo оператор

Първата команда създава оператор потребител, втората го добавя към групата Sudo, което ще позволи да стартирате приложения като root.

Регулирайте разрешенията за супер потребители

За да работим редовно, ще използваме потребителя оператор създаден преди това, трябва да коригираме опциите за изпълнение на команди като суперпотребител, за което изпълняваме следната команда:

visudo

Тази команда позволява основно модифициране на файла / и т.н. / sudoers; в които трябва да съдържаме тези редове:

По подразбиране env_reset, timestamp_timeout = 0% sudo ALL = (ALL: ALL) ALL

В първия ред опцията се добавя към стойностите по подразбиране timestamp_timeout което ви позволява да зададете времето на изтичане (в минути) на паролата при изпълнение на командата sudo. По подразбиране е 5, но това понякога е опасно поради две причини:

  1. Ако по невнимание оставим компютъра си влязъл преди изтичането на паролата, някой може да изпълни команда като root без никакви ограничения.
  2. Ако поради незнание изпълним приложение или скрипт, който съдържа злонамерен код, преди да изтече паролата, приложението може да има достъп до нашата система като суперпотребител, без нашето изрично съгласие.

Така че, за да избегнем рисковете, сме задали стойността на нула, т.е. всеки път, когато се изпълни командата sudo, ще трябва да се въведе паролата. Ако отрицателната стойност е зададена като -1, ефектът е, че паролата никога не изтича, което би довело до обратен резултат от това, което искаме.

Във втория ред е изяснено, че sudo групата може да изпълнява всяка команда на всеки компютър, което е обичайно, въпреки че може да се коригира. (3) Има такива, които за удобство поставят реда по следния начин, за да не се налага да въвеждате паролата:

% sudo ALL = (ALL: ALL) NOPASSWD: ALL

Както обаче обяснихме по-рано, това е рисковано и следователно не се препоръчва.

Деактивирайте рестартирането

От съображения за сигурност също ще деактивираме рестартирането, като използваме комбинацията от клавиши Ctrl + Alt + Del, за което трябва да добавим този ред във файла / и т.н. / inittab:

ca: 12345: ctrlaltdel: / bin / echo "Ctrl + Alt + Del е деактивиран."

Заменете OpenSSH с DropBear

Повечето VPS идват с инсталиран OpenSSH, което със сигурност е много полезно, но освен ако не се наложи да използваме цялата функционалност на OpenSSH, има по-леки алтернативи за VPS, като например dropbear, което обикновено е достатъчно за редовна употреба. Недостатък на това приложение обаче е, че не се предлага с интегриран SFTP сървър и затова инсталирахме пакета в началото gesftpserver.

За да конфигурираме Dropbear, ние ще модифицираме файла / etc / default / dropbear така че да съдържа тези два реда:

NO_START = 0 DROPBEAR_EXTRA_ARGS = "- w -p 127.0.0.1:22 -I 1200 -m"

Първият ред просто позволява услугата, а вторият прави няколко неща:

  1. Избягвайте root достъп.
  2. Поставя слушането на услугата на порт 22 на локалния интерфейс (ще обясним защо по-късно).
  3. Задава времето за изчакване (20 минути).

SSLH

Порт 22 (SSH) е добре известен и обикновено е един от първите, които хакерите се опитват да пробият, затова вместо него ще използваме порт 443 (SSL). Случва се този порт да се използва за сигурно сърфиране през HTTPS.

Поради тази причина ще използваме пакета sslh, който не е нищо повече от мултиплексор, който анализира пакетите, които пристигат на порт 443, и ги насочва вътрешно към една или друга услуга в зависимост от това дали видът трафик е SSH или SSL.

SSLH не може да слуша на интерфейс, където друга услуга вече слуша, поради което преди това накарахме Dropbear да слуша на локалния интерфейс.

Сега това, което трябва да направим, е да посочим на sslh интерфейса и порта, през който трябва да слуша и къде да пренасочим пакетите в зависимост от вида на услугата и за това ще модифицираме конфигурационния файл / etc / default / sslh:

DAEMON = / usr / sbin / sslh DAEMON_OPTS = "- потребител sslh --listen 250.250.250.155:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile / var / run / sslh / sslh .pid "RUN = да

Накрая рестартираме услугите:

service ssh stop && service dropbear start && service sslh рестартиране

След предишната команда нашата защитена сесия вероятно ще бъде прекъсната, като в този случай е достатъчно да влезете отново, но този път с работния потребител и използвайки порт 443. Ако сесията не е прекъсната, препоръчително е да я затворите и да започнете отново. със съответните стойности.

Ако всичко работи правилно, можем да продължим да работим като root и ако желаем, деинсталирайте OpenSSH:

sudo su - aptitude -r purge openssh-server

защитни стени

Следващото нещо, което ще направим, е да отделим регистрационните файлове от защитната стена в отделния файл /var/log/firewall.log за улесняване на по-нататъшен анализ, поради което инсталирахме пакета ulogd при стартиране. За това ще редактираме файла /etc/logd.conf за да коригирате съответния раздел:

[LOGEMU] file = "/ var / log / firewall.log" sync = 1

След това ще модифицираме файла за завъртане на записа / etc / logrotate / ulogd за да запазите ежедневно завъртане (с дата) и да запазите компресирани залпове в директорията / var / log / ulog /:

/var/log/ulog/*.log /var/log/firewall.log {ежедневно dateext липсващкомпресиране закъснениекомпресиране на споделени скриптове създаване на 640 root adm postrotate /etc/init.d/ulogd reload mv /var/log/firewall.log-* .gz / var / log / ulog / endscript}

След това ще създадем правилата на netfilter, като изпълним следното:

IPT = $ (кои iptables) IPEXT = 250.250.250.155 IPEXTBLK = 250.250.0.0 / 16 IPBCAST = 255.255.255.255 $ IPT -F $ IPT -X $ IPT -Z $ IPT -A INPUT -i lo -j ACCEPT $ IPT - P INPUT DROP $ IPT -P FORWARD DROP $ IPT -P OUTPUT ACCEPT $ IPT -A INPUT -m state - state INVALID -j ULOG --ulog-prefix IN_INVALID $ IPT -A INPUT -p igmp -j ULOG --ulog -префикс IN_IGMP $ IPT -A INPUT -m pkttype --pkt-тип излъчване -j ULOG --ulog-префикс IN_BCAST $ IPT -A INPUT -m pkttype --pkt-type multicast -j ULOG --ulog-префикс IN_MCAST $ IPT -A НАПРЕД -j ULOG --ulog-префикс НАПРЕД $ IPT -N ICMP_IN $ IPT -A INPUT!  -i lo -p icmp -j ICMP_IN $ IPT -A ICMP_IN -p icmp -f -j ULOG --ulog-префикс IN_ICMP_FRAGMENTED $ IPT -A ICMP_IN -p icmp -m icmp -m дължина!  --дължина 28: 1322 -j ULOG --ulog-префикс IN_ICMP_INVALIDSIZE $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-над 4 / sec --hashlimit-mode srcip --hashlimit-srcmask 24 - -hashlimit-name icmpflood -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-upto 64kb / min --hashlimit-mode srcip --hashlimit-srcmask 24 - hashlimit-name icmpattack -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m u32!  --u32 "0x4 & 0x3fff = 0x0" -j ULOG --ulog-префикс IN_ICMP_ATTACK $ IPT -A ICMP_IN -p icmp -m icmp!  - emp-type echo-request -m състояние - състояние НОВО -j ULOG --ulog-префикс IN_ICMP_INVALID $ IPT -A ICMP_IN -p icmp -m icmp - emp-type -mpmp тип -j ULOG --ulog- префикс IN_ICMP $ IPT -A ICMP_IN -p icmp -m icmp --icmp-тип echo-request -m limit --limit 1 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp - emp-type echo-reply -m limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type destination-unreachable -m limit - ограничение 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type time-oversed -m limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp-type параметър-проблем -m limit --limit 2 / sec --limit-burst 4 -j ПРИЕМЕ $ IPT -A ICMP_IN -j RETURN $ IPT -N UDP_IN $ IPT -А ВХОД!  -i lo -p udp -j UDP_IN $ IPT -A UDP_IN!  -и ето!  -p udp -f -j ULOG --ulog-префикс IN_UDP_FRAGMENTED $ IPT -A UDP_IN -p udp -m udp --sport 53 -m дължина!  --length 28: 576 -j ULOG --ulog-prefix IN_UDP_DNS_INVALIDSIZE $ IPT -A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j ULOG --ulog-prefix IN_UDP_DNSREQUEST $ IPT - A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j REJECT --reject-with icmp-port-unreachable $ IPT -A UDP_IN -p udp -m udp!  - спорт 53!  -s $ IPEXTBLK!  -d $ IPBCAST -m състояние - състояние НОВО -j ULOG --ulog-префикс IN_UDP $ IPT -A UDP_IN -p udp -m udp -m състояние - състояние УСТАНОВЕНО, СВЪРЗАНО -j ПРИЕМ $ IPT -A UDP_IN -j ВРЪЩАНЕ $ IPT -N TCP_IN $ IPT -А ВХОД!  -i lo -p tcp -j TCP_IN $ IPT -A TCP_IN!  -и ето!  -p tcp -f -j ULOG --ulog-префикс IN_TCP_FRAGMENTED $ IPT -A TCP_IN -p tcp -m tcp --sport 53 -m състояние - състояние УСТАНОВЕНО, СВЪРЗАНО -m дължина!  - дължина 513: 1500 -j ULOG --ulog-префикс IN_TCP_DNS_INVALIDSIZE $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m състояние - състояние НОВО -j ULOG --ulog-префикс IN_TCP_DNS $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m състояние - състояние НОВО -j ОТХВЪРЛЕНО - отхвърляне-с icmp-port-недостижим $ IPT -A TCP_IN -p tcp -m tcp -m мултипорт!  --dports 80,443 -m състояние - състояние НОВО -j ULOG --ulog-префикс IN_TCP $ IPT -A TCP_IN -p tcp -m tcp -m мултипорт --dports 80,443 -m състояние - състояние НОВ -m hashlimit - hashlimit-upto 4 / sec --hashlimit-burst 16 --hashlimit-mode srcip --hashlimit-name navreq -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state - състояние УСТАНОВЕНО -m connlimit!  --connlimit-над 16 -j ПРИЕМЕ $ IPT -A TCP_IN -p tcp -m tcp -m мултипорт! 

С предишната конфигурация нашият VPS трябва да бъде разумно защитен, но ако желаем, можем да го осигурим малко повече, за което можем да използваме някои по-усъвършенствани правила.

Не всички VPS позволяват инсталирането на допълнителни модули за netfilter, но много полезен е такъв PSD, което ви позволява да избегнете сканиране на портове. За съжаление този модул не е интегриран в netfilter по подразбиране, така че е необходимо да инсталирате определени пакети и след това да изградите модула:

aptitude -RvW install iptables-dev xtables-addons-source модул-асистент модул-асистент --verbose --text-mode auto-install xtables-addons-source

След като горното приключи, можем да добавим правило като това:

iptables -A INPUT -m psd --psd-weight-prag 15 --psd-delay-prag 2000 --psd-lo-port-weight 3 --psd-hi-ports-weight 1 -j ULOG --ulog- префикс IN_PORTSCAN

Горното правило основно означава, че ще създадем брояч, който ще бъде увеличен с 3 всеки път, когато се прави опит за достъп до порт под 1024 и с 1 всеки път, когато се прави опит за достъп до порт, по-висок от 1023, и когато този брояч достигне 15 в за период по-малък от 20 секунди, пакетите ще бъдат регистрирани от ulog като опит за portscan. Пакетите пак биха могли да бъдат изхвърлени наведнъж, но в този случай възнамеряваме да използваме fail2ban, които ще конфигурираме по-късно.

След като правилата са създадени, трябва да вземем определени предпазни мерки, за да ги направим постоянни, в противен случай ще ги загубим при рестартиране на сървъра. Има няколко начина за постигане на това; В този урок ще използваме пакета, устойчив на iptables, който инсталирахме в началото, който съхранява правилата в /etc/iptables/rules.v4 y /etc/iptables/rules.v6 за ipv6.

iptables-save> /etc/iptables/rules.v4

Всъщност, въпреки че използването на ipv6 в Куба все още не е широко разпространено, бихме могли да създадем някои основни правила:

IPT = $ (които ip6tables) $ IPT -P INPUT DROP $ IPT -P НАПРЕД ПАДАНЕ $ IPT -P ИЗХОД ПРИЕМ $ IPT -A ВХОД -i lo -j ПРИЕМ $ IPT -A ВХОД! -i lo -m състояние - състояние УСТАНОВЕНО, СВЪРЗАНО -j ПРИЕМ анулиране на IPT

Тези правила също могат да бъдат постоянни:

ip6tables-save> /etc/iptables/rules.v6

Накрая за по-голяма сигурност почистваме регистъра на защитната стена и рестартираме услугите:

echo -n> /var/log/firewall.log услуга logrotate рестартиране услуга ulogd рестартиране услуга iptables-постоянен рестарт

Nginx

Ще използваме Nginx като уеб сървър, тъй като VPS обикновено имат намалено количество RAM в сравнение с истински сървър, така че обикновено е удобно да има нещо по-леко от Apache.

Преди да конфигурираме Nginx, ще създадем сертификат (без парола) за използване през HTTPS:

cd / etc / nginx openssl genrsa -des3 -out cert.key 4096 cp -v cert.key cert.key.original openssl req -new -key cert.key -out cert.csr openssl rsa -in cert.key.original - out cert.key openssl x509 -req -days 365 -in cert.csr -signkey cert.key -out cert.crt

След като това стане, ще създадем файл с парола за потребителя "elusuario":

htpasswd -c .htpasswd потребителя

След това ще модифицираме файла / И т.н. / Nginx / сайтове-достъпно / по подразбиране за да зададете предпочитанията на сайта по подразбиране. Може да изглежда така:

сървър {име на сървър localhost; индекс index.html index.htm default.html default.htm; корен / var / www; location / {# задайте реда за проверка и страницата за зареждане, ако URI не е намерен try_files $ uri $ uri / /index.html; }} сървър {слушане 127.0.0.1:443; име на сървър localhost; индекс index.html index.htm default.html default.htm; корен / var / www; ssl включен; ssl_certificate cert.crt; ssl_certificate_key cert.key; ssl_session_timeout 5m; # Активирайте HTTPS само през TLS (по-сигурен от SSL) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # дайте предпочитание на шипове с висока якост [HIGH], # преместете шифри със средна якост [MEDIUM] в края на списъка, # забранете шифрите с ниска якост [LOW] (40 и 56 бита) # деактивирайте шифрите експортиране на алгоритми [EXP] # деактивиране на нулеви шифри [eNULL], без удостоверяване [aNULL], SSL (версии 2 и 3) и DSS (позволяват само ключове до 1024 бита) ssl_ciphers HIGH: + СРЕДЕН :! ! aNULL :! eNULL :! SSLv3 :! SSLv2 :! DSS; # Предпочитайте методите за криптиране на сървъра (по подразбиране се използват клиентските) ssl_prefer_server_ciphers on; местоположение / {# разрешаване на удостоверяване auth_basic "Login"; auth_basic_user_file /etc/nginx/.htpasswd; # задайте реда за проверка и кода на страницата за зареждане, ако URI try_files $ uri $ uri / = 404 не е намерен; # позволяват създаването на индекс за включени автоиндекси на удостоверени потребители; autoindex_exact_size изключен; включен autoindex_localtime; }}

Проверяваме дали конфигурацията е правилна:

nginx-t

Накрая рестартираме услугата:

услуга nginx рестартиране

Fail2Ban

Преди да започнем да конфигурираме Fail2Ban, за по-голяма сигурност спираме услугата и почистваме системния регистър:

fail2ban-client stop echo -n> /var/log/fail2ban.log

След това създаваме конфигурационния файл /etc/fail2ban/jail.local със следното персонализирано съдържание:

# Персонализиран конфигурационен файл /etc/fail2ban/jail.local # [ПО подразбиране] findtime = 43200; 12 часа престой = 86400; 1 ден maxretry = 3; забраната ще влезе в сила след четвъртия опит [ssh] enabled = false [nginx-auth] enabled = true filter = nginx-auth action = iptables-multiport [name = NoAuthFailures, port = "http, https"] logpath = / var / log / nginx * / * error * .log [nginx-badbots] активиран = true filter = apache-badbots action = iptables-multiport [name = BadBots, port = "http, https"] logpath = / var / log / nginx * /*access*.log bantime = 4; 604800 седмица maxretry = 1 [nginx-login] активирано = true filter = nginx-login action = iptables-multiport [name = NoLoginFailures, port = "http, https"] logpath = / var / log / nginx * / * access *. log bantime = 0; 1800 минути [nginx-noscript] активирано = вярно действие = iptables-multiport [name = NoScript, port = "http, https"] filter = nginx-noscript logpath = /var/log/nginx*/*access*.log maxretry = 30 [nginx-proxy] активирано = вярно действие = iptables-multiport [name = NoProxy, port = "http, https"] filter = nginx-proxy logpath = /var/log/nginx*/*access*.log bantime = 0 ; 604800 седмица maxretry = 1 [защитна стена] активирана = вярно действие = iptables-multiport [name = Firewall] filter = firewall logpath = /var/log/firewall.log maxretry = 0

След като това бъде направено, ние създаваме в директорията /etc/fail2ban/filters.d/ следните файлове:

# /etc/fail2ban/filter.d/nginx-auth.conf # Филтър за удостоверяване # Блокира IP адреси, които не успяват да се удостоверят чрез основно удостоверяване # [Определение] failregex = не е предоставен потребител / парола за основно удостоверяване. * клиент: потребител. * не е намерен в. * клиент: потребител. * несъответствие на паролата. * клиент: ignoreregex =
# /etc/fail2ban/filter.d/nginx-login.conf # Филтър за вход # Блокира IP адреси, които не успяват да се удостоверят с помощта на страницата за влизане на уеб приложение # Сканиране на дневника за достъп за HTTP 200 + POST / сесии => неуспешен вход # [Определение ] failregex = ^ -. * POST / сесии HTTP / 1 \ .. "200 ignoreregex =
# /etc/fail2ban/filter.d/nginx-noscript.conf # Noscript филтър # Блокиране на IP адреси, опитващи се да изпълняват скриптове като .php, .pl, .exe и други забавни скриптове. # Съвпадения например # 192.168.1.1 - - "ВЗЕМЕТЕ /something.php # [Определение] failregex = ^ -. * GET. * (\. Php | \ .asp | \ .exe | \ .pl | \ .cgi | \ scgi) ignoreregex =
# /etc/fail2ban/filter.d/proxy.conf # Прокси филтър # Блокиране на IP адреси, опитващи се да използват сървър като прокси. # Съвпадения, например # 192.168.1.1 - - "ВЗЕМЕТЕ http://www.something.com/ # [Определение] failregex = ^ -. * ВЗЕМЕТЕ http. * Ignoreregex =
# /etc/fail2ban/filter.d/firewall.conf # Филтър на защитна стена # [Определение] failregex = ^. * IN_ (ИНВАЛИДЕН | PORTSCAN | UDP | TCP |). * SRC = . * $ ignoreregex =

Накрая стартираме услугата и зареждаме конфигурацията:

fail2ban-service -b fail2ban-client reload

Проверка

Като последна стъпка можем да преглеждаме записите с опашка -f o мултитайл - след всички. Всъщност последното приложение предлага предимството, че ви позволява да преглеждате множество файлове едновременно и осигурява основно подчертаване на синтаксиса.

В случай че имейл акаунт не е конфигуриран във VPS, препоръчително е да деактивирате предупредително съобщение, което се появява при стартиране на мултитайл, за което ще изпълним следната команда:

echo "check_mail: 0"> ~ / .multitailrc

Всъщност бихме могли да направим псевдоним (4), за да преглеждаме дневниците бързо с кратка команда, например "flog":

псевдоним flog = 'multitail --follow-all /var/log/firewall.log /var/log/fail2ban.log'

1) Това са измислени ценности.
2) Активирането на други услуги е лесно, след като разберете как работи.
3) За повече подробности стартирайте man sudoers.
4) По желание може да се добави към файла ~ / .bash_aliases


Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.

  1.   MSX каза той

    Има няколко интересни неща, +1

  2.   Юкитеру каза той

    @Hugo този ред в конфигурацията:

    ssl_protocols SSLv3 TLSv1;

    Бих извадил SSLv3 от него, защото този протокол вече не е защитен, дори в Debian Jessie, много услуги са конфигурирани да избягват използването на този протокол поради тази причина.

    Информация по темата тук:

    https://www.linode.com/docs/security/security-patches/disabling-sslv3-for-poodle
    http://disablessl3.com/

    1.    Уго каза той

      Идеята не беше всъщност да се предлагат основните услуги през HTTPS, а да се обясни как да се използва порт 443 за SSH, без да се губи възможността да се използва за HTTPS, ако е необходимо, но благодаря за предупреждението.

      Както и да е, актуализирах статията, за да модифицирам малко конфигурацията на nginx и случайно включих някои коментари, за да изясня малко повече нещата с този механизъм за криптиране и да поправя някои дребни грешки.

  3.   Даниел PZ каза той

    Благодаря ви много за този страхотен урок, сега ще го приложа на практика! :D, продължавай все така DesdeLinux, винаги ме изненадват, Поздрави от Перу.

  4.   Сандекуера каза той

    Благодаря ви много за споделянето.

  5.   Фернандо каза той

    Много добро ръководство и идва от бисери сега, когато започнах в този блог, но още повече сега, когато съм на път да монтирам първия си vps и дори с много проблеми, но тази статия ме извади от много съмнения, благодарности и поздрави