Овај водич ће вам показати како да заштитите свој ФрееБСД сервер користећи ОпенБСД ПФ заштитни зид. Претпоставићемо да имате чисту ФрееБСД инсталацију коју је поставио Вултр без додатих корисника. Урадићемо још неке ствари осим конфигурације заштитног зида које ће такође ојачати безбедност нашег ФрееБСД сервера. Пре конфигурисања заштитног зида, ми ћемо инсталирати неке пакете пошто подразумевана инсталација ФрееБСД-а долази са минималним скупом алата и пакета (што је тачно), да би нам олакшали рад.
Подразумевана шкољка у ФрееБСД-у је /bin/sh. Ово је основна шкољка без функција аутоматског довршавања. Користићемо нешто боље. Ми ћемо инсталирати zsh.
Прво инсталирајте ове пакете:
# 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...
...
ГНУЛС је lsпрограм из Линук-а. Само желимо да имамо исту lsкоманду у Линуку и ФрееБСД-у.
Додајте нормалног корисника у систем: (замените јохн својим корисничким именом и не заборавите да додате корисника у групу точкова)
# 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!
Креирајте зсх конфигурациону датотеку:
# ee /home/your-username/.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
Покрените ову команду: (замените јохн својим корисничким именом)
chown john:john /home/john/.zshrc
Сада се пријавите на ФрееБСД сервер са својим корисничким именом и промените подразумевану роот лозинку:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
Не треба нам сендмаил. Зауставите и онемогућите ову услугу:
<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.
Затим ћемо променити нашу рц.цонф датотеку да изгледа природније:
# ee /etc/rc.conf
Промените да изгледа овако:
#----------- 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/hostsдатотеку:
# ee /etc/hosts
Додајте своју ИП адресу и име хоста:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Подесите временску зону:
# bsdconfig
Кад год можете, онемогућите даљински приступ за роот корисника. Већина напада на ССХ ће покушати да приступи преко роот корисничког налога. Увек се повежите са својим корисничким именом, а затим suса роот-ом. Само корисници из wheelгрупе могу suда рутирају. Због тога смо додали нашег корисника у групу точкова.
Онемогући роот пријаву:
# ee /etc/ssh/sshd_config
Одкоментирај овај ред:
PermitRootLogin no
Рестарт:
# reboot
Након што се рестартовање заврши, видећете поруку попут ове на Вултр конзоли:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Зато морамо ручно да коригујемо сат. Следите ове команде, прво suза роот:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Сада ћемо конфигурисати заштитни зид. ОпенБСД ПФ је укључен у ФрееБСД кернел, тако да не морате да инсталирате никакве пакете.
Помоћу eeедитора креирајте датотеку /etc/firewall:
# ee /etc/firewall
Унесите ово: (замените све ИП адресе својом)
#######################################################################
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/trustedдатотеку. У овај фајл ћемо ставити ИП адресе којима „верујемо“.
# ee /etc/trusted
Додајте неке ИП адресе:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Сада мало објашњења. Нежељени портови и нежељени ИП-ови су само неки портови/ИП-ови које не желимо да видимо у евиденцији. Ово смо урадили са овим правилом:
# ---- 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
Ово су само подразумеване вредности и не морате да бринете о томе:
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
Ово правило блокира одлазни СМТП саобраћај са вашег сервера (што је подразумевано на Вултр-у).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Осим што 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)
Брутефорцерс само каже: Дозволи са <поузданих> ИП-ова на порт 22, али само 10 истовремених веза може бити направљено са једне изворне ИП адресе. Ако је више од 10, блокирајте ову ИП адресу и ставите је у табеле брутефорцера. Исто важи и за правило 20/60. То значи максимално 20 веза за 60 секунди.
Омогући заштитни зид:
# ee /etc/rc.conf
Одкоментирај ове редове:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Рестарт:
# reboot
Ако сте све урадили како треба, онда ћете моћи да се пријавите и заштитни зид ће бити омогућен. Не морате да рестартујете сваки пут када промените /etc/firewallдатотеку. Само уради:
# /etc/rc.d/pf reload
Погледајте ко покушава да се повеже са вашим сервером у реалном времену:
# tcpdump -n -e -ttt -i pflog0
Прикажи историју:
# tcpdump -n -e -ttt -r /var/log/pflog
Видите да ли имате некога у табели брутефорцера:
# pfctl -t bruteforcers -T show
И то је то. Успешно сте имплементирали ПФ заштитни зид на ФрееБСД серверу!