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/aktualizovat 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.