Denne opplæringen vil vise deg hvordan du beskytter din FreeBSD-server ved å bruke OpenBSD PF brannmur. Vi vil anta at du har en ren FreeBSD-installasjon distribuert av Vultr uten brukere lagt til. Vi vil gjøre noen andre ting ved siden av brannmurkonfigurasjon som også vil forsterke sikkerheten til vår FreeBSD-server. Før brannmurkonfigurasjon vil vi installere noen pakker siden standard FreeBSD-installasjonen kommer med et minimalt sett med verktøy og pakker (som er riktig), for å gjøre det lettere for oss å jobbe.
Standardskallet i FreeBSD er /bin/sh. Dette er et grunnleggende skall uten autofullføringsfunksjoner. Vi skal bruke noe bedre. Vi vil installere zsh.
Installer først disse pakkene:
# 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 ha den samme lskommandoen i Linux og FreeBSD.
Legg til en vanlig bruker til systemet: (erstatt john med brukernavnet ditt og ikke glem å legge til bruker i 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!
Opprett zsh konfigurasjonsfil:
# ee /home/your-username/.zshrc
Kopier dette til .zshrc-filen din:
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
Kjør denne kommandoen: (erstatt john med brukernavnet ditt)
chown john:john /home/john/.zshrc
Logg nå på FreeBSD-serveren med brukernavnet ditt og endre standard root-passord:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
Vi trenger ikke sendmail. Stopp og deaktiver denne tjenesten:
<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.
Deretter vil vi endre rc.conf-filen vår slik at den ser mer naturlig ut:
# ee /etc/rc.conf
Endre den til å se slik ut:
#----------- 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
Legg til din IP-adresse og vertsnavn:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Angi tidssone:
# bsdconfig
Når du kan, deaktiver ekstern tilgang for rotbrukeren. De fleste angrep på SSH vil prøve å få tilgang gjennom root-brukerkontoen. Koble alltid til med brukernavnet ditt og deretter sutil root. Bare brukere fra wheelgruppen kan suroote. Derfor har vi lagt til brukeren vår i hjulgruppen.
Deaktiver rotpålogging:
# ee /etc/ssh/sshd_config
Fjern kommentarene til denne linjen:
PermitRootLogin no
Start på nytt:
# reboot
Etter at omstarten er ferdig, vil du se en melding som denne i Vultr-konsollen:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Derfor må vi korrigere klokken manuelt. Følg disse kommandoene, først for suå root:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Nå skal vi konfigurere brannmuren. OpenBSD PF er inkludert i FreeBSD-kjernen, så du trenger ikke å installere noen pakker.
Med eeeditor, lag fil /etc/firewall:
# ee /etc/firewall
Sett inn dette: (erstatt 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
Opprett /etc/trustedfil. I denne filen vil vi legge inn IP-er som vi "stoler på".
# ee /etc/trusted
Legg til noen IP-er:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Nå litt forklaring. Søppelporter og søppel-IP-er er bare noen porter/IP-er som vi ikke ønsker å se i logger. Vi har gjort dette med denne regelen:
# ---- 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
Dette er bare standardinnstillinger, og du trenger ikke å bekymre deg for 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 regelen blokkerer utgående SMTP-trafikk fra serveren din (som er standard på Vultr).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Bortsett fra bruteforcersat resten er ganske rett frem.
# ---- 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 sier bare: Tillat fra <trusted> IP-er til port 22, men bare 10 samtidige tilkoblinger kan gjøres fra én kilde-IP. Hvis det er mer enn 10, blokker denne IP-en og legg den inn i table bruteforcers. Det samme gjelder 20/60-regelen. Det betyr maks 20 tilkoblinger på 60 sekunder.
Aktiver brannmur:
# ee /etc/rc.conf
Fjern kommentarene til disse linjene:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Start på nytt:
# reboot
Hvis du har gjort alt riktig, vil du kunne logge på og brannmuren aktiveres. Du trenger ikke å starte på nytt hver gang du endrer /etc/firewallfilen. Bare gjør:
# /etc/rc.d/pf reload
Se hvem som prøver å koble til serveren din i sanntid:
# tcpdump -n -e -ttt -i pflog0
Vis historikk:
# tcpdump -n -e -ttt -r /var/log/pflog
Se om du har noen i bruteforcers table:
# pfctl -t bruteforcers -T show
Og det er det. Du har implementert PF brannmur på FreeBSD server!