Začínáme bezpečně s FreeBSD (6)

27. 7. 2004
Doba čtení: 10 minut

Sdílet

V dnešním dílu se konečně s naším systémem připojíme na síť a řekneme si něco o verzích FreeBSD, errata, upgradu a instalaci dodatečného software.

Ruční nastavení sítě

Nastavení sítě se skládá z identifikování stroje vlastní IP adresou, nastavení výchozí brány a IP adresy name serveru, který překládá doménové názvy na IP a obráceně.

K přiřazení IP adresy k síťové kartě slouží příkaz ifconfig. Přečtěte si man ifconfig. Interface = název karty, který je odvozen od ovladače. Ty jsou označeny podle výrobce, příklad pro síťovou kartu:

srot# dmesg | grep Ethernet
rl0: Ethernet address: 00:50:fc:a8:a2:89 

Víme tedy, že síťová karta je rl0 (RealTek). Použijeme statickou adresu (v tomto případě IP místní sítě):

srot# ifconfig rl0 inet 10.0.0.1 netmask 255.255.255.0 

Pro ověření funkčnosti si zkuste otestovat, zdali karta reaguje – ping 10.0.0.1. Dále musíme mít nastavenu výchozí bránu. Ta přesměrovává provoz dál, jestliže nemá cílovou adresu v dosahu (což by splňovala např. jiná adresa místní sítě).

srot# route add default 10.0.0.138 

Výchozí brána je poté zapsána do routovací/směrovací tabulky. Vypíšeme si položku pro výchozí bránu z tabulky:

srot# netstat -r -f inet | grep default
default 10.0.0.138 UGSc 3 0 rl0 

V případě, že byste si vypsali celou tabulku, uvidíte spoustu položek. Jestli chcete pochopit položky v routovací tabulce, doporučuji Handbook, man netstat je dost těžko stravitelný.

Pro funkční převod doménových názvů na IP a obráceně je důležité míti v souboru /etc/resolv.conf funkční IP name serveru.

srot# echo "nameserver 212.158.128.2" > /etc/resolv.conf 

Nyní už funguje i pingování na domény, o převod se stará námi definovaný name server.

srot# ping -c 2 root.cz
PING root.cz (81.31.5.5): 56 data bytes
64 bytes from 81.31.5.5: icmp_seq=0 ttl=58 time=31.151 ms
64 bytes from 81.31.5.5: icmp_seq=1 ttl=58 time=30.147 ms
... 

Poslední věcí, kterou bychom chtěli nastavit, je název stroje – hostname.

srot# hostname srot.patridosberu.cz 

Automatické nastavení sítě

Automatické nastavení sítě při startu systému má opět na starosti /etc/rc.conf a tyto položky:

defaultrouter="10.0.0.138"
hostname="srot.patridosberu.cz"
ifconfig_rl0="inet 10.0.0.1 netmask 255.255.255.0" 

V případě, že nehovíte příkazovému řádku, použijte příkaz /stand/sysinstall, a ten vám nabídne dialogové okno, které jste mohli vidět při instalaci systému.

Důležité kroky po instalaci

Je možné, že pár dní po instalaci vašeho systému byla objevena bezpečnostní chyba v jeho části. Předtím je nutno zjistit vaši verzi FreeBSD pomocí  uname:

srot# uname -r
4.9-RELEASE 

Další vaše kroky by měly směřovat na stránku Release information a odkaz Errata pro vaši verzi. Na této stránce je důležité si pečlivě přečíst Security Advisories. Nutno ještě zmínit větu na začátku errata pro verzi 4.9: „This errata document for FreeBSD 4.9-RELEASE will be maintained until the release of FreeBSD 4.10-RELEASE.“ Tzn. jestliže jste instalovali jakoukoli starší verzi než poslední release, měli byste projít errata pro vaši verzi i všechny vyšší! Článek vysvětlující, jak se označují verze ve FreeBSD, najdete zde. Stránka, která vám trochu ulehčí orientaci, je Security. Z errata pro svou verzi 4.9 vím o chybách FreeBSD-SA-03:19,

