Nastavte si FreeBSD server jako zkušený administrátor

V současné době je poměrně jednoduché si připojit vlastní server do Internetu. Ať už si pořídíte virtuální službu např. u Vultr, DigitalOcean nebo máte vlastní HW, vždy budete potřebovat základní nastavení FreeBSD serveru. V tomto článku najdete základní minimum nutné k běhu serveru.

Předpoklady

Než začneme, budeme potřebovat následující:

  • Nainstalované FreeBSD 64 bit poslední verze (viz Handbook).
  • Základní znalost UNIXu, práce v příkazové řádce.
  • Heslo k uživatelovi root.
  • Statickou IP adresu, IP adresu brány a DNS serverů.
  • Nejlépe registrovanou doménu pro hostname.

Poznámky k instalaci

Instalace je pěkně popsaná v Handbooku, tak ji nebudu popisovat. Uvedu jenom pár postřehů.

Na základní systém používám UFS v tradičním rozdělení. Pokud máte větší disk, přiřaďte víc místa pro sekci /tmp a /var. Pravidlo pro freebsd-swap bývalo dvojnásobek paměti RAM. Já se řídím jednonásobkem paměti, ale vždy se snažím mít minimálně 32 GB paměti v počitači. Tady hodně záleží, k čemu server hodláte použít.

Při instalaci zadávám pouze heslo pro uživatele root, dalšího uživatele přidávám až po prvním loginu do systému. DHCP na serveru nepoužívám, vždy přiděluji IP adresy ručně. U hostname se řídím pravidlem jmeno_pocitace.domena.neco, kde domena.neco mám zaregistrovanou.

Základní nastavení systému

FreeBSD obsahuje několik souborů, kde můžete významně měnit chování systému. Nejdůležitější konfigurační soubory jsou /etc/rc.conf, /etc/sysctl.conf a /boot/loader.conf. Většina konfiguračních souborů k operačnímu systému se nachází v adresáři /etc.

Nastavení sítě

Parametry síťového rozhraní a služeb se nastavují v souboru /etc/rc.conf. Potřebujete vlastní statickou IP adresu, IP adresu brány do Internetu a hostname. Příklad ukazuje i minimální konfiguraci souboru hned po instalaci systému.

# Clear /tmp on boot
clear_tmp_enable="YES"

hostname="server.example.com"

# IPv4 default LAN static configuration
ifconfig_igb0="inet 192.168.1.1 netmask 255.255.255.0"
defaultrouter="192.168.1.111"

# IPv6 default static configuration
ifconfig_igb0_ipv6="inet6 2000:f2a5:a440::2/64"
ipv6_defaultrouter="2000:f2a5:a440::1"
ipv6_activate_all_interfaces="YES"

sshd_enable="YES"

K nastavení DNS serverů slouží soubor /etc/resolv.conf. Zde můžete zadat jakoukoliv IP adresu DNS serveru.

search example.com
nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001

Povolení jaderných modulů

K nastavení parametrů při nabíhání systému slouží soubor /boot/loader.conf. Soubor po instalaci systému je prázdný, zde je uvedena pouze minimální konfigurace.

# Bootloader prompt timeout (seconds)
autoboot_delay="5"

# Thermal sensors for intel or amd cpus
#amdtemp_load="YES"
coretemp_load="YES"

# Advanced Host Controller Interface (AHCI) 
ahci_load="YES"

# Enable hardware accelerated AES
aesni_load="YES"

# Pf firewall kernel modules, preload
pf_load="YES"
pflog_load="YES"

Změna uvítacího textu

Při prvním přihlášení vyskočí hodně textu, který je uložen v souboru /etc/motd. Modifickaci tohoto souboru provedeme následovně:

root@server:~ # echo "Welcome to FreeBSD!" > /etc/motd

Přidání nového uživatele

K přidání nového uživatele slouží příkaz adduser. Text označený tučným písmem je vstup z klávesnice. Na řádcích Enter password a Enter password again se vstup z klávesnice nezobrazuje.

