Jak zabezpieczyć FreeBSD za pomocą PF Firewall

Ten samouczek pokaże, jak chronić serwer FreeBSD za pomocą zapory ogniowej OpenBSD PF. Zakładamy, że masz czystą instalację FreeBSD wdrożoną przez Vultr bez dodanych użytkowników. Oprócz konfiguracji zapory zrobimy też inne rzeczy, które zwiększą bezpieczeństwo naszego serwera FreeBSD. Przed konfiguracją firewalla zainstalujemy niektóre pakiety, ponieważ domyślna instalacja FreeBSD zawiera minimalny zestaw narzędzi i pakietów (co jest poprawne), aby ułatwić nam pracę.

Domyślna powłoka w FreeBSD to /bin/sh. Jest to podstawowa powłoka bez funkcji autouzupełniania. Użyjemy czegoś lepszego. Zainstalujemy zsh.

Najpierw zainstaluj te pakiety:

# 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 to lsprogram z Linuksa. Chcemy tylko mieć to samo lspolecenie w Linuksie i FreeBSD.

Dodaj normalnego użytkownika do systemu: (zamień John na swoją nazwę użytkownika i nie zapomnij dodać użytkownika do grupy kół)

# 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!

Utwórz plik konfiguracyjny zsh:

# ee /home/your-username/.zshrc

Skopiuj to do pliku .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

Uruchom to polecenie: (zamień John na swoją nazwę użytkownika)

chown john:john /home/john/.zshrc

Teraz zaloguj się do serwera FreeBSD przy użyciu swojej nazwy użytkownika i zmień domyślne hasło roota:

<vultr>[~]$ su
Password:
<vultr>[~]# passwd 
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]# 

Nie potrzebujemy sendmaila. Zatrzymaj i wyłącz tę usługę:

<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.

Następnie zmienimy nasz plik rc.conf, aby wyglądał bardziej naturalnie:

# ee /etc/rc.conf

Zmień go, aby wyglądał następująco:

#----------- 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"

Edytuj /etc/hostsplik:

# ee /etc/hosts

Dodaj swój adres IP i nazwę hosta:

::1                     localhost localhost.ceph ceph
127.0.0.1               localhost localhost.ceph ceph
108.61.178.110          ceph.domain1.com       ceph

Ustaw strefę czasową:

# bsdconfig

Gdy tylko możesz, wyłącz dostęp zdalny dla użytkownika root. Większość ataków na SSH próbuje uzyskać dostęp za pośrednictwem konta użytkownika root. Zawsze łącz się ze swoją nazwą użytkownika, a następnie suzrootuj. Tylko użytkownicy z wheelgrupy mogą surootować. Dlatego dodaliśmy naszego użytkownika do grupy kół.

Wyłącz logowanie roota:

# ee /etc/ssh/sshd_config

Odkomentuj tę linię:

PermitRootLogin no

Restart:

# reboot

Po zakończeniu ponownego uruchomienia w konsoli Vultr zobaczysz taki komunikat:

time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.

Dlatego musimy ręcznie skorygować zegar. Wykonaj następujące polecenia, suaby najpierw zrootować:

$ su
Password:
# ntpdate 0.europe.pool.ntp.org

Teraz skonfigurujemy zaporę ogniową. OpenBSD PF jest zawarty w jądrze FreeBSD, więc nie musisz instalować żadnych pakietów.

Za pomocą eeedytora utwórz plik /etc/firewall:

# ee /etc/firewall

Wstaw to: (zamień adresy IP na swoje)

#######################################################################
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

Utwórz /etc/trustedplik. W tym pliku umieścimy adresy IP, którym „ufamy”.

# ee /etc/trusted

Dodaj kilka adresów IP:

# Hosting
1.2.0.0/16

# My friends
1.2.4.0/24

Teraz jakieś wyjaśnienie. Niepotrzebne porty i niepotrzebne adresy IP to tylko niektóre porty / adresy IP, których nie chcemy widzieć w logach. Zrobiliśmy to z tą regułą:

# ---- 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

Są to tylko wartości domyślne i nie musisz się o to martwić:

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

