Hlavní navigace

Začínáme bezpečně s FreeBSD

15. 6. 2004
Doba čtení: 10 minut

Sdílet

Patrně jste někde narazili na informaci, že FreeBSD je skvělý síťový operační systém. Na druhou stranu jste asi patrně slyšeli i narážky určitých lidí, že je to "fakt hardcore" nebo že se BSD špatně spravuje. Ani omylem! FreeBSD je skutečně user-friendly a my si v našem seriálu ukážeme, jak jej spravovat s ohledem na bezpečnost. Seriál je vhodný pro začátečníky i pokročilé. Požadována je jen znalost základních unixových příkazů.

Co je FreeBSD?

(Pozn. red.: zde měl být pohoršlivý obrázek, ale zcenzurovala jsem ho :) –Johanka)

Jestliže to ještě nevíte, tak FreeBSD je výkonný unixový operační systém pro hw architektury i86, AMD64, Alpha, IA-64, PC-98 a UltraSPARC. Vzniknul z BSD, verze UNIXU vyvinuté na Kalifornské Univerzitě v Berkeley. Narozdíl od svého unix-like bratrance GNU/Linuxu není unixových klonem, ale opensource derivátem UNIXu od AT&T (dědečka UNIXu System V).

FreeBSD, ale i další opensource BSD systémy – NetBSD, OpenBSD, nově i DragonFly BSD, stejně jako GNU/Linux, se skvěle hodí jako síťový server. FreeBSD již v minimální instalaci jde nastavit tak, aby nabízel očekávané síťové funkce, výkon a bezpečnost.

Dále již v základní instalaci nabízí několik pokročilých bezpečnostních technik:

  • bezpečnostní úrovně (securelevels), stav nastavení jádra, které mění chování systému. Například při vyšších úrovních nelze upravovat systémový čas o více než 1 sekundu najednou, měnit pravidla firewallu nebo příznaky souborů (speciální práva, například označit soubor jako nesmazatelný). Tím, že některé operace nejsou povoleny, můžeme zvýšit bezpečnost systému a důležitých systémových souborů
  • jail, značně vylepšený starý unixový koncept chrootu – posunutého kořenového adresáře. S jailem můžete na systému postavit „uvězněný“ minisystém kompletně oddělující požadované funkce od hlavního hostitelského systému; v jailu můžete například vystavět webový server a přidělit k němu superuživatelská práva, aniž byste se museli bát o svůj hlavní systém.

Cíl našeho seriálu

Jak již bylo řečeno, FreeBSD je již v minimální instalaci kompletní síťový operační systém, který může ihned zajišťovat doručování mailů, spravovat domény, poskytovat FTP přístup či sdílet data v síti resp. LAN pomocí NFS.

V této chvíli ale pro náš účel minimálního síťového serveru nabízí až příliš mnoho funkcí a příliš dobrotivé nastavení, proto se zaměříme na základní post-instalační zabezpečovací úpravy.

Naším cílem je maximálně zabezpečit server tak, aby plnil funkci paketového filtru, měl možnost vzdáleného přihlášení pomocí SSH a emaily pouze odesílal.

V úvodních dílech se zaměříme zejména na základní lokální zabezpečení, tzn. na konfigurační soubory, možnosti ochrany před útočníkem, který má fyzický přístup ke stroji, a další „vychytávky“, kterými můžeme opevnit svůj server. V dalších dílech by měla být probrána témata sledování bezpečnostních chyb systému, upgradu, konfigurace jádra, firewallu, PAM atd. Rád bych také popsal nastavení jailu, scponly (speciálního shellu spolupracujího s SSH, který dovoluje pouze použití bezpečného kopírování/ftp), systémů detekce průniku a nastínil použití kompletně šifrovaného systému.

Bezpečnost operačního systému, který je připojen k síti, je složité téma. Stojíte sami proti různým druhům útočníků. Rozhodně se vyplatí být obezřetný. Vždy buďte podezíraví k příkazům, postupům nebo přímo k programům, u kterých si nejste jisti zdrojem nebo funkcí. Předtím, než napíšete neznámý příkaz, zkuste minimálně whatis příkaz, popř. man příkaz. Útočníci mohou modifikovat důležité soubory, proto je opatrnost na místě. K takové opatrnosti a k aktivnímu postupu vůči takovým útočníkům vám pomůže náš článek. Mezi další typy může být vedení deníku, kam si budete zapisovat důležité změny konfigurace nebo informaci o instalaci software.

