Denne tutorial viser dig, hvordan du beskytter din FreeBSD-server ved hjælp af OpenBSD PF firewall. Vi antager, at du har en ren FreeBSD-installation installeret af Vultr uden tilføjede brugere. Vi vil gøre nogle andre ting udover Firewall-konfiguration, som også vil hærde sikkerheden på vores FreeBSD-server. Før firewall-konfiguration vil vi installere nogle pakker, da standard FreeBSD-installationen kommer med et minimalt sæt værktøjer og pakker (hvilket er korrekt), for at gøre det lettere for os at arbejde.
Standard shell i FreeBSD er /bin/sh. Dette er en grundlæggende skal uden autofuldførelsesfunktioner. Vi vil bruge noget bedre. Vi installerer zsh.
Installer først disse pakker:
# 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 er lsprogrammet fra Linux. Vi vil bare have den samme lskommando i Linux og FreeBSD.
Tilføj en normal bruger til systemet: (erstat john med dit brugernavn og glem ikke at tilføje bruger til hjulgruppen)
# 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!
Opret zsh-konfigurationsfil:
# ee /home/your-username/.zshrc
Kopier dette til din .zshrc-fil:
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
Kør denne kommando: (erstat john med dit brugernavn)
chown john:john /home/john/.zshrc
Log nu ind på FreeBSD-serveren med dit brugernavn og skift standard root-adgangskoden:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd 
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]# 
Vi har ikke brug for sendmail. Stop og deaktiver denne tjeneste:
<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.
Dernæst vil vi ændre vores rc.conf-fil, så den ser mere naturlig ud:
# ee /etc/rc.conf
Skift det til at se sådan ud:
#----------- 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"
Rediger /etc/hostsfil:
# ee /etc/hosts
Tilføj din IP-adresse og værtsnavn:
::1                     localhost localhost.ceph ceph
127.0.0.1               localhost localhost.ceph ceph
108.61.178.110          ceph.domain1.com       ceph
Indstil tidszone:
# bsdconfig
Når du kan, deaktiver fjernadgang for root-brugeren. De fleste angreb på SSH vil forsøge at få adgang via root-brugerkontoen. Forbind altid med dit brugernavn og derefter sutil root. Kun brugere fra wheelgruppen kan suroote. Derfor føjede vi vores bruger til hjulgruppen.
Deaktiver root-login:
# ee /etc/ssh/sshd_config
Fjern kommentarer til denne linje:
PermitRootLogin no
Genstart:
# reboot
Når genstarten er færdig, vil du se en meddelelse som denne i Vultr-konsollen:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Derfor skal vi korrigere uret manuelt. Følg disse kommandoer, først for suat root:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Nu skal vi konfigurere firewallen. OpenBSD PF er inkluderet i FreeBSD-kernen, så du behøver ikke at installere nogen pakker.
Med eeeditor, opret fil /etc/firewall:
# ee /etc/firewall
Indsæt dette: (erstat eventuelle IP-adresser med dine)
#######################################################################
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
Opret /etc/trustedfil. I denne fil vil vi lægge IP'er, som vi "har tillid til".
# ee /etc/trusted
Tilføj nogle IP'er:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Nu lidt forklaring. Junk-porte og junk-IP'er er bare nogle porte/IP'er, som vi ikke ønsker at se i logfiler. Det har vi gjort med denne regel:
# ---- 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
Disse er blot standardindstillinger, og du behøver ikke bekymre dig om det:
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
Denne regel blokerer udgående SMTP-trafik fra din server (som er standard på Vultr).
# ---- block SMTP out 
block quick proto tcp from $me to any port 25
Bortset bruteforcersfra at resten er ret ligetil.
# ---- 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 siger bare: Tillad fra <trusted> IP'er til port 22, men der kan kun laves 10 samtidige forbindelser fra én kilde-IP. Hvis det er mere end 10, skal du blokere denne IP og sætte den i table bruteforcers. Det samme gælder for 20/60-reglen. Det betyder maks. 20 forbindelser på 60 sekunder.
Aktiver firewall:
# ee /etc/rc.conf
Fjern kommentarer til disse linjer: 
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Genstart: 
# reboot 
Hvis du har gjort alt rigtigt, så vil du være i stand til at logge ind, og firewallen vil blive aktiveret. Du behøver ikke at genstarte hver gang du ændrer /etc/firewallfilen. Bare gør:
# /etc/rc.d/pf reload
Se, hvem der forsøger at oprette forbindelse til din server i realtid:
# tcpdump -n -e -ttt -i pflog0
Vis historik:
# tcpdump -n -e -ttt -r /var/log/pflog
Se om du har nogen i bruteforcers table:
# pfctl -t bruteforcers -T show
Og det er det. Du har med succes implementeret PF firewall på FreeBSD server!