Ez az oktatóanyag megmutatja, hogyan védheti meg FreeBSD szerverét OpenBSD PF tűzfallal. Feltételezzük, hogy a Vultr által telepített tiszta FreeBSD-telepítésed nincs hozzáadott felhasználó nélkül. A tűzfal beállításán kívül más dolgokat is meg fogunk tenni, ami szintén megerősíti a FreeBSD szerverünk biztonságát. A tűzfal konfigurálása előtt néhány csomagot telepítünk, mivel az alapértelmezett FreeBSD telepítéshez minimális eszköz- és csomagkészlet tartozik (ez helyes), hogy megkönnyítsük a munkát.
A FreeBSD alapértelmezett shellje a /bin/sh. Ez egy alaphéj, amely nem rendelkezik automatikus kiegészítési funkciókkal. Valami jobbat fogunk használni. Mi telepítjük zsh.
Először telepítse ezeket a csomagokat:
# 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...
...
A GNULS lsa Linux programja. Csak azt akarjuk, hogy ugyanaz a lsparancs legyen Linuxon és FreeBSD-n.
Adjon hozzá egy normál felhasználót a rendszerhez: (cserélje ki a john-t a felhasználónevére, és ne felejtse el hozzáadni a felhasználót a kerékcsoporthoz)
# 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!
Hozzon létre zsh konfigurációs fájlt:
# ee /home/your-username/.zshrc
Másolja ezt a .zshrc fájlba:
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
Futtassa ezt a parancsot: (cserélje ki a john-t a felhasználónevével)
chown john:john /home/john/.zshrc
Most jelentkezzen be a FreeBSD szerverre a felhasználónevével, és változtassa meg az alapértelmezett root jelszót:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
Nincs szükségünk sendmailre. Állítsa le és tiltsa le ezt a szolgáltatást:
<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.
Ezután megváltoztatjuk az rc.conf fájlunkat, hogy természetesebbnek tűnjön:
# ee /etc/rc.conf
Módosítsa a következőre:
#----------- 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"
/etc/hostsFájl szerkesztése :
# ee /etc/hosts
Adja hozzá IP-címét és gazdagépnevét:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Időzóna beállítása:
# bsdconfig
Amikor csak teheti, tiltsa le a távoli hozzáférést a root felhasználó számára. Az SSH elleni támadások többsége a root felhasználói fiókon keresztül próbál elérni. Mindig a felhasználónevével csatlakozzon, majd sua root-hoz. Csak a wheelcsoport felhasználói surootolhatnak. Ezért adtuk hozzá a felhasználónkat a kerékcsoporthoz.
Root bejelentkezés letiltása:
# ee /etc/ssh/sshd_config
Törölje a sor megjegyzését:
PermitRootLogin no
Újraindítás:
# reboot
Az újraindítás befejezése után egy ehhez hasonló üzenetet fog látni a Vultr konzolon:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Ezért kell manuálisan korrigálni az órát. Kövesse ezeket a parancsokat, először sua roothoz:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Most konfiguráljuk a tűzfalat. Az OpenBSD PF a FreeBSD kernel része, így nem kell csomagokat telepítened.
A eeszerkesztővel hozzon létre fájlt /etc/firewall:
# ee /etc/firewall
Illessze be ezt: (az IP-címeket cserélje ki a sajátjára)
#######################################################################
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
/etc/trustedFájl létrehozása . Ebben a fájlban olyan IP-címeket helyezünk el, amelyekben "megbízunk".
# ee /etc/trusted
Adj hozzá néhány IP-t:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Most egy kis magyarázat. A kéretlen portok és a kéretlen IP-címek csak néhány port/IP-k, amelyeket nem szeretnénk látni a naplókban. Ezt ezzel a szabállyal tettük meg:
# ---- 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
Ezek csak alapértelmezett értékek, és nem kell aggódnia miatta:
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
Ez a szabály blokkolja a kimenő SMTP-forgalmat a szerverről (ami a Vultr alapértelmezett beállítása).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Kivéve, hogy bruteforcersa többi elég egyértelmű.
# ---- 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)
A Bruteforcers csak azt mondja: Engedélyezze a <megbízható> IP-címekről a 22-es portra, de csak 10 párhuzamos kapcsolat hozható létre egy forrás IP-címéről. Ha több mint 10, blokkold ezt az IP-t, és tedd a bruteforcers táblázatba. Ugyanez vonatkozik a 20/60-as szabályra is. Ez maximum 20 csatlakozást jelent 60 másodperc alatt.
Tűzfal engedélyezése:
# ee /etc/rc.conf
Törölje a megjegyzéseket ezekről a sorokról:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Újraindítás:
# reboot
Ha mindent jól csinált, akkor be tud jelentkezni, és a tűzfal engedélyezve lesz. Nem kell minden alkalommal újraindítania, amikor módosítja a /etc/firewallfájlt. Csak csináld:
# /etc/rc.d/pf reload
Nézze meg, ki próbál csatlakozni valós időben a szerveréhez:
# tcpdump -n -e -ttt -i pflog0
Előzmények megjelenítése:
# tcpdump -n -e -ttt -r /var/log/pflog
Nézze meg, van-e valaki a bruteforcers táblázatban:
# pfctl -t bruteforcers -T show
És ez az. Sikeresen implementáltad a PF tűzfalat a FreeBSD szerveren!