Pkiety rc z serwisami i nie tylko (kawałek sennych przemyśleń)
Tomasz Kłoczko
kloczek w rudy.mif.pg.gda.pl
Wto, 17 Lis 1998, 04:18:32 CET
Podpatrzyłem w specu do ssh jedną ciekawą konstrukcję, która umożliwia
uczynienie upgradeu bardziej automatyczny. Otóż, jeżeli dany serwis
generuje plik z PIDem procesu serwera usługi (najczęściej w /var/run) to
można wykorzystać to do tego żeby przy upgrade pakietu sam serwis został
zrestartowany.
W ssh.spec wygląda to mniej więcej tak:
%post server
/sbin/chkconfig --add sshd
if test -r /var/run/sshd.pid
then /etc/rc.d/init.d/sshd restart >&2
fi
%preun server
if [ "$1" = 0 ] then
/etc/rc.d/init.d/sshd stop >&2
/sbin/chkconfig --del sshd
fi
Wydaje mi się że powinniśmy powyższy schemat rozpropagować na wszystkie
możliwe pakiety.
W tej chwili siedzę nad hc-cron, w którego zamierzam załadować przy okazji
upgradeu do 0.11 powyższe (z nowym Qrczakowym patchem do /etc/crontab.d).
To samo niemal analogicznie zaraz trafi (jak tylko skończę hc) do
vixie-cron.
Przy powyższym tylko należy uważać na jedną sprawę. Otóż chodzi o to
żeby "/etc/rc.d/init.d/<service> restart" zabijało poprzedni(e) proces(y)
i startowało nowy(e). Jeżeli ktoś miałby się chęć wziąć wg powyższego np.
za binda to tam restart w rc od niego jest IMHO skopany, bo to jest tylko
tak naprawdę odpowiednik "killall -HUP named".
Wogóle możnaby może rozszerzyć zestaw paramerów w skryptach rc
serwisów, żeby było to coś na podobieństwo:
* stop - stop serwisu,
* start - start serwisu,
* restart - restart serwisu z zabiciem wszystkich procesów
(niezwłocznie) i uruchomieniem wszystkiego od początku,
* reloadcfg - ponowne przeczytanie konfiguracji bez restartu samego
serwisu (to co zazwyczaj jest podpięte pod czytanie
SIGHUP),
* status - status uruchomienia serwisu (np. w "firewall status"
podpiołem wyświetlanie wszystkich tablic FW).
Może ktoś ma jeszcze inne pomysły na sformalizowanie powyższego w dalszym
stopniu ? albo może na potrzeby Debiana wymyślono coś więcej lub jakoś
pod inną nazwaą niż to co wymyśliłem sobie na poczekani czyli owe
reloadcfg ?
Jeszcze jedna uwaga dotycząca samych skryptów rc do serwisów.
Jeżeli skrypt takowy możnaby jakoś sparametryzować, to ewentualne
parametry powinny wpaść do /etc/sysconfig/<service> gdzie w pliku tym
byłyby tylko lista zmiennych z warościami.
Tak mogłoby być z kilkoma rzeczami np. w squidzie. Ma on taką paskudną
cechę, że skrypt jaki jest RH bez modyfikacji nie pójdzie na pewnych
maszynkach.
Przykład:
Mam taki jeden serwerek w jednym z LO w Gdyni, który jest podpięty słąbym
modemem na dzierżawce. Robi on za masq FW i stoi na nim też named, który
co prawda z zewnątrz nie jest dostępny ale zanim wstanie poprawnie to już
startuje squid, który przy starcie musi mieć już komletny przynajmniej DNS
cache i jeżeli nie może się odwołać do pewnych nazw to kończy działalność,
a ludzkowie lokalnie nie mogli przez to korzystać z proxy. Nie pomaga tu w
tym wypadku dodanie do /etc/resolv.conf kolejnej linijki z nameservis
wskazującym na zewnętrzny DNS serwer gdyż linia jest dość cienka i straty
są na tyle duże, że squid nie doczekuje się tak czy inaczej odpowiedzi ani
z wstającego nameda lokalnie ani od tego zdalnego. Rozwiązaniem jest
odhashowanie w /etc/rc.d/init.d/squid linijki z:
#SQUID_OPTS="-D"
Które powoduje, że squid potrafi podnieść sie bez DNS. taka modyfikacja
jest o tyle paskudna, że narusza sumę kontrolą skrypty czyli od tego
momentu ktoś kto tam z jakiś powodów się dostanie w tym skrypcie
niepostrzeżenie może podłożyć własne rzeczy bez wzbudzania od razu
dalszych podejrzeń. Sam z tego typu wejść w kilku miejscach korzystałem
.. kiedyś ;) i opierajc się tylko o bazę rpm-a, którą admin kontroluje
automatycznie lub ręcznie można "podmodyfikować" trochę sysytem bez
wzbudzania od razu alarmu.
Rozwiązaniem byłoby wstawienie w /etc/rc.d/init.d/squid linijki
z włączeniem zmiennych w śrtodowisko skrypty z /etc/sysconfig/squid.
Tylko nie mogłoby być to proste:
. /etc/sysconfig/squid
z w sirodku SQUID_OPTS="-D" gdyż różnie dobrze w tym SQUID_OPTS mogłoby
się znaleźć "-D; /tmp/podłożenieżaby". Czyli w pliku tym musiałoby być
raczej:
DNS_CHECK_ON_STATR=no
które w samym skrypcie rc byłoby przetwarzane na opcję -D dla
uruchamianego squida.
Akurat w squidzie jest takich parę rzeczy, które dałoby się wrzućić do
pliku bedącego w /etc/sysconfig.
Tak na dobrą sprawę to ów includ zmiennych też nie mógłby być robiony
przez proste:
. /etc/sysconfig/<service>
bo między linikami ze zmiennymi można wstawić co się chce i to się
normalnie wykona. Czyli do do /etc/rc.d/init.d/functions trzeba by może
dodać funkcje do bezpiecznego czytania zmiennych z podanego pliku jako
parametry dal skryptu czyli żeby wyglądało to mniej więcej tak:
readvariables([/etc/sysconfig/]<service>)
lub jakos podobnego.
Sam nie podejmuję się zrobienia na razie powyżeszego także jak ktoś chce
to się może zmieżyć z napisaniem takiej funkcyjki lub może wręcz programu,
który w bezpieczny sposówb parsowałby podany plik i który pzrez eval
możnaby wywołać.
Nie dość, że całość będzie bezpieczniejsza to jeszcze sam
/etc/sysconfig/<service> zawierajacy wyczerpującą listę przełączników i
różnych zmienych byłby czytelniejszy lub wręcz samokomentujacy się
(poprzez odpowiednio logiczne/sugestywne dobieranie nazw zmiennych).
Także wydaje mi się, że pod kontem powyższego powinny być także przejrzane
wszystkie skrypty rc. Także i te które podnoszą poszczególne interfejsy
sieciowe czy robiące inne rzeczy, żeby w miarę możliwości zanim
wykorzystają zawartość jakiś plików, który nie są pod parasolem PM żeby
jakoś wrappowały/próbowały wykrywać podejrzane rzeczy przekazywane w
tychże plikach.
I jeszcze jedno. Samo już zgrupowanie takich plików, które potencjalnie
swoją zawartością mogą coś nabruździć w jednym katalogiu jak
/etc/sysconfig dałoby to że choćby najmnijej łatwiej by się je
kontrolowało z wykorzystaniem dodatkowych narzędzi jak CVS czy tripwire
czy nawet poprzez ręczne (oczne) kontrolowanie od czasu do czasu.
kloczek
PS. Prawie usypiający ..
--
-----------------------------------------------------------
*Ludzie nie mają problemów, tylko sobie sami je stwarzają*
-----------------------------------------------------------
Tomasz Kłoczko, sys adm @zie.pg.gda.pl|*e-mail: kloczek w rudy.mif.pg.gda.pl*
Więcej informacji o liście dyskusyjnej pld-devel-pl