Hlavní navigace

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

Jiří Bělka 31. 8. 2004

Minule jsme nakousli instalaci a odinstalaci software třetích stran na FreeBSD. Dnes se podíváme na pokročilou správu portů/packages - jejich upgrade a kontrolu jejich bezpečnosti.

Portaudit

Jak bylo zmíněno v minulém dílu, portaudit je nástroj, který spolupracuje s VuXML aplikací. VuXML zaznamenává bezpečnostní problémy software portovaného na FreeBSD a OpenBSD. V případě, že nemáte portaudit nainstalovaný, učiňte tak pomocí make install clean v /usr/ports/security/portaudit. Po instalaci je nutné stáhnout poslední verzi „databáze“ VuXML, aby portaudit měl aktuální informace o vulnerabilities pro práci s porty.

srot# portaudit -Fd 

Nyní otestujeme nainstalované programy portauditem. Příklad výstupu portauditu, když nalezne chybu:

srot# portaudit -a
Affected package: ruby-1.8.1.2004.05.02_1
Type of problem: ruby CGI::Session insecure file creation.
Reference: <http://www.FreeBSD.org/ports/portaudit/ a800386e-ef7e-11d8-81b0-000347a4fa7d.html>
1 problem(s) in your installed packages found.
You are advised to update or deinstall the affected package(s) immediately. 

Samozřejmě, že funkce portauditu se dají automatizovat. Po instalaci vám portaudit nainstaluje skript do /usr/local/etc/periodic/security. Pamatujete na 5. díl o automatické údržbě na FreeBSD? Díky tomuto skriptu vám periodic  – položka v /etc/cron  zahrne zmíněný skript do  security run output.

Část každodenního mailu security run output týkající se portauditu:

Checking for a current audit database:
Database created: Fri Aug 20 16:10:23 CEST 2004
...
Checking for packages with security vulnerabilities:
Affected package: ruby-1.8.1.2004.05.02_1
Type of problem: ruby CGI::Session insecure file creation.
Reference: <http://www.FreeBSD.org/ports/portaudit/ a800386e-ef7e-11d8-81b0-000347a4fa7d.html>
1 problem(s) in your installed packages found.
You are advised to update or deinstall the affected package(s) immediately.
... 

Jak vidíte, díky portaudit máte opět zjednodušenou správu systému. Stačí jen každé ráno si přečíst maily, které vám periodic zasílá po svých testech.

Rovněž při používání portů máte výhodu, že je funkčnost portaudit integrována přímo do procesu instalace portů. Při make install bude tedy místo dřívějšího oznámení ===> Vulnerability check disabled proces dále potichu pokračovat, nebo vás portaudit upozorní na možné bezpečnostní problémy.

V případě, že byste si chtěli vyzkoušet nanečisto portaudit, prohlédněte si port /usr/ports/security/vulnerability-test-port. Tento port neinstaluje žádné soubory, ale podle data instalace jej portaudit bere jako závadný, nebo v pořádku. Tzn. že je-li tento port den starý, portaudit jej bere jako závadný a uvidíte hlášení v  security run output. Rovněž můžete simulovat instalaci starého vulnerability-test-portu pomocí INSTALLATION_DATE při make install, více pkg-desc tohoto portu.

Kolekce programů portupgrade

Port portupgrade přichází s několika užitečnými nástroji pro správu programového vybavení na FreeBSD. Ty vám umožní pohodlný upgrade, pročistění pracovních adresářů portů atd. – celkově je práce mnohem pohodlnější než pomocí klasických postupů.

Aktualizovat software můžete samozřejmě ručně pomocí cvsup ports-supfile a následného pkg_delete balik && pkg_add -r balik resp. pkg_delete balik && make install v příslušném adresáři. (Záleží na tom, jestli používáte porty, nebo packages.) Tj. deinstalovat program a znovu nainstalovat. Jsou však situace, kdy to nemusí být tak jednoduché. Třeba při instalaci portu, využijeme např. port centericq ( make install), vám zůstal pracovní adresář work a něm soubory:

srot# ls -al /usr/ports/net/centericq/work/
total 19
drwxr-xr-x 3 root wheel 512 Aug 20 15:07 .
drwxr-xr-x 4 root wheel 512 Aug 22 22:08 ..
-rw-r--r-- 1 root wheel 1084 Aug 20 15:07 .PLIST.flattened
-rw-r--r-- 1 root wheel 2018 Aug 20 15:06 .PLIST.mktmp
-rw-r--r-- 1 root wheel 11724 Aug 20 15:07 .PLIST.objdump
-rw-r--r-- 1 root wheel 0 Aug 20 15:07 .PLIST.setuid
-rw-r--r-- 1 root wheel 0 Aug 20 15:07 .PLIST.writable
-rw-r--r-- 1 root wheel 0 Aug 20 15:06 .build_done.centericq-4.11.0._usr_local
-rw-r--r-- 1 root wheel 0 Aug 20 14:51 .configure_done.centericq-4.11.0._usr_local
-rw-r--r-- 1 root wheel 0 Aug 20 14:50 .extract_done.centericq-4.11.0._usr_local
-rw-r--r-- 1 root wheel 0 Aug 20 15:07 .install_done.centericq-4.11.0._usr_local
-rw-r--r-- 1 root wheel 0 Aug 20 15:07 .package_done.centericq-4.11.0._usr_local
-rw-r--r-- 1 root wheel 0 Aug 20 14:50 .patch_done.centericq-4.11.0._usr_local
drwxr-xr-x 17 root wheel 1024 Aug 20 14:50 centericq-4.11.0 

Z minulého dílu víme, že proces make install v sobě zahrnuje několik kroků. Jeden z nich – make extract– rozbalí zdrojové kódy do podadresáře work a každá část z procesu make install do tohoto podadresáře zaznamená svou činnost. Jsou to ty soubory s tečkou. (Ultra pozorný čtenář pravděpodobně podotkne, že pro sestavení tohoto portu nebylo použito make install, avšak pro momentální zjednodušení to budeme ignorovat.) V případě, že byste tedy chtěli po zaktualizování ports tree znovu nainstalovat odinstalovaný centericq pomocí make install, soubor .install_done.centericq... vám to znemožní. Řešením by tedy bylo smazání work adresáře a následné znovusestavení programu.

Portsclean

Jak bylo řečeno, work adresáře mohou znemožňovat novou instalaci portu. Jestliže jste tedy místo make install clean dali pouhé make install, budete mít pár pracovních adresářů na ports tree. Tyto adresáře rovněž často zabírají velké množství místa na disku.

srot# du /usr/ports | sort -rn | head
253657 /usr/ports
87885 /usr/ports/net
42550 /usr/ports/net/centericq
42499 /usr/ports/net/centericq/work
42482 /usr/ports/net/centericq/work/centericq-4.11.0
39443 /usr/ports/distfiles
37024 /usr/ports/net/silc-client
37003 /usr/ports/net/silc-client/work
36944 /usr/ports/net/silc-client/work/silc-client-1.0.1
21683 /usr/ports/net/centericq/work/centericq-4.11.0/libicq2000-0.1 

Oficiální postup pro vyčištění portů od work adresářů je make clean v /usr/ports. Tento postup je ale neuvěřitelně zdlouhavý, proto je lepší použít jeden z nástrojů portupgrade – portsclean. Příkaz portsclean umí vyčistit porty od work adresářů, smazat nepotřebné tgz soubory z /usr/ports/distfiles  nebo je smazat přímo všechny. My tedy vyčistíme porty a smažeme nepotřebné distfiles:

srot# portsclean -CD
Cleaning out /usr/ports/*/*/work...
Delete /usr/ports/net/centericq/work
Delete /usr/ports/net/silc-client/work
done.
Detecting unreferenced distfiles...
Delete /usr/ports/distfiles/libtool-1.5.6.tar.gz
Delete /usr/ports/distfiles/pkg_install-20040629.tar.gz
Delete /usr/ports/distfiles/ruby/ruby-1.8.1-2004.05.02.tar.bz2
Delete /usr/ports/distfiles/sudo-1.6.7p5.tar.gz 

Portsdb & portversion

Balík portupgrade přichází i s vlastním nástrojem na porovnávání verzí nainstalovaných programů. Rozdíl mezi klasickým pkg_version  a

