/dev/hda8
:
dd if=/dev/hda8 of=/etc/dosswap
gzip -9 /etc/dosswap
/etc/rc
naslednje: XXXXX
je
število blokov v navidezni particiji
Preverite, ali ste v datotekomkswap /dev/hda8 XXXXX swapon -av
/etc/fstab
dodali vnos
za izmenjalno particijo.
/etc/brc
ali
/sbin/brc
, v datoteko /etc/brc
dodajte naslednje (drugače to opravite
ročno, ko želite računalnik zagnati v DOS|OS/2 in poskušate
izmenjalno particijo pretvoriti nazaj v različico za Dos/Windows):
# Ne pozabite, da se tako zapiše nazaj na particijo samo prvih sto blokov. Empirično sem ugotovil, da to zadošča.swapoff -av zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100
Prednost: prihranite precejšno količino prostora na disku. Pomanjkljivost: Če 5. korak ni avtomatiziran, boste morali to postoriti ročno. To bo upočasnilo vnovični zagon za nanosekundo :-)
Tu je zvijača, ki sem jo moral uporabiti že večkrat.
Obnovitev zbrisane tekstovne datoteke obupanega uporabnika.
Če po nesreči odstranite tekstovno datoteko, npr. neko elektronsko sporočilo ali rezultate nočne programerske seanse, ni nujno, da je vse izgubljeno. Če je datoteka bila na disku in na njem ostala več kot 30 sekund, je njena vsebina morda še vedno na particiji diska.
Vsebino datoteke na particiji diska lahko poiščete z ukazom
grep
.
Na primer, pred kratkim sem zbrisal del elektronskega sporočila. Takoj sem prekinil vse operacije, ki bi particijo lahko spremenile: v tem primeru sem se samo izognil shranjevanju datotek, prevajanju itd. V drugih primerih sem moral sistem celo privesti na način enega samega uporabnika in odklopiti datotečni sistem.
Na particiji diska sem potem uporabil ukaz egrep
: v mojem primeru je
bilo elektronsko sporočilo v imeniku /usr/local/hime/michael
. Iz
izhoda ukaza df
sem lahko ugotovil, da je ta na particiji
/dev/hdb5
:
Kadar delam s particijami diska, sem zelo previden. Torej sem si privoščil kratek premor in pred potrditvijo preveril, ali res razumem pomen ukaza. V tem primeru je bila v elektronskem sporočilu beseda 'sputnik3:~ % df Filesystem 1024-blocks Used Available Capacity Mounted on /dev/hda3 18621 9759 7901 55% / /dev/hdb3 308852 258443 34458 88% /usr /dev/hdb5 466896 407062 35720 92% /usr/local sputnik3:~ % su Password: [root@sputnik3 michael]# egrep -50 'ftp.+COL' /dev/hdb5 > /tmp/x
ftp
', ki ji je
sledilo besedilo in na koncu še beseda 'COL
'. Sporočilo je bilo dolgo
okrog 20 vrstic, torej sem uporabil 50, da bi dobil vse vrstice okrog
izraza. Včasih sem uporabljal tudi 3000 in s tem zagotovil, da sem
dobil nazaj vse vrstice izvirne kode. Rezultat sem iz ukaza egrep
usmeril na drugo particijo diska in s tem preprečil, da bi se
sporočilo, ki ga iščem, prepisalo.
Izhod sem preiskal z uporabo ukaza strings
:
in seveda našel elektronsko sporočilo.strings /tmp/x | less
Ta metoda ni zanesljiva. Morda je bilo nekaj prostora ali pa ves prostor na disku znova uporabljen.
Ta zvijača je verjetno uporabna samo v sistemih z enim uporabnikom. V sistemih z več uporabniki z visoko dejavnostjo diskov se je morda prostor na disku, ki ste ga sprostili, znova porabil. Prav tako večina izmed nas ne more kar tako preprečiti uporabe računalnika drugim uporabnikom, kadar želimo obnoviti neko datoteko.
V domačem sistemu me je ta zvijača v zadnjih nekaj letih rešila približno trikrat, po navadi takrat, ko sem pomotoma zavrgel rezultate celodnevnega dela: če moje delo preživi do točke, ko me prevzame občutek, da sem dosegel pomemben napredek, to delo shranim na disketo in te zvijače sploh ne uporabljam pogosto.
Uporabite oznako za nespremenljivost.
Takoj po tem, ko boste namestili in nastavili svoj sistem, preglejte
datoteke /bin/sbin
, /usr/bin
, /usr/sbin
,
/usr/lib
(in še nekatere
druge običajne osumljence) in brez predsodkov uporabite ukaz
chattr +i
. To vrstico dodajte tudi v datoteke jedra v korenskem
imeniku.
Naredite nov imenik 'mkdir /etc/.dist/
' in prekopirajte vsebino
imenika /etc
(to naredim v dveh korakih z uporabo
/tmp/etcdist.tar
in
se s tem izognem podvajanju) v ta novi imenik. (Lahko bi tudi
ustvarili imenik /etc/.dist.tar.gz
-- in ga označili kot
nespremenljivega).
Vzrok za vse to delo je zmanjšanje škode, ki bi jo lahko naredili,
kadar boste prijavljeni kot korenski uporabnik. Tako ne boste mogli
prepisati datotek z napačnim preusmeritvenim operatorjem in s
presledkom v ukazu 'rm -fr
' (še vedno lahko naredite veliko
škodo, ampak vsaj vaše knjižnice in binarne datoteke bodo bolj
zaščitene).
S tem boste tudi onemogočili ali vsaj otežili uporabo številnih varnostnih in preklicnih storitev (ker večina temelji na prepisovanju datotek med izvajanjem programa SUID, ki ne ponuja poljubnih ukazov lupine).
Edina neprijetnost bo nastala pri gradnji in izvajanju ukaza "make
install
" na različnih vrstah sistemskih binarnih datotek. Po
drugi strani pa boste s tem preprečili, da bi 'make install
'
prepisal datoteke. Kadar pozabite prebrati Makefile
in
chattr -i
, datoteke, ki bodo prepisane (in imenike, katerim
želite datoteke dodati) -- in se ukaz make
ne izvede, samo
uporabite ukaz chattr
in ga znova zaženite. Izkoristite lahko
tudi priložnost in prestavite stare binarne datoteke, knjižnice ali
karkoli je že v imeniku .old/
, jih preimenujete, stisnete ali
počnete z njimi, kar pač želite.
Vse nove stvari se začnejo pod /usr/local
! Ali v
/usr/local/'hostname'
.
Če je vaša distribucija ena tistih, ki pusti imenik /usr/local
prazen,
tvorite svoje imenike /usr/local/src
, /usr/local/bin
,
itd. in jih
uporabljajte. Če vaša distribucija v drevesno strukturo
imenika /usr/local
shrani stvari, boste verjetno uporabili ukaz 'mkdir
/usr/local/'hostname'
' in mu podelili 'wheel' group +w
(prav tako jih
naredim SUID in SGID in s tem zagotovim, da lahko vsak član skupine
wheel upravlja samo svoje datoteke in vse ustvarjene datoteke
pripadajo skupini wheel).
Disciplinirajte se in nove pakete vedno!, vedno!, vedno! shranite v
/usr/local/src/.from/$KJERKOLI_SEM_JIH_DOBIL/
(za .tar
oz. katerekoli
datoteke) in jih zgradite v imeniku /usr/local/src
(ali
/$HOSTNAME/src
). Preverite, ali se namesti pod lokalno
ureditev.
Če je paket nujno treba namestiti v /bin
, /usr/bin
ali kjerkoli
drugje, podajte symlink od lokalne ureditve do vsakega posameznega
elementa.
Vzrok za to -- čeprav je več dela -- je pomoč pri osamitvi tistih
stvari, za katere je treba narediti varnostne kopije, jih obnoviti
ali znova namestiti pri opravilu popolne vnovične namestitve z
distribucijskega nosilca (navadno s plošče CD). Z uporabo imenika
/usr/local/.from
vzdržujete tudi dnevnik z informacijami, kje ste
dobili izvirno kodo -- kar vam je v pomoč pri iskanju novih različic
-- je pa nujno potreben, kadar nadzorujete sezname objav o
varnosti.
Eden mojih domačih sistemov (s katerega kličem) je bil sestavljen, preden sem začel uporabljati tak sistem. Še vedno ne poznam vsega, po čemer se razlikuje od sistema, pripravljenega po namestitvi. To se mi dogaja, kljub temu da zelo malo delam s konfiguracijo domačega sistema in sem edini, ki ga uporablja.
V primerjavi s tem so vsi sistemi, ki sem jih nastavil v službi (ko so mi zaupali vlogo sistemskega upravitelja), nastavljeni tako -- in čeprav so jih upravljali različni ljudje in so bili velikokrat nadgrajeni, dobro vem, kateri elementi so bili dodani naknadno, po začetni namestitvi in nastavitvi.
V razdelku 2c nasvetov 12. izdaje sem opazil kar nekaj prezahtevnih ali nepotrebnih postopkov. Ker jih je več, vam jih pošiljam:
Uh, to je pa dolg skript. Za izvajanje tega opravila jaz ne bi pisal skripta. Namesto tega bi v ukazni vrstici uporabil ukaz:#!/bin/sh # lowerit # spremeni vse velike črke v imenih datotek v trenutnem imeniku v male črke # uporabna samo za navadne datoteke -- ne spreminja imen imenikov # preden prepiše datoteko, boste morali to potrditi for x in `ls` do if [ ! -f $x ]; then continue fi lc=`echo $x | tr '[A-Z]' '[a-z]'` if [ $lc != $x ]; then mv -i $x $lc fi done
Avtor pravi, da je skript zapisal v tej obliki zaradi večje razumljivosti (glej spodaj).for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done;
V naslednjem zgledu, o dodajanju in odstranjevanju uporabnikov, Geoff dela dokaj dobro, razen v zadnjem koraku. Vnovični zagon? Resno upam, da avtor računalnika ne zaganja znova vedno, kadar odstrani uporabnika. Opraviti morate samo prva dva koraka. Kakšne procese pa naj bi uporabnik sploh uporablja? Morda irc bot? Postopek ubijete z enostavnim ukazom
Zgled; uporabniško ime je fookill -9 `ps -aux |grep ^<username> |tr -s " " |cut -d " " -f2`
S tem je delo opravljeno; gremo naprej k pozabljenemu korenskemu geslu.kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2`
Rešitev, ki je navedena v glasilu, je najbolj univerzalna, ne pa tudi najenostavnejša. Z LILO in loadlin lahko vsak poda zagonski parameter "single" in računalnik se neposredno zažene v privzeti lupini brez poziva za prijavo in geslo. V tem primeru lahko pred vnosom "init 3" za zagon večuporabniškega načina vsakdo spremeni ali zbriše katerokoli geslo. Število vnovičnih zagonov v tem primeru: 1, število vnovičnih zagonov v drugih primerih: 2
Justin Dossey
Začeli bomo z neobdelano, čisto izvirno kodo. Najprej si priskrbite izvirno kodo Sendmaila. Zajel sem različico 8.9.0, kar pa je zelo zahtevno opravilo, kakor boste ugotovili. Kodo sem dobil na ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.9.0.tar.gz.
Dolga je okrog 1 MB in glede na to, da uporabljam 8.7.6, mislim, da je vredna truda. Če bo to delovalo, boste nedvomno izvedeli, drugače ne bom mogel izdati nove različice HOWTO :)
Ko ste kodo prenesli, jo razpakirajte. V trenutnem imeniku bom
ustvaril imenik z imenom sendmail-8.9.0
. Premaknite se v ta imenik ter
preberite datoteki README
in RELESE_NOTES
(presenečeni boste nad
opravljenimi nadgraditvami). Premaknite se zdaj v src
. V tem imeniku
boste opravili večino dela.
Kratko sporočilo: Sendmail je kratek, zelo uporaben, dobro napisan program. Binarna datoteka se v računalniku 5x86 133 z 32 MB RAM prevede v manj kot 5 minutah! Celotno prevajanje in namestitev (brez nastavitev) traja manj kot 15 minut!
Navadno v svojem sistemu ne zaganjam BIND, zato sem našel naslednje vrstice:
in spremenil 1 v 0:# ifndef NAMED_BIND # define NAMED_BIND 1 /* uporabi berkeleyjski internetni strežnik */ # endif
Pri distribuciji Debian 1.3.1 se# ifndef NAMED_BIND # define NAMED_BIND 0 /* uporabi berkeleyjski internetni strežnik */ # endif
db.h
glede na privzeto vrednost
namesti v /usr/include/db
, namesto v /usr/include
, kjer jo sendmail
poskuša najti. Pojdite v imenike src
, mailstats
,
makemap
, praliases
in smrsh
in tam izvedite
naslednji ukaz:
Ko boste s tem gotovi,./Build -I/usr/include/db
cd ..
in vnesite make install
.
Tako! Program
sendmail različice 8.9.0 naj bi bil zdaj nameščen! V tem primeru sem
predpostavil, da ste prej že opravili izvirno nastavitev. Da bi v
mojem sistemu vse potekalo gladko, saj gostim brezplačne poštne
sezname za tiste, ki uporabljajo majordomo
, sem moral na začetek
datoteke /etc/sendmail.cf
dodati:
Dandanes jeO DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe
sendmail
zelo občutljiv za dovoljenja imenikov in datotek ter
bo sporočal napake o imenikih in datotekah v privzetih imenih ali
datotekah .forward
, ki jih lahko spreminjajo skupine ali so prosto
dostopne. Ker ni dobro odpraviti te občutljivosti, uporabljam v
konzoli samo način enega uporabnika in se mi je zdelo, da je v redu tudi,
če je na voljo ta mala razpoka v sistemu varnosti. YMMV
Ustvarite in vzdržujte /README.'hostname'
in/ali
/etc/README.'hostname'
[ali, če je le mogoče,
/usr/local/etc/README.'hostname'
- Vzdrževalec.]
Od prvega dne upravljanja sistem zapisuje stvari v omrežni
dnevnik. Morda boste v rootov /bash_logout vnesli vrstico
"vi /README.$(ime gostitelja)
". To lahko opravite tudi tako, da
napišete skript za su
ali sudo
, ki počne nekaj podobnega:
(Dnevnik ustvarite z ukazomfunction exit \ { unset exit; exit; \ cat ~/tmp/session.$(date +%y%m%d) \ >> /README.$(hostname) && \ vi /README.$(hostname) } script -a ~/tmp/session.$(date +%y%m%d) /bin/su.org -
typescript
. Prav tako ustvarite
funkcijo, ki bo avtomatizirala, dopolnjevala in posodabljala dnevnik.)
Priznati moram, da te avtomatizacije nisem vgradil. Do zdaj sem se
zanašal na samodisciplino. Kakorkoli že, s to zamislijo sem se igral
(naredil sem celo prototip skripta in funkcije lupine, kot lahko
vidite.) Nekaj, kar me pri tem moti, je ukaz 'script
' sam. Mislim, da
bom moral zajeti izvire in dodati nekaj parametrov ukazne vrstice (za
prekinitev/zaustavitev shranjevanja skriptov iz ukazne vrstice), preden
bom začel uporabljati ta način.
Moj zadnji nasvet (v tem trenutku):
Korenska pot mora biti sestavljena iz 'PATH= /bin
'
To je to. Nič drugega v korenski poti. Za vse, kar počne korenski
uporabnik, poskrbi symlink iz /bin
, privzeto ime ali funkcija lupine,
oziroma je skript ali binarna različica v /bin
ali pa je izpisana z
eksplicitno potjo.
S tem se vsi, ki se prijavljajo kot korenski uporabnik, zavedajo
(včasih zelo boleče), kako zaupajo binarnim različicam. Pameten
sistemski upravitelj z več uporabniki bo redno pregledoval datoteke
/bin
in /.*history
, da bi našel vzorce in zančne napake.
Zares dobro motivirani sistemski upravitelji bodo poiskali
opravila, ki jih je mogoče avtomatizirati, mesta, na katerih je mogoče vnesti
logična preverjanja in opravila (zagon urejevalnikov, MTA in druge
obsežne interaktivne programe, z izpopolnjenimi lastnostmi skriptov, ki
jih je mogoče vnašati v prosojne ali podatkovne datoteke, kot je
neslavni vi ./.exrc
in emacs ./.emacs
in celo
bolj zahrbten $EXINIT
in
vgrajeni makri v glavi/nogi), ki jih je treba opravljati brez
korenskih privilegijev. Seveda je take vrste ukaze mogoče zaganjati
s:
(kjer so specifikacije odvisne od ukaza).cp $data $some_users_home/tmp su -c $origcommand $whatever_switches cp $some_users_home/tmp $data
Večina teh zadnjih varnostnih ukrepov prenese na domačo delovno postajo ali postajo z enim samim uporabnikom, so pa zelo dober način upravljanja večjega števila uporabnikov, še posebej javnosti izpostavljeni sistemi (kot tisti pri netcomu.)
xdm
(najverjetneje je to datoteka
/etc/rc/rc.6
ali /etc/rc.local
), tako da bo imela v razdelku
za zagon xdm
naslednje vrstice:
/usr/bin/X11/xdm exec /usr/bin/X11/X -indirect hostname
/usr/lib/X11/xdm/Xservers
in odstranite znak za
komentar v vrstici, ki zažene strežnik v krajevnem računalniku (npr.
z začetnim nizom 0:
)Opozorilo: s starimi distribucijami SLS (1.1.1) lahko po vrstici
za klic xdm
izpustite -nodaemon
: to NE deluje pri
poznejših izdajah.