Aquest tutorial us mostrarà com protegir el vostre servidor FreeBSD mitjançant el tallafoc OpenBSD PF. Assumirem que teniu una instal·lació neta de FreeBSD desplegada per Vultr sense cap usuari afegit. Farem algunes altres coses a més de la configuració del tallafocs que també enduriran la seguretat del nostre servidor FreeBSD. Abans de la configuració del tallafoc, instal·larem alguns paquets ja que la instal·lació per defecte de FreeBSD inclou un conjunt mínim d'eines i paquets (que és correcte), per facilitar-nos el treball.
El shell predeterminat a FreeBSD és /bin/sh. Aquest és un shell bàsic sense funcions d'autocompletar. Farem servir alguna cosa millor. Instal·larem zsh.
Primer, instal·leu aquests paquets:
# pkg install zsh gnuls
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
...
GNULS és el lsprograma de Linux. Només volem tenir la mateixa lscomanda a Linux i FreeBSD.
Afegiu un usuari normal al sistema: (substituïu john pel vostre nom d'usuari i no us oblideu d'afegir usuari al grup de rodes)
# adduser
Username: john
Full name: John Doe
Uid (Leave empty for default):
Login group [john]:
Login group is john. Invite john into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh rzsh nologin) [sh]: zsh
Home directory [/home/john]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : john
Password : *****
Full Name : John Doe
Uid : 1001
Class :
Groups : john wheel
Home : /home/john
Home Mode :
Shell : /usr/local/bin/zsh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (john) to the user database.
Add another user? (yes/no): no
Goodbye!
Creeu un fitxer de configuració zsh:
# ee /home/your-username/.zshrc
Copieu això al vostre fitxer .zshrc:
PS1="<%U%m%u>$[%B%1~%b]%(#.#.$) "
bindkey -e
alias su='su -m'
alias du='du -h -d0'
alias df='df -h'
alias l=less
alias ll='gnuls --color=always -l'
alias ls='gnuls --color=always'
alias pkg_ver='pkg version -v -l "<" | > upgrade'
export EDITOR=ee
autoload -U colors && colors
autoload -U promptinit && promptinit
autoload -U compinit && compinit
# History settings
SAVEHIST=1000
HISTSIZE=1000
HISTFILE=~/.history
setopt histignoredups appendhistory
Executeu aquesta ordre: (substituïu john pel vostre nom d'usuari)
chown john:john /home/john/.zshrc
Ara, inicieu sessió al servidor FreeBSD amb el vostre nom d'usuari i canvieu la contrasenya d'arrel predeterminada:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
No necessitem sendmail. Atureu i desactiveu aquest servei:
<vultr>[~]# /etc/rc.d/sendmail stop
Stopping sendmail.
Waiting for PIDS: 7843.
sendmail_submit not running? (check /var/run/sendmail.pid).
Stopping sendmail_msp_queue.
Waiting for PIDS: 7846.
A continuació, canviarem el nostre fitxer rc.conf perquè sembli més natural:
# ee /etc/rc.conf
Canvieu-lo perquè sembli així:
#----------- NETWORKING ------------------------------------------------#
hostname="ceph.domain1.com" # replace ceph.domain1.com with your domain
ifconfig_vtnet0="dhcp"
static_routes=linklocal
route_linklocal="-net 169.254.0.0/16 -interface vtnet0"
#--------- SERVICES BSD LOCAL ----------------------------------------#
sshd_enable="YES"
ntpd_enable="YES"
#pf_enable="YES"
#pf_rules="/etc/firewall"
#pf_flags=""
#pflog_enable="YES"
#pflog_logfile="/var/log/pflog"
#pflog_flags=""
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
Edita /etc/hostsfitxer:
# ee /etc/hosts
Afegiu la vostra adreça IP i el vostre nom d'amfitrió:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Estableix la zona horària:
# bsdconfig
Sempre que pugueu, desactiveu l'accés remot per a l'usuari root. La majoria dels atacs a SSH intentaran accedir a través del compte d'usuari root. Connecteu-vos sempre amb el vostre nom d'usuari i després sua root. Només els usuaris del wheelgrup poden sufer root. És per això que hem afegit el nostre usuari al grup de rodes.
Desactiva l'inici de sessió root:
# ee /etc/ssh/sshd_config
Descomenteu aquesta línia:
PermitRootLogin no
Reinicieu:
# reboot
Un cop finalitzi el reinici, veureu un missatge com aquest a la consola Vultr:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Per això hem de corregir el rellotge manualment. Seguiu aquestes ordres, primer super arrelar:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Ara, anem a configurar el tallafoc. OpenBSD PF s'inclou al nucli de FreeBSD, de manera que no cal que instal·leu cap paquet.
Amb l' eeeditor, creeu un fitxer /etc/firewall:
# ee /etc/firewall
Inseriu això: (substituïu qualsevol adreça IP per la vostra)
#######################################################################
me="vtnet0"
table <bruteforcers> persist
table <trusted> persist file "/etc/trusted"
icmp_types = "echoreq"
junk_ports="{ 135,137,138,139,445,68,67,3222 }"
junk_ip="224.0.0.0/4"
set loginterface vtnet0
scrub on vtnet0 reassemble tcp no-df random-id
# ---- First rule obligatory "Pass all on loopback"
pass quick on lo0 all
# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip
block quick proto { tcp, udp } from any to any port $junk_ports
# ---- Second rule "Block all in and pass all out"
block in log all
pass out all keep state
############### FIREWALL ###############################################
# ---- Allow all traffic from my Home
pass quick proto {tcp, udp} from 1.2.3.4 to $me keep state
# ---- block SMTP out
block quick proto tcp from $me to any port 25
# ---- Allow incoming Web traffic
pass quick proto tcp from any to $me port { 80, 443 } flags S/SA keep state
# ---- Allow my team member SSH access
pass quick proto tcp from 1.2.3.5 to $me port ssh flags S/SA keep state
# ---- Block bruteforcers
block log quick from <bruteforcers>
# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)
# ---- Allow ICMP
pass in inet proto icmp all icmp-type $icmp_types keep state
pass out inet proto icmp all icmp-type $icmp_types keep state
Crea un /etc/trustedfitxer. En aquest fitxer, posarem les IP en les quals "confiem".
# ee /etc/trusted
Afegiu algunes IP:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Ara una mica d'explicació. Els ports no desitjats i les IP no desitjades són només alguns ports/IP que no volem veure als registres. Ho hem fet amb aquesta regla:
# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip
block quick proto { tcp, udp } from any to any port $junk_ports
Aquests són només els valors predeterminats i no us haureu de preocupar:
icmp_types = "echoreq"
set loginterface vtnet0
scrub on vtnet0 reassemble tcp no-df random-id
pass quick on lo0 all
block in log all
pass out all keep state
Aquesta regla bloqueja el trànsit SMTP sortint del vostre servidor (que és el predeterminat a Vultr).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Excepte que bruteforcersla resta és bastant senzill.
# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)
Bruteforcers només diu: Permet des d'IPs <de confiança> al port 22, però només es poden fer 10 connexions simultànies des d'una IP d'origen. Si és més de 10, bloquegeu aquesta IP i poseu-la a la taula bruteforcers. El mateix passa amb la regla 20/60. Significa un màxim de 20 connexions en 60 segons.
Activa el tallafoc:
# ee /etc/rc.conf
Descomenteu aquestes línies:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Reinicieu:
# reboot
Si ho heu fet tot bé, podreu iniciar sessió i el tallafoc s'habilitarà. No cal que reinicieu cada vegada que canvieu el /etc/firewallfitxer. Només fes:
# /etc/rc.d/pf reload
Vegeu qui està provant de connectar-se al vostre servidor en temps real:
# tcpdump -n -e -ttt -i pflog0
Mostra l'historial:
# tcpdump -n -e -ttt -r /var/log/pflog
Mireu si teniu algú a la taula de bruteforcers:
# pfctl -t bruteforcers -T show
I ja està. Heu implementat correctament el tallafoc PF al servidor FreeBSD!