Questo tutorial ti mostrerà come proteggere il tuo server FreeBSD usando il firewall OpenBSD PF. Supponiamo che tu abbia un'installazione pulita di FreeBSD distribuita da Vultr senza che siano stati aggiunti utenti. Faremo altre cose oltre alla configurazione del Firewall che rafforzerà anche la sicurezza del nostro server FreeBSD. Prima della configurazione del firewall, installeremo alcuni pacchetti poiché l'installazione di FreeBSD predefinita viene fornita con un set minimo di strumenti e pacchetti (che è corretto), per facilitarci il lavoro.
La shell di default in FreeBSD è /bin/sh
. Questa è una shell di base senza funzioni di completamento automatico. Useremo qualcosa di meglio. Installeremo zsh
.
Innanzitutto, installa questi pacchetti:
# 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 è il ls
programma di Linux. Vogliamo solo avere lo stesso ls
comando in Linux e FreeBSD.
Aggiungi un utente normale al sistema: (sostituisci john con il tuo nome utente e non dimenticare di aggiungere l'utente al gruppo ruote)
# 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!
Crea il file di configurazione zsh:
# ee /home/your-username/.zshrc
Copia questo nel tuo file .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
Esegui questo comando: (sostituisci john con il tuo nome utente)
chown john:john /home/john/.zshrc
Ora accedi al server FreeBSD con il tuo nome utente e modifica la password di root predefinita:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
Non abbiamo bisogno di sendmail. Interrompi e disabilita questo servizio:
<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.
Successivamente, cambieremo il nostro file rc.conf per sembrare più naturale:
# ee /etc/rc.conf
Modificalo in questo modo:
#----------- 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"
Modifica /etc/hosts
file:
# ee /etc/hosts
Aggiungi il tuo indirizzo IP e nome host:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Imposta fuso orario:
# bsdconfig
Quando è possibile, disabilitare l'accesso remoto per l'utente root. La maggior parte degli attacchi su SSH proverà ad accedere tramite l'account utente root. Connettiti sempre con il tuo nome utente e quindi su
a root. Solo gli utenti del wheel
gruppo possono su
eseguire il root. Ecco perché abbiamo aggiunto il nostro utente al gruppo ruote.
Disabilita il login root:
# ee /etc/ssh/sshd_config
Rimuovi commento questa riga:
PermitRootLogin no
Reboot:
# reboot
Al termine del riavvio, vedrai un messaggio come questo nella console Vultr:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Ecco perché dobbiamo correggere l'orologio manualmente. Segui questi comandi, prima su
di root:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Ora configureremo il firewall. OpenBSD PF è incluso nel kernel di FreeBSD, quindi non è necessario installare alcun pacchetto.
Con l' ee
editor, crea il file /etc/firewall
:
# ee /etc/firewall
Inserisci questo: (sostituisci tutti gli indirizzi IP con i tuoi)
#######################################################################
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 /etc/trusted
file. In questo file, inseriremo gli IP di cui "fidiamo".
# ee /etc/trusted
Aggiungi alcuni IP:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Ora qualche spiegazione. Le porte spazzatura e gli IP spazzatura sono solo alcune porte / IP che non vogliamo vedere nei registri. Lo abbiamo fatto con questa regola:
# ---- 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
Queste sono solo impostazioni predefinite e non devi preoccuparti:
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
Questa regola blocca il traffico SMTP in uscita dal tuo server (che è l'impostazione predefinita su Vultr).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Tranne bruteforcers
il resto è piuttosto semplice.
# ---- 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 dice solo: Consenti da <trusted> IP alla porta 22 ma solo 10 connessioni simultanee possono essere fatte da un IP di origine. Se è superiore a 10, blocca questo IP e inseriscilo nella tabella bruteforcer. Lo stesso vale per la regola 20/60. Significa un massimo di 20 connessioni in 60 secondi.
Abilita firewall:
# ee /etc/rc.conf
Riattiva queste righe:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Reboot:
# reboot
Se hai fatto tutto correttamente, sarai in grado di accedere e il firewall sarà attivato. Non è necessario riavviare ogni volta che si modifica il /etc/firewall
file. Basta fare:
# /etc/rc.d/pf reload
Scopri chi sta provando a connettersi al tuo server in tempo reale:
# tcpdump -n -e -ttt -i pflog0
Mostra cronologia:
# tcpdump -n -e -ttt -r /var/log/pflog
Vedi se hai qualcuno nella tabella bruteforcers:
# pfctl -t bruteforcers -T show
E questo è tutto. Hai implementato con successo il firewall PF sul server FreeBSD!