root@server:~ # adduser
Username: tonda
Full name: Tonda Novak
Uid (Leave empty for default): 
Login group [tonda]: wheel
Login group is wheel. Invite tonda into other groups? []:
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Home directory [/home/tonda]: 
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   : tonda
Password   : *****
Full Name  : Tonda Novak
Uid        : 1002
Class      : 
Groups     : tonda wheel
Home       : /home/tonda
Home Mode  : 
Shell      : /bin/tcsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (tonda) to the user database.
Add another user? (yes/no): no
Goodbye!
root@server:~ #

Přídáním uživatele do skupiny “wheel” docílíme, že se můžeme přepnout na uživatele “root” příkazem su -l.

Upgrade systému

Hned po instalaci provedeme aktualizaci na poslední verzi.

root@server:~ # freebsd-update fetch
root@server:~ # freebsd-update install
root@server:~ # shutdown -r now

Doporučuju prostudovat stránku FreeBSD Security Information a přihlásit se k odebírání novinek emailem. Tak budete udržovat FreeBSD stále aktuální.

Instalování aplikací z portů

Na FreeBSD jsou dvě možnosti instalace dodatečného software. Buď můžete instalovat binární balíčky nebo můžete použít porty (překlad zdrojového kódu). Instalace pomocí portů je časově náročnější, na druhou stranu si můžete port nakonfigurovat podlé svého. Ještě než začneme používat porty, musíme stáhnout a nainstalovat kolekci portů. Tato operace může trvat delší dobu.

root@server:~ # portsnap fetch
root@server:~ # portsnap extract

Jakmile skončí aktualizace portů, můžete používat porty obvyklým způsobem. Instalaci editoru Vim provedete následujícím příkazem:

root@server:~ # cd /usr/ports/editors/vim-console 
root@server:~ # make install clean

Nyní máte nainstalovaný editor vim. Naučte se minimálně základy práce s editorem, budete to potřebovat.

Konfigurace OpenSSH

OpenSSH je sada nástrojů, které umožňují šifrovanou komunikaci mezi klientem a serverem. Můžeme se přihlašovat k vzdálenému shellu, kopírovat soubory nebo spouštět Xové aplikace.

SSH klíče

Ještě než začneme konfigurovat sshd server, vygenerujeme si na klientovi soukromý a veřejný klíč a nahrajeme veřejný klíč do souboru .ssh/authorized_keys v domovském adresáři na serveru.

tonda@client:~ % ssh-keygen -t ed25519 -a 100
tonda@client:~ % ssh-copy-id -i /home/tonda/.ssh/id_ed25519.pub tonda@server

Parametr -t ed25519 určuje typ klíče, parametr -a 100 specifikuje počet kol derivační fukce klíče použité při generování (vyšší číslo – lepší ochrana proti brute-force útokům).

Po nahrání veřejného klíče na vzdálený server se můžeme přihlašovat ke vzdálenému účtu bez zadávání hesla.

Nastavení sshd

Konfigurační soubor daemona se nachází v /etc/ssh/sshd_config.

Port 22
AddressFamily inet
# ListenAddress 127.0.0.1

# The default requires explicit activation of protocol 1
Protocol 2

# Ciphers and keying
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com

# Authentication:
PermitRootLogin no
StrictModes yes
MaxAuthTries 6

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile	.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes

# Change to yes to enable built-in password authentication.
PasswordAuthentication no
PermitEmptyPasswords no

# Change to no to disable PAM authentication
ChallengeResponseAuthentication no

X11Forwarding no
PermitTunnel no

# override default of no subsystems
Subsystem	sftp	/usr/libexec/sftp-server

# only these users can connect
AllowUsers tonda jarda

Port 22 je číslo portu, na kterém naslouchá OpenSSH daemon. Je na každém, jestli číslo portu změní. Já nechávám výchozí číslo 22, protože změnu nepovažuju za zvýšení bezpečnosti.

AddressFamily inet k serveru se můžou připojovat jenom IPv4 adresy.

