/dev/hda8
:
dd if=/dev/hda8 of=/etc/dosswap
gzip -9 /etc/dosswap
/etc/rc
naslednje: XXXXX
je
število blokov v navidezni particiji
mkswap /dev/hda8 XXXXX
swapon -av
Prepričajte se, da ste v datoteko /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 DOSu|OS/2 in poskušate
izmenjalno particijo pretvoriti nazaj v različico za dos/windows):
swapoff -av
zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100
# Ne pozabite, da se na ta način zapiše nazaj na particijo samo prvih
100 blokov. Empirično sem ugotovil, da to zadošča.Prednost: prihranite precejšno količino prostora na disku. Pomanjkljivost: Če 5. korak ni avtomatiziran, boste morali to opraviti ročno, kar bo upočasnilo proces ponovnega zagona za nanosekundo :-)
Tu je trik, ki sem ga morali uporabiti že nekajkrat.
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 mogoče še vedno na particiji diska.
Vsebino datoteke na particiji diska lahko poiščete s pomočjo ukaza
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 sistem moral 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
:
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
Kadar delam s particijami diska, sem zelo previden. Torej sem si vzel
odmor in se pred potrditvijo prepričal, da res razumem pomen ukaza. V
tem primeru je elektronsko sporočilo vsebovalo besedo 'ftp
', ki ji je
sledil tekst 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 izvorne 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
:
strings /tmp/x | less
in seveda našel elektronsko sporočilo.
Ta metoda ni zanesljiva. Mogoče je bilo nekaj, ali pa celoten prostor na disku, ponovno uporabljeno.
Ta zvijača je verjetno uporabna samo na sistemih z enim uporabnikom. Na sistemih z več uporabniki z visoko dejavnostjo diskov se je mogoče prostor na disku, ki ste ga sprostili, ponovno porabil. Prav tako večina izmed nas ne more kar tako preprečiti uporabe računalnika ostalim uporabnikom, kadar želimo obnoviti neko datoteko.
Na domačem sistemu me je ta zvijača rešila v približno treh primerih v zadnjih nekaj letih po navadi takrat, ko sem po pomoti zavrgel rezultate celodnevnega dela: če moje delo preživi do neke točke, kjer imam občutek, da sem naredil pomemben napredek, to delo shranim na disketo in te zvijače sploh ne uporabljam pogosto.
Uporaba nespremenljivih oznak
Takoj po tem, ko boste namestili in nastavili vaš 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šati škodo, ki bi jo lahko naredili,
kadar boste prijavljeni kot korenski uporabnik. Na ta način ne boste
mogli prepisati datotek z napačnim preusmeritvenim operatorjem in
presledkom v ukazu 'rm -fr
' (še vedno lahko naredite veliko škodo
sistema ne boste mogli poškodovati z nepravilno postavljenim
vašim podatkom ampak vsaj vaše knjižnice in binarne datoteke bodo bolj
zaščitene).
S tem boste prav tako 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 nudi poljubnih ukazov lupine*).
Edina neprijetnost se bo pojavila pri grajenju 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 ponovno
zaženite. Izkoristite lahko tudi priložnost in prestavite stare
binarne datoteke, knjižnice oz. kar koli 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. V primeru da 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 s svojimi datotekami in da vse ustvarjene datoteke
pripadajo wheel skupini).
Disciplinirajte se in nove pakete *Vedno! Vedno! Vedno!* shranite v
/usr/local/src/.from/$KJERKOLI_SEM_JIH_DOBIL/
(za .tar
oz. katere koli
datoteke) in jih zgradite v imeniku /usr/local/src
(ali
/$HOSTNAME/src
). Prepričajte se, da se namesti pod lokalno
ureditev.
Če je paket *nujno potrebno* namestiti v /bin
, /usr/bin
ali kjer koli
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 potrebno narediti varnostne kopije, jih obnoviti
ali ponovno namestiti pri opravilu popolne ponovne namestitve z
distribucijskega medija (običajno s CD-ja). Z uporabo imenika
/usr/local/.from
vzdržujete tudi dnevnik z informacijami, kje ste
izvorno kodo dobili -- kar vam je v pomoč pri iskanju novih različic
-- je pa nujno potreben, kadar nadzorujete sezname objav glede
varnosti.
Eden mojih domačih sistemov (s katerega kličem) je bil sestavljen preden sem začel uporabljati takšen sistem. Še vedno ne *poznam* vsega, po čemer se razlikuje od po namestitvi pripravljenega sistema. To se mi dogaja kljub temu, da zelo malo delam s konfiguracijo domačega sistema in da sem *edina* oseba, ki ga uporablja.
V primerjavi s tem so vsi sistemi, ki sem jih nastavil v službi (ko so mi zaupali vlogo sistemskega administratorja), nastavljeni na ta način -- in čeprav so jih upravljali različni ljudje in so bili velikokrat nadgrajeni, pa vendar 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:
#!/bin/sh
# lowerit
# spremeni vse velike črke v imenih datotek v trenutnem imeniku v majhne črke
# uporabna samo za navadne datoteke--ne spreminja imen imenikov
# preden prepiše obstoječo 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
Uh, to je pa dolga skripta. Za izvajanje tega opravila jaz ne bi pisal
skripte. Namesto tega bi v ukazni vrstici uporabil ukaz:
for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done;
Avtor pravi, da je skripto zapisal v tej obliki zaradi večje
razumljivosti (glej spodaj).
V naslednjem primeru, o dodajanju in odstranjevanju uporabnikov, Geoff dela dokaj dobro, razen v zadnjem koraku. Ponoven zagon? Resno upam, da avtor računalnika ne zaganja ponovno, vedno kadar odstrani uporabnika. Opraviti morate samo prva dva koraka. Kakšne procese pa naj bi uporabnik sploh uporabljal? Mogoče irc bot? Postopek ubijete z enostavnim ukazom
kill -9 `ps -aux |grep ^<username> |tr -s " " |cut -d " " -f2`
Primer; uporabniško ime je foo
kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2`
S tem je delo opravljeno; gremo naprej na pozabljeno korensko geslo.
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 katero koli geslo. Število ponovnih zagonov v tem primeru: 1, število ponovnih zagonov v drugih primerih: 2
Justin Dossey
Začeli bomo z neobdelano, čisto izvorno kodo. Najprej si priskrbite izvorno kodo Sendmaila. Zajel sem verzijo 8.9.0, kar pa je zelo zahtevno opravilo, kot 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, saj sicer ne bom mogel izdati nove HOWTO verzije :)
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 sedaj v src
. V tem imeniku
boste opravili večino dela.
Kratko sporočilo: Sendmail je kratek, zelo uporaben, dobro napisan program. Binarna datoteka se na računalniku 5x86 133 z 32 MB RAM-a prevede v manj kot 5 minutah! Celotno prevajanje in namestitev (brez nastavitev) traja manj kot 15 minut!
Običajno na mojem sistemu ne zaganjam BIND, zaradi tega sem našel naslednje vrstice:
# ifndef NAMED_BIND
# define NAMED_BIND 1 /* uporabi Berkeleyski internetni strežnik */
# endif
in spremenil 1 v 0:
# ifndef NAMED_BIND
# define NAMED_BIND 0 /* uporabi Berkeleyski internetni strežnik */
# endif
Pri distribuciji Debian 1.3.1 se 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:
./Build -I/usr/include/db
Ko boste s tem gotovi, cd ..
in vnesite make install
.
Tako! Program
sendmail različice 8.9.0 naj bi bil sedaj nameščen! V tem primeru sem
predpostavil, da ste prej že opravili originalno nastavitev. Da bi na
mojem sistemu vse potekalo gladko, ker gostim brezplačne poštne
sezname za ljudi, ki uporabljajo majordomo
, sem moral na začetek
datoteke /etc/sendmail.cf
dodati:
O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe
Dandanes je sendmail
zelo občutljiv na dovoljenja imenikov in datotek ter
bo javljal 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 obstaja ta majhna varnostna luknja. YMMV
Ustvarite in vzdržujte /README.'hostname'
in/ali
/etc/README.'hostname'
[oz. če je le možno
/usr/local/etc/README.'hostname'
- Vzdrževalec.]
Od prvega dne upravljanja dalje sistem zapisuje stvari v omrežni
dnevnik. Mogoče boste v root-ov /bash_logout vnesli vrstico
"vi /README.$(ime gostitelja)
". To lahko pravite tudi tako, da
napišete skripto za su
ali sudo
, ki počne nekaj podobnega:
function 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 -
(Dnevnik ustvarite s pomočjo ukaza typescript
. Prav tako ustvarite
funkcijo, ki bo avtomatizirala dopolnjevala in posodabljala dnevnik.)
Priznati moram, da te avtomatizacije nisem vgradil do sedaj sem se
zanašal na samodisciplino. Kakor koli že, s to zamislijo sem se igral
(naredil sem celo prototip skripte in funkcije lupine, kot lahko
vidite.) Nekaj, kar me pri tem moti, je ukaz 'script
' sam. Mislim, da
bom moral zajeti izvore in dodati nekaj parametrov ukazne vrstice (za
prekinitev/zaustavitev shranjevanja skript 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 skripta ali binarna verzija v /bin
ali pa je izpisana z
eksplicitno potjo.
S tem se vsi, ki se prijavljajo kot korenski uporabnik, zavedajo
(včasih na zelo boleč način), kako zaupajo binarnim verzijam. Pameten
sistemski administrator z več uporabniki bo redno pregledoval datoteke
/bin
in /.*history
, da bi s tem našel vzorce in zančne napake.
Zares dobro motivirani sistemski administratorji bodo poiskali
opravila, ki jih je mogoče avtomatizirati, mesta, kjer je možno vnesti
logična preverjanja in opravila (zagon urejevalnikov, MTA in druge
obsežne interaktivne programe, z izpopolnjenimi lastnostmi skript, 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 potrebno opravljati brez
korenskih privilegijev. Seveda je takšne vrste ukazov mogoče zaganjati
s:
cp $data $some_users_home/tmp
su -c $origcommand $whatever_switches
cp $some_users_home/tmp $data
(kjer so specifikacije odvisne od ukaza).
Večina teh zadnjih varnostnih ukrepov prenese na domačo delovno postajo ali postajo z enim samim uporabnikom so pa zelo dober način za upravljanje večjega števila uporabnikov še posebej javnosti izpostavljeni sistemi (kot tisti pri netcom-u.)
xdm
(najverjetneje je to datoteka
/etc/rc/rc.6
ali /etc/rc.local
), tako da bo v razdelku
za zagon xdm
vsebovala 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 na lokalnem 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
kasnejših izdajah.