Ta reguła blokuje wychodzący ruch SMTP z twojego serwera (który jest domyślny w Vultr).

# ---- block SMTP out 
block quick proto tcp from $me to any port 25

Tyle bruteforcersże reszta jest dość prosta.

# ---- 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 mówi po prostu: Zezwól z <zaufanych> adresów IP na port 22, ale tylko 10 jednoczesnych połączeń może być nawiązanych z jednego źródłowego adresu IP. Jeśli jest więcej niż 10, zablokuj ten adres IP i umieść go w tabeli bruteforcers. To samo dotyczy reguły 20/60. Oznacza to maksymalnie 20 połączeń w 60 sekund.

Włącz Firewall:

# ee /etc/rc.conf

Odkomentuj te linie:

pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""

Restart:

# reboot 

Jeśli zrobiłeś wszystko dobrze, będziesz mógł się zalogować i zapora zostanie włączona. Nie musisz restartować się przy każdej zmianie /etc/firewallpliku. Po prostu zrób:

# /etc/rc.d/pf reload

Zobacz, kto próbuje połączyć się z Twoim serwerem w czasie rzeczywistym:

# tcpdump -n -e -ttt -i pflog0

Pokaż historię:

# tcpdump -n -e -ttt -r /var/log/pflog

Sprawdź, czy masz kogoś w tabeli bruteforcers:

# pfctl -t bruteforcers -T show

I to wszystko. Udało Ci się zaimplementować zaporę PF na serwerze FreeBSD!


Tags: #BSD

Leave a Comment

Funkcjonalności warstw architektury referencyjnej Big Data

Funkcjonalności warstw architektury referencyjnej Big Data

Przeczytaj blog, aby w najprostszy sposób poznać różne warstwy w architekturze Big Data i ich funkcjonalności.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Chcesz zobaczyć rewolucyjne wynalazki Google i jak te wynalazki zmieniły życie każdego człowieka dzisiaj? Następnie czytaj na blogu, aby zobaczyć wynalazki Google.

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Whatsapp w końcu uruchomił aplikację Desktop dla użytkowników komputerów Mac i Windows. Teraz możesz łatwo uzyskać dostęp do Whatsapp z systemu Windows lub Mac. Dostępne dla Windows 8+ i Mac OS 10.9+

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

Energia jądrowa jest zawsze pogardzana, nigdy jej nie szanujemy z powodu przeszłych wydarzeń, ale nie zawsze jest zła. Przeczytaj post, aby dowiedzieć się więcej na ten temat.

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Koncepcja autonomicznych samochodów, które wyjadą na drogi za pomocą sztucznej inteligencji, to marzenie, które mamy już od jakiegoś czasu. Ale pomimo kilku obietnic nigdzie ich nie widać. Przeczytaj ten blog, aby dowiedzieć się więcej…

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Wzrasta liczba ataków ransomware, ale czy sztuczna inteligencja może pomóc w radzeniu sobie z najnowszym wirusem komputerowym? Czy AI jest odpowiedzią? Przeczytaj tutaj, wiedz, że sztuczna inteligencja jest zmorą lub zgubą

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

Sztuczna inteligencja nie jest dla ludzi nową nazwą. Ponieważ sztuczna inteligencja jest włączona do każdego strumienia, jednym z nich jest opracowywanie narzędzi zwiększających ludzką wydajność i dokładność. Skorzystaj z tych niesamowitych narzędzi uczenia maszynowego i uprość swoje codzienne zadania.

Wgląd w 26 technik analizy Big Data: część 2

Wgląd w 26 technik analizy Big Data: część 2

Zawsze potrzebujemy Big Data Analytics do efektywnego zarządzania danymi. W tym artykule omówiliśmy kilka technik analizy Big Data. Sprawdź ten artykuł.

Ataki DDOS: krótki przegląd

Ataki DDOS: krótki przegląd

Czy jesteś również ofiarą ataków DDOS i nie masz pewności co do metod zapobiegania? Przeczytaj ten artykuł, aby rozwiązać swoje pytania.