ListenAddress z jaké adresy nebo bloku adres se můžete přihlásit na server.

Ciphers specifikuje dovolené šifry na serveru. Seznam dovolených šifer získáte příkazem $ ssh -Q cipher.

MACs specifikuje dostupné algoritmy MAC (message authentication code). Opět seznam získáte příkazem $ ssh -Q mac.

PermitRootLogin no zakáže vzdálené přihlášení uživatele root.

StrictModes yes kontrola práv v domovském adresáři uživatele před přihlášením.

MaxAuthTries 6 maximální počet pokusů při přihlášení na jednu relaci.

PasswordAuthentication no zakáže uživatelům přihlásit se pomocí hesla. Přihlásit se lze pouze pomocí klíče. Útočník tak nemůže hádat hesla, protože server mu odpoví Permission denied (publickey). Toto opatření výrazně zvyšuje bezpečnost, na druhou stranu musíte pečlivě střežit soukromý klíč. Pokud ho ztratíte, už se na server nepřihlásíte.

AllowUsers tonda jarda povoluje pouze vybrané uživatele, co se mouhou přihlásit k serveru. Uživatele oddělujeme mezerou.

Restartování sshd

Po nakonfigurování uložte sobor a nezavírejte otevřené ssh spojení. Ujistěte se, že máte v souboru /etc/rc.conf řádek sshd_enable="YES". Nyní stačí sshd restartovat.

root@server:~ # service sshd restart

Otevřete na klientovi nové ssh spojení a ověřte, že se můžete přihlásit k účtu na serveru.

Synchronizace času pomocí OpenNTPD

OpenNTPD není součástí FreeBSD, proto ho musíme nejdřív nainstalovat.

root@server:~ # cd /usr/ports/net/openntpd
root@server:~ # make install clean

Zkontrolujte, zda neběží původní NTP daemon a službu vypněte.

root@server:~ # service ntpd status
root@server:~ # service ntpd stop

Nastavení daemona se nachází v souboru /usr/local/etc/ntpd.conf, který vypadá následovně:

# $OpenBSD: ntpd.conf,v 1.14 2015/07/15 20:28:37 ajacoutot Exp $
#
# See ntpd.conf(5) and /etc/examples/ntpd.conf

# Addresses to listen on (ntpd does not listen by default)
#listen on your_server_ip

# Specify the IP address or the hostname of an NTP server to synchronize to.
server 0.cz.pool.ntp.org
server 1.cz.pool.ntp.org
server 2.cz.pool.ntp.org
server 3.cz.pool.ntp.org

# use all detected timedelta sensors
#sensor *

# get the time constraint from a well-known HTTPS site
constraints from "https://www.seznam.cz"

Seznam ntp serverů pro Českou republiku najdete na stránkách projektu pool.ntp.org. Odkomentováním řádku #listen on your_ip_address a zadáním IP adresy bude OpenNTPD fungovat jako server pro lokální síť.

Volba constraints umožňuje dotazy přes protokol HTTPS na důvěryhodný server a následnou kontrolu položky ‘Date’ v odpovědi. Tento čas se nepoužívá k synchronizaci, ale ke kontrole, jestli NTP servery vrací správný čas. Tím lze zabránit nebo omezit MITM útoky.

Spuštění OpenNTPD při startu systému docílíme přidáním následujících řádku do souboru /etc/rc.conf.

root@server:~ # echo 'openntpd_enable="YES"' >> /etc/rc.conf
root@server:~ # echo 'openntpd_flags="-s -v"' >> /etc/rc.conf

Ujistěte se, že máte zakomentovaný řádek ntpd_enable="YES" v souboru /etc/rc.conf.

Jakmile máme vše správně nastavené, spustíme OpenNTPD daemona.

root@server:~ # service openntpd start

Nakonec je dobré zkontrolovat časové pásmo příkazem date +"%Z". V našem časovém pásmu by měl být výstup CET nebo letní CEST. Na serverech lze používat i UTC. Nastavení vhodného pásma provedete příkazem tzsetup.