FreeBSD-SA-04:02, FreeBSD-SA-04:04 a FreeBSD-SA-04:05. Ze Security zjistím, že se k mé verzi vztahují i další chyby: FreeBSD-SA-04:07.cvs, FreeBSD-SA-04:08.heimdal, FreeBSD-SA-04:09.kadmind, FreeBSD-SA-04:10.cvs, FreeBSD-SA-04:11.msync,

FreeBSD-SA-04:12.jailroute, FreeBSD-SA-04:13.linux.

Možnosti, jak opravit tyto chyby, jsou dvě. Buď aplikovat příslušný patch podle návodu, nebo upgradovat na vyšší verzi, která již tyto chyby nemá. Když se podíváme na FreeBSD-SA-04:13.linux:

Corrected: 2004-06-30 17:31:44 UTC (RELENG_4)
2004-06-30 17:34:38 UTC (RELENG_5_2, 5.2.1-RELEASE-p9)
2004-06-30 17:33:59 UTC (RELENG_4_10, 4.10-RELEASE-p2)
2004-06-30 17:33:24 UTC (RELENG_4_9, 4.9-RELEASE-p11)
2004-06-30 17:32:24 UTC (RELENG_4_8, 4.8-RELEASE-p24) 

Zjistíme, že bychom měli mít tedy poslední verzi 4.9 větve, což je 4.9-RELEASE-p11. Ono to -p11 rovněž značí počet záplat v dané release. Když spočítáme námi zjištěné chyby, dojdeme rovněž k č. 11.

Upgrade

Upgrade lze provést dvěma způsoby. První způsob využívá instalačního média novější release verze, tedy např. upgrade z nového CD 4.10 přes nainstalovanou verzi 4.7. Při tomto postupu lze upgradovat POUZE na vyšší podverzi-release. Druhým způsobem je stažení zdrojových kódů příslušné verze, jejich zkompilování a nainstalování. Provedeme tedy upgrade druhým způsobem na poslední release „stabilní větve“, teda na 4.10, resp. automaticky na poslední verzi s opravami bezpečnostních chyb. Druhý způsob nám rovněž dovoluje určitou optimalizaci, např. kompilaci pro procesor i686.

Stažení zdrojových kódů

Samotné stažení zdrojových kódů provedeme programem cvsup. Ten není součástí systému, ale můžeme jej nainstalovat jako binární balíček. (Dále provedeme znovunačtení souborů ve spustitelných cestách – PATH.)

srot# pkg_add -r cvsup-without-gui
srot# rehash 

Samotné zdrojové kódy se nacházejí v /usr/src. Jestliže je adresář prázdný, zdrojáky nemáte. Nejjednodušší cestou je stáhnout veškeré zdrojáky pomocí cvsup, to může ale být i 300 MB. Program cvsup tedy distribuuje a updatuje kolekci zdrojových kódů. Informace udávající, co má být updatováno, se defaultně nachází v /usr/sup v tzv. checkouts files. Dle záznamů v checkouts files cvsup maže/aktualizuje místní kolekci oproti CVSup serveru.

Jestliže jste si tedy někdy dříve nainstalovali zdrojáky z CD, pak nemáte patřičné checkouts files. Díky tomu pak je možné, že cvsup nesmaže nějaký důležitý soubor. Jestliže jsou zdrojáky relativně čerstvé, můžete spustit cvsup, a ten pomocí checksums zjistí, jakou verzi kolekce souborů máte. Více na toto téma zde.

V případě našeho článku jsme instalovali minimální distribuci – bez zdrojových kódů. Pustíme se tedy do konfigurace cvsup. Program cvsup čte návod, jak pracovat, z konfiguračního souboru, tzv. supfile. Příkladové supfiles se nacházejí v /usr/share/examples/cvsup. V našem případě nás bude zajímat soubor  standart-supfile:

srot# cp /usr/share/examples/cvsup/standard-supfile /root/ 

Soubor zeditujeme tak, aby řádky začínající * obsahovaly následující:

*default host=cvsup.cz.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_4_10
*default delete use-rel-suffix
*default compress
src-all 