Poznámka

Náš seriál zabývající se základním zabezpečením FreeBSD ovšem nebude pojednávat o základních příkazech UNIXu obecně. Proto předpokládáme základní znalost unixových příkazů a uživatelskou znalost defaultního editoru FreeBSD, vi. Jestliže potřebujete unixové příkazy „oprášit“, pak vám pomohou následující linky: UNIX-ové repetitorium nebo FreeBSD Handbook – UNIX Basics. Mezi skvělé návody o Vi, resp. Vim, patří stránka Pavla Satrapy zde.

Rovněž předpokládám, že jste si zajistili instalační médium (momentální poslední stabilní verze je 4.9 a obrazy můžete najít na ftp.freebsd.cz) a jste schopni úspěšně projít instalací. Bližší info o instalaci naleznete ve FreeBSD Handbooku.

Tipy pro instalaci systému

Nebudeme se zabývat instalací, podstatné najdete v Handbooku. Ale zde je několik tipů:

  • samostatné partition pro /, swap, /tmp, /var, /usr, /usr/home a /jail. Část disku můžeme nechat volné pro pozdější využití.
  • v nabídce Distributions zvolte položku Minimal, poté v Custom přidejte manuálové stránky. Zdrojové kódy jádra, systému a porty stáhneme aktualizované z Internetu později.
  • zákaz funkcí jako FTP, NFS server/klient atd.

security profile - extreme

  • Security Profile – Extreme. Security profile je několik voleb, které řídí např. běh síťových démonů při startu, a tyto volby jsou zapsány do  /etc/rc.conf
  • během instalace běžného uživatele nevytvoříme

Prvotní prohlídka systému

Přihlaste se jako root. První, co byste měli udělat, je se trošku porozhlédnout po adresářové struktuře FreeBSD a prohlédnout si, kde leží základní konfigurační soubory. K tomu můžete použít například manuálovou stránku:

srot# man hier 

Jestliže máte nějakou zkušenost s jinými unixy/unix-like systémy, tak si uděláte rychlo jasno. Ve FreeBSD jsou systémové konfigurační soubory v /etc  a vše ostatní, tj. software třetích stran, se nachází v /usr/local, tj. i podadresář etc.

Mezi hlavní konfigurační soubory FreeBSD patří /etc/rc.conf resp /etc/defaults/rc.conf. Obsah souboru /etc/rc.conf je nadřazený souboru /etc/defaults/rc.conf. Potřebné změny tedy provádějte do /etc/rc.conf, NIKDY DO  /etc/defaults/rc.conf!

Ještě než začneme s pozměňováním konfiguračních souborů, rychle si řekneme něco o RCS, systému pro kontrolu revizí. RCS nám umožní sledovat starší verze vybraných souborů, což nám v případě chyby dovolí jednoduše se vrátit zpět k předešlé bezchybné verzi souboru. S RCS si zkutečně ulehčíte život a také „čistotu“ adresářů, jestliže jste dříve používali metodu např. zálohování souboru s koncovkou -backup  :)

Nejdříve vytvoříme v /etc  adresář RCS, který bude schraňovat naše starší verze souborů.

srot# mkdir /etc/RCS 

Nyní přidáme aktuální /etc/rc.conf do RCS správy:

srot# ci /etc/rc.conf
RCS/rc.conf,v <-- rc.conf
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> defaultni /etc/rc.conf
>> .
initial revision: 1.1
done 

>> označuje pole pro komentář, tečka na samostatném řádku ukončí komentář. Jestliže nyní prohlédnete adresář /etc, zjistíte, že soubor rc.conf zmizel. Ano, byl přemístěn do RCS. Proto jej obnovíme:

srot# co /etc/rc.conf
RCS/rc.conf,v --> rc.conf
revision 1.1
done 

Nyní je sice soubor /etc/rc.conf na svém místě, ale má práva POUZE pro čtení. Abychom jej mohli změnit, je třeba jej „vytáhnout“ ze správy RCS, tím bude povolen pro úpravy, což má za následek i změnu přístupových práv.

