Nastavte si FreeBSD server jako zkušený administrátor
10. února 2019V 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ů