Tento supfile je pln vyčerpávajících komentářů, přesto letmo popíši. První řádek je jasný, jedná se o místní mirror cvsup serveru. Druhý řádek ( *default base) definuje základnu-rodičovský adresář pro sup složku obsahující vlastní informace cvsup (např. chechouts files) – díky tomuto řádku tedy v /usr/sup. Řádek s

*default prefix zadává základnu pro adresář s kolekcemi zdrojáků. V případě zdrojáků systému, které se ukládají do adresáře src, tedy /usr/src. Na dalším řádku nás zajímá položka tag=RELENG_4_10. Ta určuje, která verze se bude pomocí cvsup udržovat – bude to tedy vždy nejaktuálnější z 4.10. Poslední řádek definuje, jaké části zdrojáků budou zahrnuty – src-all  – je zástupce pro všechny části, dále v

supfile můžete vidět právě zakomentované jednotlivé části src, což vlastně budou podadresáře v /usr/src. Podrobný lidsky čitelný popis cvsup najdete v Handbooku.

Stažení kolekce tedy provedeme příkazem:

srot# cvsup standard-supfile 

Po činnosti, jejíž dobu jste odvodili z rychlosti vašeho internetového připojení, zjistíte, že se vám /usr/src pěkně zaplnil. Nyní je čas na přečtení souboru /usr/src/UPDATING, zda se teoreticky od vaší starší verze něco zásadně nezměnilo, co by vám vývojáři rádi sdělili, nebo jaké chyby byly v této verzi opraveny.

Optimalizace

Předtím, než se pustíme do samotného znovusestavení systému, zeditujeme soubor make.conf, který má mimo jiné na starosti optimalizaci kompilace systému.

srot# cp /etc/defaults/make.conf /etc 

Soubor obsahuje opět tunu komentářů, nás však momentálně nejvíce zajímají tyto položky (pro detailnější popis  man make.conf):

CPUTYPE=i686
CFLAGS= -O -pipe
COPTFLAGS= -O -pipe
INSTALL=install -C
NO_X= true # do not compile in XWindows support (e.g. doscmd)
MAKE_IDEA= YES # IDEA (128 bit symmetric encryption)
USA_RESIDENT= NO 

Zkompilování a instalace nové verze

srot# cd /usr/src
srot# make buildworld 

Po tomto příkazu se vytvoří nový adresář /usr/obj, který bude obsahovat všechny dočasné soubory – dočasnou strukturu nového systému, začne kompilovat vlastní kompilátor, knihovny a následně vlastní systém. Proces musí skončit bez chyb. Jestliže se během sestavování vyskytly chyby, před znovusestavením proveďte tyto kroky:

srot# chflags -R noschg /usr/obj/usr
srot# rm -rf /usr/obj/usr
srot# cd /usr/src
srot# make cleandir
srot# make cleandir 

Mně se např. jednou ukončilo sestavování s chybami kvůli make -j4 buildworld, kdy to můj obstarožní šrot nezvládl.

Dalším krokem je jádro. Nechápu tu hysterii ohledně sestavování jádra (hlavně u Linuxu). Postup je to jasný a přímočarý. Na FreeBSD se nic neodentrovává, ale editují se konfigurační soubory. Ty se nacházejí v /usr/src/sys/i386/conf. Jedná se o soubory GENERIC a LINT. Soubor GENERIC je defaultní konfigurací soubor pro sestavení jádra, LINT obsahuje všechny možné položky, které mohou být do vašeho konfiguračního souboru přidány. Soubor GENERIC needitujte přímo, ale zkopírujte jej – většinou podle názvu stroje.

srot# cd /usr/src/sys/i386/conf
srot# cp GENERIC SROT 

Před samotnou editací je dobré znát něco o svém hw. Můžete si projít pomocí dmesg záznam, který vypisuje jádro při bootování a který se nachází ve /var/run/dmesg.boot. Určitě je lepší, aby konfigurační soubor byl obecnější, než abyste něco zapomněli. Vždy se můžete vrátit a patřičné volby do jádra doplnit, resp. některé věci odebrat. Protože je soubor dlouhý, představím pouze položky, které jsem na svém systému upravil a přidal:

----upraveno---------
machine i386
cpu I686_CPU
ident SROT 
----pridano----
options NETSMB #SMB/CIFS requester
options NETSMBCRYPTO #encrypted password support for SMB
options LIBMCHAIN #mbuf management library
options LIBICONV
options IPFILTER #ipfilter support
options IPFILTER_LOG #ipfilter logging
options IPSTEALTH #support for stealth forwarding
options TCPDEBUG
options QUOTA #enable disk quotas
pseudo-device vn #Vnode driver (turns a file into a device)
pseudo-device snp #Snoop device - to look at pty/vty/etc..
pseudo-device ccd 4 #Concatenated disk driver
options VGA_WIDTH90 # support 90 column modes
options VESA
options SC_DISABLE_DDBKEY # disable `debug' key
options SC_DISABLE_REBOOT # disable reboot key sequence
options SC_PIXEL_MODE # add support for the raster text mode 

V knize BSD Hacks je jednoduchý tip, jak si uložit provedené změny v konfiguračním souboru kernelu. Nejdříve smažete patřičné řádky a provedete:

srot# echo "Toto jsem smazal" > changes.txt & diff GENERIC    SROT >> changes.txt 

Pak z LINT  přidáte vaše dodatečné volby a provedete:

srot# echo "A toto jsem tam pridal z LINTu"    >> changes.txt & diff GENERIC SROT >> changes.txt 

Nic světoborného, ale může se hodit. Nyní se pustíme do kompilace našeho nového kernelu.

srot# cd /usr/src && make buildkernel KERNCONF=SROT 

Jestliže všechno dobře dopadne, pokračujeme instalací nového jádra. Pokud jste předtím dávali na jádro nějaké příznaky souborů, např. schg, udělejte chflags noschg /kernel, popř. běží-li securelevel >=1, budete se muset přepnout do single-user-mode.

srot# cd /usr/src && make installkernel KERNCONF=SROT 

Nyní je čas, aby vaše nové jádro podstoupilo skutečnou zkoušku. Restartujeme systém a pak vyzkoušíme, zda vše pod novým jádrem funguje…

Pomocí příkazu shutdown now se přepneme do jednouživatelského režimu a dokončíme instalaci nově zkompilovaného systému z /usr/obj.

# cd /usr/src && make installworld 

Konfigurační soubory

Po celé této úmorné práci nás čeká ještě jeden zásadní krok. Je možné, že se rovněž s novou verzi změnil i obsah některých konfiguračních souborů, mohl být přidán řádek s novou volbou. Nyní je čas na paranoidní zálohu /etc, tedy:

srot# cp -Rp /etc /etc.old 

FreeBSD pro tento update konfiguračních souborů přichází s nástrojem mergemaster. Ten vezme novou verzi /etc z /usr/src/etc  a zkopíruje ji do /var/tmp. Totéž následuje, jestliže se změnily devices – obsah adresáře

/dev. Poté mergemaster porovná tento nový /etc s aktuálním v systému a začne svou práci. Jestliže se některý soubor změnil, mergemaster vám na obrazovku vytiskne „jejich průnik“ s patřičnými komentáři. V případě, že do nové verze aktuálního souboru byla přidána nějaká řádka, bude začínat + (plus). Jestli byla odebrána, tak - (mínus). Svůj výstup

mergemaster ukončí nabídkou k akci: d  – smaže dočasný, i  – instaluje dočasný, m  – spojuje dohromady. V případě, že jste schopni si konfigurační soubory opět upravit, zvolte ‚ i‘. Pokud znáte

diff můžete zvolit i ‚ m‘, v případě chyby však budete ještě rádi hledat svoji zálohu /etc.

Dále, jestliže by se změnily nějaké devices, změnil by se i skript /dev/MAKEDEV, který slouží k jejich správnému vytvoření. Pokud mergemaster oznámí změnu, spusťte jej.

ict ve školství 24

Toť vše. Nyní reboot a můžete se poté pomocí uname -v nabažit vaší nové verze.

Závěr

V příštím dílu si řekneme o instalaci binárních balíčků a kompilaci software ze zdrojových kódů. Rovněž se objeví tipy na pár security konferencí, abyste byli up-to-date.