Pas 1. Configuració de l'IPFW
Pas 2. Instal·leu i configureu SSHGuard
Pas 3. Creeu un script de regles
Pas 4. Inici i prova
Pas 5. Mantenir la vigilància...
Els servidors VPS solen ser atacats per intrusos. Un tipus comú d'atac apareix als registres del sistema com a centenars d'intents d'inici de sessió ssh no autoritzats. Configurar un tallafoc és molt útil, però per si sol pot no controlar adequadament els intents d'intrusió pertorbadores.
Aquest tutorial mostra com construir una barrera d'intrusió millorada per a FreeBSD mitjançant dos programes, el ipfwtallafoc i sshguard. SSHGuard és un petit programa addicional que supervisa els registres del sistema per a les entrades "abusives". Quan els delinqüents intenten accedir-hi, sshguards'indica ipfwper bloquejar el trànsit provinent de l'adreça IP del delinqüent. Aleshores, el delinqüent queda fora de casa.
Un cop s'entén com funcionen aquests programes, gestionar la protecció del servidor és bastant senzill. Tot i que aquesta guia se centra en la configuració de FreeBSD, algunes s'apliquen a altres sistemes operatius i programari de tallafoc.
Pas 1. Configuració de l'IPFW
FreeBSD proporciona 3 tallafocs al seu GENERICnucli predeterminat ( ), ipfw, pf, i ipfilter. Cadascun té avantatges i aficionats, però ipfwés el programari de tallafoc natiu de FBSD i bastant senzill d'utilitzar per als nostres propòsits. Val la pena assenyalar que ipfwfa moltes coses tal com mostra la seva pàgina de manual, però no es necessiten capacitats com NAT, modelatge de trànsit, etc. per a la situació típica de VPS. Afortunadament, les característiques bàsiques del tallafoc compleixen fàcilment els nostres requisits.
Per iniciar el tallafoc en el moment de l'arrencada, afegiu el següent a /etc/rc.conf:
firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"
L' serviceordre està disponible per iniciar/aturar el tallafoc manualment:
[user@vultr ~]$ sudo service ipfw start
Naturalment, ipfwno farà res fins que afegeix regles, sovint d'un fitxer, en aquest exemple situat a /usr/local/etc/IPFW.rules. De fet, el fitxer de regles es podria localitzar a qualsevol lloc o tenir qualsevol nom, sempre que coincideixi amb el paràmetre "firewall_script". El fitxer de regles es descriu amb detall a continuació.
sshguardve en diversos sabors per utilitzar-los amb diferents tallafocs. Utilitzeu la pkgutilitat per obtenir i instal·lar sshguard-ipfw:
[user@vultr ~]$ sudo pkg install sshguard-ipfw
En la majoria dels casos, això és tot el que cal fer. La variable adequada s'insereix automàticament a /etc/rc.confper començar a l'arrencada:
sshguard_enable="YES"
Els valors predeterminats normalment funcionen bé. Si calen valors diferents, la sshguardpàgina de manual ofereix informació detallada sobre els paràmetres:
# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"
Podeu començar sshguardamb la serviceinvocació habitual :
[user@vultr ~]$ sudo service sshguard start
Pas 3. Creeu un script de regles
La part més difícil és crear el conjunt de regles del tallafoc. ipfwpot fer ús de l' /etc/rc.firewallscript proporcionat , però s'ha de modificar per adaptar-se a SSHGuard, així com a diferents escenaris operatius. Algunes pàgines web i el manual de FreeBSD tenen informació útil sobre com fer-ho. Tanmateix, escriure un fitxer de regles no és tan difícil, a més, un conjunt de regles personalitzat pot ser més fàcil d'entendre i canviar quan sigui necessari.
Una característica important de les ipfwregles és que el primer partit guanya, la qual cosa significa que l'ordre de les regles és important. A ipfw, cada regla és una ordre i el fitxer de regles és un script d'intèrpret d'ordres executable. Això permet canviar el conjunt de regles modificant les regles i executant el fitxer de regles com a script de shell que és:
[user@vultr /usr/local/etc]$ sudo ./IPFW.rules
En general, un fitxer de regles definirà una variable per a l' ipfwordre, després esborrarà les regles actuals, emetrà regles genèriques i, a continuació, procedirà a establir les regles "extrem", seguides de les regles "in". La pàgina de manual d'ipfw i altres recursos contenen una gran quantitat d'informació sobre l'estructura de regles i opcions que són nombroses com a mínim.
Com que la versió sshguard de FreeBSD s'ha actualitzat a la versió 1.6.2, el mètode d'inserció de regles de bloqueig per als infractors ha canviat. Ara les adreces dels delinqüents es mantenen en una taula ipfw (taula 22 per concretar), en lloc d'inserir-se a les regles per sobre de 55000 com abans.
Afortunadament, és bastant senzill configurar el fitxer de regles per utilitzar la taula. Només és qüestió de posar la regla de la taula al lloc correcte i assegurar-se d'utilitzar la sintaxi correcta quan escrigui la regla.
Quan sshguardtroba un delinqüent, posa l'adreça del delinqüent a la seva llista negra i també insereix l'adreça a la ipfwtaula de manera que "activarà" la denegació d'accés. Aquesta norma assolirà aquests propòsits:
01000 deny ip from table\(22\) to any
Encara és necessari posar regles que permetin els serveis d'entrada per sobre de 01000 en aquest cas. Per exemple, suposem que l'adreça 10.20.30.40és un infractor a la taula 22, i tenim aquesta regla ipfw:
56420 allow tcp from any to me dst-port 22 in via $vif
Com que es ipfwtroba la regla 01000 abans de la regla 56420 , 10.20.30.40està bloquejada . No es veurà mai amb la regla de "permetre 22 polzades". Si la regla de permetre tingués un número "normal" com 00420 , el trànsit dolent es deixaria entrar i no es bloquejaria mai (perquè 00420 és inferior a 01000 i "el primer partit guanya").
Una bona característica de la versió actualitzada és que ara, quan sshguard s'inicia, totes les adreces de la llista negra s'afegeixen a la taula i estan disponibles per bloquejar els delinqüents entrants sense demora. La llista negra és acumulativa i es conserva entre sessions.
En aquest punt, probablement sigui raonable mostrar un ipfwconjunt de regles complet modificat per a sshguard. Els comentaris haurien de facilitar bastant seguir la lògica de la regla:
#!/bin/sh
# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.
# Flush all rules before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add "
vif="vtnet0"
# allow all for localhost
$cmd 00010 allow ip from any to any via lo0
# checks stateful rules. If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state
# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state
# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state
# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state
# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state
# allow icmp re: ping, et. al.
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state
# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state
# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state
# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state
# otherwise deny outbound packets
# outbound catchall.
$cmd 00299 deny log ip from any to any out via $vif
# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif
# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif
# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif
# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif
# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state
$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2
# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any
# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state
# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif
# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any
Pas 4. Inici i prova
Les necessitats del sistema varien i les diferents opcions de ports per bloquejar o desbloquejar es reflecteixen al conjunt de regles. Un cop finalitzat el conjunt de regles, deseu el fitxer a /usr/local/etc/IPFW.rules, i inicieu els serveis FBSD:
# service ipfw start
# service sshguard start
El tallafoc augmentat s'hauria d'executar ara! Comprovar sshguard:
[user@vultr ~]$ sudo pgrep -lfa ssh
Si sshguards'està executant, es mostren el seu pid i la línia d'ordres completa:
720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid
Això mostra el conjunt de regles del tallafoc amb estadístiques i la darrera vegada que un paquet va coincidir amb la regla:
[user@vultr ~]$ sudo ipfw -cat list
Després d'hores o dies, les adreces dels delinqüents s'afegeixen a la llista negra i també a la taula 22. Per veure totes les adreces de la taula, utilitzeu aquesta ordre:
ipfw table 22 list
El resultat s'imprimeix com:
10.10.10.118/32 0
10.10.10.72/32 0
...
Com s'ha descrit anteriorment, les connexions des d'aquestes adreces no estan permeses. Per descomptat, a la primera execució sshguardno hi haurà cap adreça a la llista, però amb el temps pot arribar a ser força llarga. Una opció és crear regles de bloqueig separades per a adreces amb diverses entrades a la taula i després eliminar-les de la llista negra.
Pas 5. Mantenir la vigilància...
És una bona idea comprovar de tant en tant els registres per assegurar-se que les intrusions estan controlades. En general, /var/log/auth.logi /var/log/securitysón informatius. Els buits o errors en la cobertura dels serveis de xarxa poden ser evidents. Modificar el conjunt de regles del tallafoc segons sigui necessari és una part normal de l'administració del servidor.
En versions anteriors de sshguard, quan el /var/db/sshguard/blacklist.dbfitxer s'havia fet gran, podia impedir que s'iniciés a l' sshguardarrencada del sistema. Es permet l'inici de l'eliminació o el canvi de nom del fitxer de la llista negra sshguard. Sembla que aquest problema s'ha solucionat a l'última versió de sshguard, de manera que probablement aquesta solució ja no sigui necessària.
Assegureu-vos de posar a la llista blanca l'adreça IP des de la qual esteu connectat a la sessió SSH. Si et bloqueges accidentalment, sempre pots connectar-te a la consola noVNC a https://my.vultr.com i incloure la teva IP a la llista blanca.
En resum, utilitzar la combinació de ipfwi sshguardajuda a mantenir el vostre sistema FreeBSD segur i fent la seva feina. Minimitzar l'activitat intrusiva de la xarxa té un avantatge addicional: menys "soroll" facilita el seguiment i l'ajust del funcionament del sistema, contribuint a un servidor més segur i que funcioni millor.
Protegir eficaçment un sistema/servidor FreeBSD no és especialment complicat. Tot i que cal un esforç modest per posar-lo en marxa, val la pena en un VPS i una seguretat del projecte substancialment superiors.