Konfigurace firewallu PF

FreeBSD obsahuje tři firewally – PF, IPFW a IPFILTER. Níže uvádím pouze konfiguraci pro PF. Příklad je vhodný pro server nebo klienta. Konfigurační soubor se nachází v /etc/pf.conf. Seznam všech dostupných služeb najdete v souboru /etc/services. Při experimentování s pravidly dávejte pozor, abyste si nezablokovali přihlašování přes ssh.

# Public network interface to the internet
ext_if="igb0"

# Enable these services
tcp_services = "{domain, http, https, ssh}"
udp_services = "{domain}"

# Skip all filtering on loopback interface
set skip on lo

# Sets the default behavior for filter rules that specify the block action.
#  drop - packet is silently dropped.
#  return - a TCP RST packet is returned for blocked TCP packets and an ICMP Unreachable packet is returned for all others. 
set block-policy return

# Log only on the external interface
set loginterface $ext_if

# Reassemble all fragmented packets before filtering them
scrub in on $ext_if all fragment reassemble

# Blocking spoofed packets
antispoof for $ext_if

# Set default behavior
block all

# Allow all icmp traffic
pass quick on $ext_if proto icmp
pass quick on $ext_if proto icmp6

# Allow incoming traffic to services hosted by this machine
pass in quick on $ext_if proto tcp to port $tcp_services
pass in quick on $ext_if proto udp to port $udp_services

# Allow all outgoing traffic
pass out quick on $ext_if

Vyhodnocování pravidel je formou shora dolů s tím, že na packet je aplikováno poslední vhodné pravidlo. Direktiva quick zajistí, že jakmile packet odpovídá pravidlu, tak je na něj okamžitě aplikováno a procházení dalších pravidel je zastaveno.

Po nakonfigurování firewallu přidáme řádky důležité pro spuštění PF s logováním do /etc/rc.conf.

root@server:~ # echo 'pf_enable="YES"' >> /etc/rc.conf
root@server:~ # echo 'pf_rules="/etc/pf.conf"' >> /etc/rc.conf
root@server:~ # echo 'pflog_enable="YES"' >> /etc/rc.conf
root@server:~ # echo 'pflog_logfile="/var/log/pflog"' >> /etc/rc.conf

Nakonec spustíme pf firewall a pflog.

root@server:~ # service pf start
root@server:~ # service pflog start

Příkaz pfctl a sledování logů

Program pfctl slouží k ovládání Packet Firewallu z příkazové řádky. Má široké použití, zde uvedu jenom pár příkladů.

Zkontroluje, zda konfigurační soubor neobsahuje chyby.

root@server:~ # pfctl -vnf /etc/pf.conf

Povolení PF.

root@server:~ # pfctl -e

Vypnutí PF.

root@server:~ # pfctl -d

Kompletně vymaže tabulky NAT, stavů spojení a pravidel. Nakonec opět načte pravidla z /etc/pf.conf.

root@server:~ # pfctl -F all -f /etc/pf.conf

Ke kontrole logovacích souborů slouží program tcpdump.

root@server:~ # tcpdump -n -e -ttt -r /var/log/pflog

Online sledování logů.

root@server:~ # tcpdump -n -e -ttt -i pflog0

Závěr

To je vše. Nyní máte jednoduchý a bezpečný FreeBSD server použitelný téměř na cokoliv. Pokud máte veřejnou IP adresu, připojte stroj do Internetu. Pokud nemáte, zaregistrujte se na Vultru nebo DigitalOceanu. Zaregistrováním dostanete nějaký dolary zdarma, o to je zkoušení zábavnější. A hlavně váš server začne naplno žít.

Zajímavé odkazy

  • FreeBSD Handbook – povinné čtění pro každého administrátora
  • OpenBSD PF FAQ – jak nakonfigurovat PF firewall
  • calomel.org – stránky s velkým množstvím kvalitních návodů
  • c0ffee.net – dobré postřehy s nastavováním FreeBSD a OpenBSD serverů