srot# co -l /etc/rc.conf
RCS/rc.conf,v --> rc.conf
revision 1.1 (locked)
done 

V našem prvním dílu se ale nebudeme zabývat nastavováním síťových démonů. Přesto však uděláme některé úpravy. Nejprve, jak může vypadat /etc/rc.conf po instalaci při použití Security profile Extreme:

# -- sysinstall generated deltas -- # Mon May 31 23:28:28 2004
# Created: Mon May 31 23:28:28 2004
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf.
defaultrouter="10.0.0.138"
font8x14="iso02-8x14"
font8x16="iso02-8x16"
font8x8="iso02-8x8"
hostname="myhost"
ifconfig_lnc0="inet 10.0.0.20 netmask 255.255.255.0"
kern_securelevel="2"
kern_securelevel_enable="YES"
nfs_server_enable="NO"
saver="daemon"
sendmail_enable="NO"
sshd_enable="NO" 

Projdeme v /etc/defaults/rc.conf  potřebné položky a /etc/rc.conf nastavíme tak, aby obsahoval:

syslogd_enable="YES" # Run syslog daemon (or NO).
syslogd_flags="-ss" # Syslogd flags to not bind an inet socket
clear_tmp_enable="YES" # Clear /tmp at startup.
kern_securelevel="-1" # range: -1..3 ; `-1' is the most insecure 

Resume. První tři volby jsou jasné. Volba kern_securelevel je bezpečnostní úroveň jádra a umožňuje/zakazuje určité operace při běhu určitého securelevelu. Poněvadž jsme při instalaci zvolili bezpečnostní profil Extreme a ten nám automaticky nastavil securelevel na -2, změnili jsme jej, abychom později mohli nastavovat příznaky souborů. O těch za chvíli.

Mezi další možné položky rc.conf patří process accounting, který nám dovolí sledovat přesně, jaké příkazy uživatelé píší atd., a rovněž je vhodné povolit myš v konzoli pro kopírování/vklá­dání textů.

accounting_enable="YES"
moused_enable="YES"

Překontrolujte si obsah souboru, pokud jste nenastavili při instalaci síť či vlastnosti konzole, máte nyní vhodnou příležitost.

Ultraparanoici mohou zakomentovat několik echo -n v souboru /etc/rc.network, čímž způsobí, že při startu nebude FreeBSD vypisovat, kteří síťoví démoni startují. Není to sice přímo zabezpečení, ale jestliže nechcete, aby to bylo vidět, tak taková možnost tu je :) Více  man rc.

Zabezpečení konzole

Další velký bezpečnostní problém představuje soubor /etc/ttys. Riziko roste při startu/rebootu a přepnutí do jednouživatelského režimu. Jednouživatelský režim je minimální stav systému, kdy můžete získat příkazový řádek. Protože se jedná o minimální režim, tj. nespustí síťové démony ani bezpečnostní prvky, je tento režim vhodný k řešení problémů a systémovým opravám a upgradu. Zároveň však dovoluje možnost změny hesla superuživatele. Proto je vhodné toto ošetřit změnami v /etc/ttys, změníme secure na insecure v řádku:

console none unknown off insecure

Tato ochrana však padá s kvalitou hesla superuživatele. Stále je však možnost při startu v příkazovém řádku zavaděče načíst jiné než defaultní, /kernel, jádro. FreeBSD boot manager nemá možnost tomu zabránit heslem, pokud byste to však rádi ošetřili, podívejte se později do  /usr/ports/sysutils/grub.

Další změny ze secure na insecure v souboru /etc/ttys způsobí, že se nebudete k fyzické konzoli moci přihlásit přímo jako superuživatel; budete se muset přihlásit jako běžný uživatel, a pak získat práva administrátora, jestliže jste k tomu oprávněn. Doufám, že jste si dobře zapamatovali heslo superuživatele :)

Mějte ještě na paměti zabezpečení BIOSu, ochrana heslem atd. Více o fyzickém zabezpečení v Security-Howto. Nicméně stále je tato ochrana neúčinná, pokud má útočník fyzický přístup ke stroji a může vyjmout váš disk. Pak už nezbývá nic jiného než zvážit nasazení kompletně šifrovaného systému. Zásadní problém ale bude, že budete muset při restartu celého systému být fyzicky přítomni a nabootovat pomocí tajného klíče umístěného na vašem mini-cd nebo usb-klíčence (jestliže to váš hw umožňuje).

Hesla a třídy uživatelů

Ať už jste zvolili hesla slabá, nebo dobrá, použijeme Blowfish algoritmus na šifrování hesel, který nabízí nejvyšší ochranu při největší rychlosti a také možnost sdílení hesel s OpenBSD. Další editací souboru /etc/login.conf přidáme nastavení minimální délky hesla na 10 znaků včetně velkých a malých písmen, omezíme jeho platnost na 90 dnů a nastavíme umask, defaultní nastavení přístupových práv pro nové soubory. Tyto změny provedeme ve třídě default. Pro bližší nápovědu můžeme použít man login.conf.

:passwd_format=blf:\
:passwordtime=90d:\
:mixpasswordcase=true:\
:minpasswordlen=10:\
:umask=077:\

Konfigurací login.conf můžeme také trochu omezit naše uživatele. Vytvoříme novou třídu, do které zahrneme určité uživatele, a určíme jim např. maximální množství procesorového času, který může zabrat proces, maximální množství procesů, maximální množství otevřených souborů jedním procesem atd. Tato nastavení jsou hodně variabilní. Abychom nemuseli celou třídy opisovat, použijeme zástupnou definici tc=třída, případné změny v nové třídě budou nadřazeny nastavením definovaným v třídě pomocí  tc.

users|Obycejni uzivatele:\
:reguirehome@:\
:welcome=/usr/local/etc/motd-users:\
:openfiles=512:\
:maxproc-cur=30:\
:maxproc-max=60:\
:ignoretime@:\
:tc=default:

Vytvořili jsme třídu users v této třídě jsme nastavili maximální počet otevřených souborů jedním procesem (openfiles), maximální množství procesů, které může mít uživatel v jednu chvíli spuštěné (maxproc-cur, maxproc-max), a změnili umask (defaultní přístupová práva nově vzniklých souborů) na 077. O přístupových právech budeme podrobněji mluvit později.

Poznámka: Protože se budou naši uživatelé k našemu stroji připojovat pomocí SSH, je nutné pro to, aby nastavení tříd v login.conf fungovalo, změnit položku v konfiguračním souboru OpenSSH /etc/ssh/sshd_config na UseLogin yes. Defaultně totiž sshd nespolupracuje s programem login, tudíž nelze nastavení souboru login.conf využít.

Uložíme požadované změny a znovu sestavíme login databázi příkazem:

srot# cap_mkdb /etc/login.conf 

Po takovém přenastavení je potřeba znovu nastavit uživatelská hesla, aby bylá zašifrována pomocí Blowfish:

srot# passwd root 

Zkontrolovat provedenou změnu můžete nahlédnutím do souboru /etc/master.passwd, kde by mělo heslo v případě Blowfish začínat $2, dále vidíte šestém poli (pole jsou oddělena : [dvojtečkou]) unixový čas do vypršení hesla, tj. 1093819151.

Cloud 24 - tip 1

srot# grep root /etc/master.passwd
root:$2a$04$fESJZVTE6qXzDx45yYP1AuQmQRPw6kW6jCNVR4OIwbMUcgS Ia6AGm:0:0::1093819151:0:Charlie    &:/root:/bin/csh 

Aby se použil Blowfish defaultně k zašifrování hesel, je třeba ještě pozměnit soubor /etc/auth.conf tak, aby obsahoval následující řádku:

crypt_default = blf

Závěr

V tomto prvním dílu našeho seriálu o FreeBSD jsme prošli úplnými základy. V příštím dílu se podíváme na přidávání, odebírání a modifikování uživatelských účtů. Rovněž si řekneme něco o jejich blokování. Jestliže jste čekali něco více o samotném FreeBSD, vězte, že to přijde s dalšími díly. Protože se jedná o seriál, víceméně pro začínající/po­kročilé uživatele, musíme projít základními nastaveními.

Byl pro vás článek přínosný?