portversion je hlavně v rychlosti. Oficiální pkg_version kontroluje verzi programu oproti Makefile v ports tree a dále případně proti INDEX souboru. Zato portversion kontroluje verze oproti vlastní databázové verzi INDEX souboru – INDEX.db, zpracování je rychlejší cca o 2/3. Abyste tedy mohli pracovat s programy portupgrade, které potřebují INDEX.db, je třeba jej nejdříve vytvořit. K tomu slouží portsdb. Příkaz portsdb

však s sebou přináší několik specifických problémů. Vlastně se jedná o problém se souborem INDEX. Během update ports tree pomocí cvsup nedochází k aktualizaci INDEX souboru (resp. je to možné, ale tento soubor je regenerován jednou za uherský rok). Proto oficiální doporučení k vytvoření tohoto souboru je make index v /usr/ports. Jestliže make clean je neuvěřitelně zdlouhavé, tak make index je téměř doživotní záležitost na pomalejších strojích. Proto to mnoho lidí řeší pomocí

make fetchindex. A zde je kámen úrazu – mezi aktuální podobou ports tree a podobou stáhnutého INDEX u může být dvouhodinový rozdíl. Tak či tak, většina lidí to ignoruje. Vytvoříme tedy z  INDEX souboru požadovaný INDEX.db:
srot# portsdb -u 

Poznámka: Pomocí portsdb -Uu můžete rovněž vytvořit INDEX soubor, ale jestliže máte nekompletní ports tree (např. jste použili refuse file), dostanete chybové hlášení.

Nyní, když máme databázi, podíváme se po zastaralých programech. Můžete využít jednoduchého portversion -l "<"  nebo:

srot# portversion -v | grep "<"
bash-3.0 < needs updating (port has 3.0_3)
john-1.6.37 < needs updating (port has 1.6.37_1)
libtool-1.5.6_1 < needs updating (port has 1.5.8)
pkg_install-devel-20040629 < needs updating (port has 20040811)
portaudit-0.5.1 < needs updating (port has 0.5.3)
ruby-1.8.1.2004.05.02_1 < needs updating (port has 1.8.2.p2_1)
sudo-1.6.7.5_2 < needs updating (port has 1.6.8) 

Portupgrade

Nebudeme upgradovat všechny programy, jen ten, na který nás upozornil portaudit. Samozřejmě jde udělat upgrade všech programů, od toho jsou tu volby -r ( --recursive  – na kterých je balík závislý) a -R ( --upward-recursive  – závislosti směrem nahoru, tj. balíky závislé na našem programu) a samozřejmě -a( --all).

srot# portupgrade -rR ruby 

Možná vás napadlo, zda portupgrade bere v potaz volby pro sestavení. Ano, např. v případě mysql141-server by to tedy mohlo být  portupgrade -rRm 'WITH_OPENSSL=yes' 'WITH_CHARSET=czech' mysql41-server.

Samozřejmě pokud nějaké programy aktualizujete častěji, bylo by vhodné mít místo, kam tyto volby zapsat nastálo. Konfigurační soubor je umístěn v /usr/local/etc/pkgtools.conf, zmíněnou volbu byste tedy mohli zadat takto:

MAKE_ARGS = {
'databases/mysql-*' => 'WITH_OPENSSL=yes' 'WITH_CHARSET=czech',
} 

Program portupgrade muze samozřejmě pracovat i s packages. Jen přidáte volbu -P a můžete lehce upgradovat i programy nainstalované jako binární balíky.

Příkaz portupgrade je velmi přímočarý, obsahuje ještě pár komfortních voleb, o kterých vám více napoví  man portupgrade.

Tipy pro práci s porty

Vytváření vlastních balíků

Občas je výhodné lokálně vytvářet vlastní balíky z portů a ty distribuovat mezi více stejnými systémy nebo jaily. To vám umožní lepší správu. Vytváření balíků jde různými způsoby, např.:

srot# portupgrade -rRp balik 

Tento příkaz provede upgrade a vytvoří příslušné balíky včetně závislostí. Příkazy portupgrade a portintall jsou totožné.

srot# cd /usr/ports/kategorie/balik && make package-recursive clean 

V případě, že již máte nějaký program nainstalovaný a chcete vytvořit balík, můžete použít tento příkaz:

srot# cd /var/db/pkg/antiword-0.35
srot# pkg_create -v -c +COMMENT -d +DESC -f +CONTENTS -m +MTREE_DIRS ~root/antiword-0.35.tgz
Creating package /root/antiword-0.35.tgz
Creating gzip'd tar ball in '/root/antiword-0.35.tgz' 

Jestliže vytváříte na nějakém stroji takových balíků více, určitě vás časem přestane bavit ruční přesouvání vytvořených balíků a adresářů portů na nějaké jiné místo, které budete např. sdílet přes NFS/FTP na místní síti, nebo pomocí mount_null do jailů. To můžete změnit volbou 'PACKAGES=/path/to/builtpackages' v /etc/make.conf.

Mezi další volby, které ovlivňují práci s balíky, patří položky MASTER_SITE v /etc/make.conf. Ty vám umožní nastavit bližší mirrory nejen FreeBSD, a urychlit tak dobu stahování.

Dalším užitečným programem portupgrade je pkg_deinstall. Klasický pkg_delete neumí odinstalovat program včetně jeho závislostí. Pomocí pkg_deinstall -rR balik tu možnost máte.

portindex

Jedním ze zajímavých nástrojů pro práci s porty je portindex. Tento balík nástrojů vám umožní rychle a přírůstkově vytvářet/aktu­alizovat INDEX z ports tree, vytvářet INDEX.db nebo při konfiguraci s podporou PKGHistory a dalšími vlastnostmi (které ale závisí na PostgreSQL) třídit nainstalované porty podle data instalace atd.

pkg_cutleaves

Jestliže máte nainstalovaný portupgrade, může se vám hodit i port pkg_cutleaves nacházející se v sysutils. Jedná se o perlový skript, který pomáhá odstranit ze systému odpadlé programy. Tj. programy, které zbyly po odinstalaci nějakého programu nebo nemají závislost na nějakém jiném. Příkaz je interaktivní a čeká na vaše rozhodnutí, zda hodláte program uchovat, odstranit…

srot# pkg_cutleaves
Package 1 of 20:
antiword-0.35 - "An application to display Microsoft(tm) Word files"
antiword-0.35 - [keep]/(d)elete/(f)lush marked pkgs/(a)bort? k
** Keeping antiword-0.35.
Package 2 of 20:
bash-3.0 - The GNU Project's Bourne Again SHell
bash-3.0 - [keep]/(d)elete/(f)lush marked pkgs/(a)bort? k
** Keeping bash-3.0.
...zkráceno... 

V případě, že by vás pkg_cutleaves pořád obtěžoval upozorněním na programy, která chcete uchovat, je možné názvy těchto programů dát do /usr/local/etc/pkg_leaves.exclude. Následně pak spustíte pkg_cutleaves tak, aby načetl tento exclude file:

srot# cat > /usr/local/etc/pkg_leaves.exclude
antiword
bash
srot# pkg_cutleaves -x
Package 1 of 18:
catdoc-0.93.3 - Convert MS Word/Excel documents to plain ASCII or TeX. TK viewer    included
catdoc-0.93.3 - [keep]/(d)elete/(f)lush marked pkgs/(a)bort?
...zkráceno... 

Vidíte, že pkg_cutleaves vynechal zmíněné programy a postoupil na další položky.

pkg_tree

Další, spíše neužitečnou utilitou pro práci s porty je pkg_tree. Umí to jen grafické stromové zobrazení nainstalovaných programů.

srot# pkg_tree -v irssi
irssi-0.8.9_2
|\__ pkgconfig-0.15.0_1
\__ glib-1.2.10_11
\__ pkgconfig-0.15.0_1 

Závěr

Tak a je to za námi. Práce s porty/packages není nic složitého, tedy pokud víte, co děláte :) Jen škoda, že FreeBSD projekt neadoptoval make show=FLAVORS z OpenBSD, který pěkně ukáže možnosti konfigurace portu, poněvadž v některých Makefiles je trochu zmatek. Jestli máte nějaké vlastní tipy, podělte se do diskuse.

Našli jste v článku chybu?

1. 9. 2004 10:57

jam (neregistrovaný)

nevite nekdo o moznosti zabalit vicero programu do jednoho baliku? napriklad vsechny dependence

1. 9. 2004 10:33

jam (neregistrovaný)

less /usr/ports/Mk/bsd.port.mk
/# Default targets and their behaviors:


Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami