A biztonsági javítások telepítése minden számítógépes szoftver, különösen az operációs rendszerek számára lényeges mozzanat. Nagyon hosszú ideig ez a FreeBSD esetében nem volt könnyen megoldható: a javításokat közvetlenül a forráskódon kellett elvégezni, ezekből újrafordítani a rendszert, majd telepíteni.
Ez a nehézség mostanra viszont már
elhárult, mivel a FreeBSD legfrissebb verziói már
tartalmaznak egy freebsd-update
nevű
segédprogramot, amellyel mindez leegyszerűsödik.
Ez a program két külön funkciót lát
el. Először is, lehetővé teszi, hogy a FreeBSD
alaprendszer újrafordítása és
-telepítése nélkül javítsunk
biztonsági és egyéb apró
hibákat, valamint másodsorban támogatja a
kisebb és nagyobb verziójú kiadások
közti váltást.
Ezek a bináris frissítések azonban csak
a FreeBSD biztonsági csapata által is felügyelt
architektúrák és kiadások
esetén érhetőek el. Emellett bizonyos
lehetőségek használatához,
például a FreeBSD verziói közti
átállás támogatásához
a freebsd-update(8) legújabb változata
szükségeltetik. Ezért ne felejtsük el
alaposan átolvasni a legújabb
kiadásokról szóló
bejelentéseket mielőtt frissítenénk
rájuk, mivel ezzel kapcsolatban fontos
információkat tartalmazhatnak. Az említett
bejelentések a http://www.FreeBSD.org/releases/
címen
érhetőek el.
Ha a crontab
már hivatkozik a
freebsd-update
programra, akkor a most
következő művelet elkezdése előtt
tiltsuk le.
Ha változtatnénk szeretnénk a
frissítési folyamaton, ekkor a programhoz
tartozó, /etc/freebsd-update.conf
nevű konfigurációs állományt
kell módosítanunk. Az opciók
részletes ismertetéssel rendelkeznek, habár
némelyiknél még további
magyarázat kellhet:
# Az alaprendszerben frissíteni kívánt komponensek Components src world kernel
Ezzel a paraméterrel határozhatjuk meg, hogy a
FreeBSD mely részei kerüljenek frissítésre.
Alapértelmezés szerint a program frissíti a
forrásokat, a teljes alaprendszert és a
rendszermagot. Komponensként a
telepítésnél választható
elemeket adhatjuk meg, például "world/games"
hozzáadásakor a games kategória elemei is
folyamatosan frissülni fognak. Az "src/bin"
megadásakor pedig az src/bin
könyvtár
tartalma frissül.
Ezt a beállítást a legjobb meghagyni az alapértelmezett értéken, mivel a további elemek megadásánál egyenként fel kell sorolni a frissítendő komponenseket. Ha itt viszont kifelejtünk valamit, akkor könnyen megeshet, hogy a források és a binárisok verziója elcsúszik egymástól.
# Az IgnorePaths beállítás után megadott szövegre illeszkedő összes # bejegyzés frissítése kimarad IgnorePaths
Ennél a beállításnál
azokat a könyvtárakat kell megadnunk, amelyeket
(és tartalmukat) ki szeretnénk hagyni a
frissítés során. Ezek lehetnek
például a /bin
vagy az /sbin
. Így meg tudjuk
akadályozni, hogy freebsd-update
esetleg felülírjon valamilyen helyi
változtatást a rendszerünkben.
# Az UpdateIfUnmodified beállítás után megadott elérési útvonalakon csak # a felhasználó által még nem módosított állományok fognak frissülni # (hacsak a módosításokat össze nem fésüljük, lásd lentebb) UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
A megadott könyvtárakban csak azokat a
konfigurációs állományokat fogja
frissíteni, amelyeket nem változtattuk meg.
Amennyiben bármelyikük eltér az eredetileg
frissítendő változattól, azt a program
nem módosítja. Létezik egy másik
hasonló beállítás, a
KeepModifiedMetadata
, amely
hatására a freebsd-update
az
összefésülés során elmenti a
változtatásokat.
# A MergeChanges beállításnál szereplő állományok helyi módosításait # automatikusan összefésüljük a FreeBSD újabb verziójára frissítése közben MergeChanges /etc/ /var/named/etc/
Itt azokat a könyvtárakat adhatjuk meg,
amelyekben a freebsd-update
számára engedélyezzük a
konfigurációs állományok új
verziójának
összefésülését a jelenlegi
állapottal. Az összefésülés
lényegében a mergemaster(8)
használatánál már megszokott
módon, diff(1) formátumban érkező
módosítások sorozata alapján
történik. Ekkor egy szövegszerkesztő
segítségével felügyelhetjük az
összefésülés menetét vagy
megállíthatjuk a freebsd-update
futását. Ha kétségeink
adódnak, akkor egyszerűen mentsük le az
/etc
könyvtárat és fogadjuk el mindegyik
összefésülés eredményét.
A mergemaster
működéséről a 24.7.11.1. szakasz - A mergemaster
ad részletesebb
tájékoztatást.
# A FreeBSD frissítésekor ezt a könyvtárat fogja a program használni a # letöltött módosítások és az egyéb ideiglenes állományok tárolására # WorkDir /var/db/freebsd-update
Az itt megadott könyvtárba fognak kerülni az elvégzendő módosítások és az egyéb ideiglenesen keletkező állományok. A verziók közti váltás során ebben a könyvtárban ajánlott legalább 1 GB szabad tárterületnek lennie.
# A kiadások közti váltás során a Components beállításnál megadott # elemek kerüljenek csak frissítésre (StrictComponents yes), vagy a # program próbálja meg magától kitalálni, hogy milyen komponesek # *lehetnek* fenn a rendszeren és azokat frissítse (StrictComponents # no)? # StrictComponents no
Ha ennél a beállításnál a
yes
értéket adjuk meg, akkor a
freebsd-update
feltételezni fogja,
hogy a Components
opciónál
felsoroltunk minden frissítendő komponenst és
nem próbál meg mást is
megváltoztatni. Ilyenkor tehát a
freebsd-update
tulajdonképpen
egyedül csak a Components
által
meghatározott elemekhez tartozó
állományokat fogja frissíteni.
A biztonsági javítások mindig egy távoli gépen tárolódnak, a következő parancsok használatával tölthetőek le és telepíthetőek:
#
freebsd-update fetch
#
freebsd-update install
Amennyiben a rendszermagot is érintik
javítások, úgy a rendszert a művelet
befejeződésével újra kell
indítanunk. Ha minden a megfelelő módon
történt, akkor a rendszerünk már
tartalmazni fogja a korábban letöltött
és telepített javításokat, és
a freebsd-update
akár
beállítható egy naponta
végrehajtandó cron(8) feladatnak. Ehhez
mindössze a következő bejegyzést kell
elhelyeznünk az /etc/crontab
állományban:
@daily root freebsd-update cron
A bejegyzés szerint naponta egyszer le fog futni a
freebsd-update
. Ilyenkor, vagyis a
cron
paraméter megadásakor a
freebsd-update
csak ellenőrzi, hogy
vannak-e telepítendő frissítések. Ha
talál, akkor automatikusan letölti ezeket a lemezre,
de nem telepíti. Helyette levélben
értesíti a root
felhasználót, aki ezután bármikor
manuálisan kérheti a
telepítést.
Probléma esetén az alábbi paranccsal
megkérhetjük a freebsd-update
programot a legutóbb telepített
módosítások
visszavonására:
#
freebsd-update rollback
Ha ez a visszavonás a rendszermagra vagy annak moduljaira is vonatkozott, akkor a rendszert újra kell indítanunk a parancs futásának befejeződésével. A FreeBSD csak ilyenkor képes betölteni az új binárisokat betölteni a memóriába.
A freebsd-update
önmagától csak a GENERIC
típusú rendszermagokat képes
frissíteni. Ha saját rendszermagot
használunk, akkor azt a rendszer többi
komponensének frissítését
követően újra kell fordítanunk és
telepítenünk. A freebsd-update
azonban még akkor is érzekelni és
frissíteni fogja a GENERIC
rendszermagot (amennyiben az létezik), ha az éppen
nem az aktuális(an futó) rendszermag.
Mindig érdemes tartani egy másolatot a
GENERIC
rendszermagról a /boot/GENERIC
könyvtárban. Rengeteg
különböző probléma
felderítésében tud segíteni,
illetve ez a 24.2.3. szakasz - Váltás kisebb és nagyobb
verziók között szakaszban
leírt freebsd-update
programmal
végzett frissítéseknél is hasznos
lehet.
Hacsak nem változtatjuk meg az
/etc/freebsd-update.conf
állományt, a freebsd-update
a
rendszermag forrásait is frissíti a többivel
együtt. A saját rendszermag
újrafordítása és
telepítése ezután a már a megszokott
módon elvégezhető.
A freebsd-update
által
terjesztett frissítések nem mindig érintik
a rendszermagot. Ha a rendszermag forrásai nem
változnak egy freebsd-update
install
parancs kiadása során, akkor
nem kötelező újrafordítani a
saját rendszermagot. A
freebsd-update
viszont mindig
módosítani fogja a
/usr/src/sys/conf/newvers.sh
állományt. Itt az aktuális
hibajavítás sorszáma szerepel (amelyet a
-p
(mint "patch
level" előtaggal kapcsolnak a rendszer
verziójához, és a uname
-r
paranccsal lehet lekérdezni). Ennek
megfelelően tehát a saját rendszermag
újrafordítása után, még ha
semmi más nem is változott, a uname(1)
képes pontosan jelezni a rendszerhez
készült hibajavítás
sorszámát. Ez különösen fontos
több rendszer karbantartása során, mivel
így könnyen és gyorsan
tájékozódhatunk azok
naprakészségéről.
Verziók közti váltás során a külső alkalmazások műkődését akadályozó régi tárgykódok és függvénykönyvtárak törlődni fognak. Ezért javasoljuk, hogy vagy töröljük le az összes portot és telepítsük újra, vagy az alaprendszer frissítése után hozzuk ezeket is naprakész állapotba a ports-mgmt/portupgrade segédprogram segítségével. Először minden bizonnyal szeretnék kipróbálni a frissítést, ezt a következő paranccsal tehetjük meg:
#
portupgrade -af
Ezzel gondoskodunk róla, hogy a minden a
megfelelően telepítődjön újra. Ha a
BATCH
környezeti változót a
yes
értékre
állítjuk, akkor a folyamat során
megjelenő összes kérdésre automatikusan
a yes
választ adjuk, ezáltal
önállósítani tudjuk.
Ha saját rendszermagot használunk, akkor
ennél valamivel azért több feladatunk van.
Szükségünk lesz a GENERIC
rendszermagot egy példányára, amelyet
másoljunk a /boot/GENERIC
könyvtárba. Amennyiben nincs
GENERIC
típusú rendszermag a
rendszerünkön, a következő módok
valamelyikén keresztül tudunk szerezni:
Ha a saját rendszermagot még csak egyszer
fordítottuk, akkor a /boot/kernel.old
könyvtárban még
megtalálható a GENERIC
.
Ezt nevezzük át egyszerűen /boot/GENERIC
könyvtárra.
Ha fizikailag hozzá tudunk férni az
érintett géphez, akkor a
GENERIC
egy
példányát akár CD-ről is
átmásolhatjuk. Helyezzük be a
telepítőlemezt és adjuk ki a
következő parancsokat:
#
mount /cdrom
#
cd /cdrom/X.Y-RELEASE/kernels
#
./install.sh GENERIC
Itt a X.Y-RELEASE
könyvtár nevében
értelemszerűen helyettesítsük be az
általunk használt változatot. A
GENERIC
rendszermag ekkor
alapértelmezés szerint a /boot/GENERIC
könyvtárba kerül.
Ha az előbbiek közül egyik sem
lehetséges, akkor a GENERIC
rendszermagot közvetlenül akár
forrásból is lefordíthatjuk és
telepíthetjük:
#
cd /usr/src
#
env DESTDIR=/boot/GENERIC make kernel
#
mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
#
rm -rf /boot/GENERIC/boot
A freebsd-update
akkor fogja ezt
GENERIC
rendszermagként
felismerni, ha a hozzá tartozó
konfigurációs állományt nem
módosítjuk. Továbbá javasoljuk,
hogy semmilyen speciális
beállítást ne alkalmazzunk a
fordítás során (érdemes
üresen hagyni ehhez az
/etc/make.conf
állományt).
Nem kötelező újraindítani a
rendszert a GENERIC
rendszermaggal.
A freebsd-update
képes
frissíteni rendszerünket egy adott kiadásra.
Például a következő paraméterek
megadásával válthatunk a FreeBSD 6.4
használatára:
#
freebsd-update -r 6.4-RELEASE upgrade
A parancs elindulása után nem sokkal, a
váltáshoz szükséges
információk
összegyűjtéséhez a
freebsd-update
elemzi a
konfigurációs állományában
megadott beállításokat és a rendszer
jelenleg használt verzióját. A
képernyőn ekkor sorban megjelennek a program
részéről érzékelt és nem
érzékelt komponensek. Mint például
ahogy itt látható:
Looking up update.FreeBSD.org mirrors... 1 mirrors found. Fetching metadata signature for 6.3-RELEASE from update1.FreeBSD.org... done. Fetching metadata index... done. Inspecting system... done. The following components of FreeBSD seem to be installed: kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin world/base world/info world/lib32 world/manpages The following components of FreeBSD do not seem to be installed: kernel/generic world/catpages world/dict world/doc world/games world/proflibs Does this look reasonable (y/n)? y
Ekkor a freebsd-update
megpróbálja letölteni a verziók
közti váltáshoz szükséges
összes állományt. Bizonyos esetekben
kérdésekkel fordul a felhasználó
felé arra vonatkozóan, hogy miket
telepítsen fel vagy mit csináljon.
A saját rendszermag használatakor az iménti lépés valamilyen ehhez hasonló figyelmeztetést fog adni:
WARNING: This system is running a "SAJÁT RENDSZERMAG
" kernel, which is not a
kernel configuration distributed as part of FreeBSD 6.3-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"
Ez a figyelmeztetés most nyugodtan figyelmen
kívül hagyható. A folyamat során a
frissített GENERIC
rendszermagot
fogjuk használni.
A javítások letöltését
követően megkezdődik a
telepítésük. A váltás ezen
lépése az adott gép aktuális
terhelésétől és
sebességétől függően
változó hosszúságú lehet.
Ezután a konfigurációs
állományok összefésülése
zajlik le - itt általában a emberi
felügyeletre is szükség van az
állományok
összefésülésének
irányításához, amelynek folyamatosan
láthatóak az eredményei. A
meghiúsult vagy kihagyott
összefésülések a teljes
frissítési folyamat leállását
vonják maguk után. Az /etc
könyvtárban
tárolt fontosabb állományokról, mint
például a master.passwd
vagy
group
javasolt előzetesen
biztonsági mentést készíteni
és később kézzel hozzájuk adni
a változtatásaikat.
A rendszerben ekkor még nem lesz jelen semmilyen konkrét változás, az összes említett javítás és összefésülés egy külön könyvtárban történik. A telepített javításokat és az összefésült konfigurációs állományokat a folyamat végén magának a felhasználónak kell véglegesíteni.
A frissítési eljárás végén a következő parancs kiadásával tudjuk ténylegesen érvényesíteni az eddig elvégzett módosításokat:
#
freebsd-update install
Először mindig a rendszermag és a
hozzá tartozó modulok cserélődnek le.
Ahogy ez végrehajtódott, újra kell
indítanunk a rendszert. Ha saját rendszermagot
használunk, akkor a nextboot(8) parancs
segítségével állítsuk be a
következő rendszerindítás során
betöltendő rendszermagot a /boot/GENERIC
könyvtárban levőre (ezt
frissítettük):
#
nextboot -k GENERIC
Mielőtt újraindítanánk a
gépünket a GENERIC
rendszermaggal, győződjünk meg róla,
hogy szerepel benne minden olyan meghajtó, amely
elengedhetetlen a rendszer hiánytalan
indításához (és képes lesz
újra csatlakozni a hálózathoz, ha
éppen távolról adminisztráljuk).
Ez különösen olyan esetben fontos, amikor a
saját rendszermagunkban beépítetten
szerepeltek bizonyos modulok. Ilyenkor a
GENERIC
rendszermag használatakor
ezeket a /boot/loader.conf
állományon keresztül töltethetjük
be ideiglenesen. A frissítés
befejezéséig érdemes viszont minden nem
létfontosságú szolgáltatást
leállítani, leválasztani lemezeket
és hálózati megosztásokat
stb.
A rendszerünk most már újraindítható a frissített rendszermaggal:
#
shutdown -r now
A rendszer sikeres újraindulása után
ismét el kell indítanunk a
freebsd-update
programot, amely
korábban már elmentette a frissítés
állapotát, emiatt a legutóbbi
pontról fog folytatódni, illetve törli az
osztott könyvtárak és
tárgykódok régebbi változatait.
Innen az alábbi paranccsal léphetünk
tovább:
#
freebsd-update install
A függvénykönyvtárak verziói közti eltérések mértékétől függően elképzelhető, hogy a telepítés az említett három fázis helyett kettőben történik.
Most pedig újra kell fordítanunk vagy telepítenünk az összes általunk korábban használt külső alkalmazást. Erre azért van szükségünk, mert bizonyos alkalmazások a verziók közti váltás során törölt programkönyvtáraktól függtek. Ennek automatizálásában a ports-mgmt/portupgrade lesz segítségünkre. Az alkalmazások frissítésének elindításához a következő parancsokat használjuk:
#
portupgrade -f ruby
#
rm /var/db/pkg/pkgdb.db
#
portupgrade -f ruby18-bdb
#
rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db
#
portupgrade -af
A parancsok lefutását követően a
freebsd-update
utolsó
hívásával zárjuk le a
frissítést. Ezzel a paranccsal tudunk
tehát pontot tenni a frissítési
procedúra végére:
#
freebsd-update install
Ha a GENERIC
rendszermagot csak
átmenetileg használtuk, akkor most már a
megszokott módon fordíthatunk és
telepíthetünk magunk egy saját
rendszermagot.
Indítsuk újra a rendszert a FreeBSD frissített változatával. A folyamat ezzel véget ért.
A freebsd-update
ragyogóan
felhasználható a FreeBSD egy telepített
változatának és egy általunk
garantáltan megbízható
példányának
összevetésére. Ilyenkor a rendszerhez
tartozó segédprogramokat,
programkönyvtárakat és
konfigurációs állományokat
ellenőriztethetjük le. Az
összehasonlítást ezzel a paranccsal
kezdhetjük meg:
#
freebsd-update IDS >> eredmeny.idk
Habár a parancs neve IDS
(intrusion detection system), nem helyettesít semmilyen
olyan behatolásjelző megoldást, mint
amilyen például a security/snort. Mivel a
freebsd-update
adatokat tárol a
lemezen, teljesen kézenfekvő a
hamisítás lehetősége. Míg
ennek eshetősége adott mértékben
visszaszorítható a
kern.securelevel
csökkentésével és a
freebsd-update
által használt
adatok írásvédett
állományrendszerre helyezésével,
erre a problémára az ideális
megoldást mégis egy teljes biztonságban
tudható referencia rendszer jelentheti. Ennek
tárolására alkalmas lehet
például egy DVD vagy egy
külső USB-egység.
A parancs kiadása után megkezdődik a
rendszer vizsgálata, és az ellenőrzés
során folyamatosan jelennek meg az
átvizsgált állományok a
hozzájuk tartozó ismert és
kiszámított sha256(1)-kódjukkal
együtt. Mivel a képernyőn
túlságosan gyorsan elúsznának az
eredmények, ezért ezeket egy
eredmeny.idk
nevű
állományba mentjük a későbbi
elemzésekhez.
Az így keletkező állomány sorai ugyan meglehetősen hosszúak, de szerencsére viszonylag könnyen értelmezhetőek. Például az adott kiadásban szereplő állományoktól eltérőeket ezzel a paranccsal kérdezhetjük le:
#
cat eredmeny.idk | awk '{ print $1 }' | more
/etc/master.passwd /etc/motd /etc/passwd /etc/pf.conf
A példában most csak az első
néhány állományt hagytuk meg, gyakran
tapasztalhatunk viszont ennél többet. Ezek
közül bizonyos állományok
értelemszerűen eltérnek, mint itt
például az /etc/passwd
, mert
időközben új felhasználókat
adtunk a rendszerhez. Máskor egyéb
állományok, például modulok nevei is
felbukkanhatnak, mert tegyük fel, hogy a
freebsd-update
már frissítette
ezeket. Ha ki szeretnénk zárni valamilyen
állományokat vagy könyvtárakat az
ellenőrzésből, egyszerűen csak soroljuk
fel ezeket az /etc/freebsd-update.conf
állományban megjelenő
IDSIgnorePaths
beállításnál.
A korábban tárgyaltaktól függetlenül ez a rendszer alkalmas bonyolultabb frissítési folyamatok kisegítésére is.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.