Hlavní navigace

Začínáme bezpečně s FreeBSD (5)

20. 7. 2004
Doba čtení: 9 minut

Sdílet

Při správě unixového systému je důležité znát nástroje, které vám usnadní práci při hledání nějaké chyby či zvláštní činnosti systému (nástroje pro práci s logy) a nástroje, které vám zjednoduší život tím, že některé často prováděné kroky budou za vás dělat automaticky v předem nastavené době.

Cron

Pro periodické spouštění procesů se používá cron. Jedná se o systémového démona automaticky startujícího při spuštění systému (opět /etc/defaults/rc.conf a položky cron_enable="YES" a cron_program="/usr/sbin/cron"). Ke konfiguraci toho, jaké procesy se mají periodicky spouštět, slouží /etc/crontab. Jedná se o systémový konfigurační soubor. Konfiguračním souborům cron se říká tabulky cron – crontab. Uživatelé si rovněž mohou definovat vlastní tabulky pro cron, ty jsou uloženy ve /var/cron/tabs/jmenouzivatele podle jména uživatele z /etc/passwd. Pro uživatelskou práci s crontab se používají příkazy crontab -e (spouští $editor pro vlastní definování periodicky startujících procesů; není vhodné editovat soubor přímo) a crontab -l pro vypsání tabulky.

V případě, že byste chtěli uživatelům použití cron zakázat, vytvořte soubor /var/cron/allow. Soubor je na začátku prázdny; obsahuje-li na každém řádku jméno uživatele, smí pouze ti využívat cron.

Systémová tabulka cron, /etc/crontab, se podobá uživatelským tabulkám, ale umožňuje definovat i uživatele, pod jehož privilegii daný proces poběží. Soubor /etc/crontab na svém začátku obsahuje definici proměnných prostředí a pak již tabulky pro procesy. Rozebereme si základní tabulku ve FreeBSD:

#minute hour mday month wday who command
#
*/5 * * * * root /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0 * * * * root newsyslog
#
# do daily/weekly/monthly maintenance
1 3 * * * root periodic daily
15 4 * * 6 root periodic weekly
30 5 1 * * root periodic monthly

První řádek znamená:

#minute hour mday month wday who command
#minuta hodina den v měsíci měsíc v roce den v týdnu už. jméno* příkaz 

*Uživatelská privilegia, pod kterými proces poběží.

Časové hodnoty se definují číslem. Pro minutu, hodinu a den v týdnu ( wday) začínají hodnoty od 0. Pro den v měsíci ( mday) a měsíc v roce začínají od 1. Definování časových hodnot je rozmanité, můžete definovat čistě jednu hodnotu, více hodnot, rozsah nebo periodicitu ( man 5 contab). Hvězdička ( *) je zástupný symbol pro „spusť kdykoli“ pro danou položku. V následujícím případě:

*/5 * * * * root /usr/libexec/atrun

tzn., že každých 5 minut, jakoukoli hodinu, jakýkoli den v měsíci, jakýkoli měsíc v roce… den v týdnu spusť s privilegii uživatele root /usr/libexec/atrun  – program startující zařazené procesy k pozdějšímu spuštění, více man atman atrun.

1 3 * * * root periodic daily

lidsky: každý den spusť v 03:01 periodic. Výpis z ps aux  dokazuje, že je to pravda:

root 522 0.0 0.3 628 432 ?? Is 3:01AM 0:00.05 /bin/sh -c periodic daily 

Pozor! Je důležité, abyste dobře pochopili definování časových položek a ohlídali si vždy menší časovou položku. V případě předešlého řádku by absence položky 1 ve sloupci minute způsobila, že by se příkaz periodic daily spouštěl každou minutu po dobu třetí ranní hodiny!!!

15 4 * * 6 root periodic weekly

spouští vždy v sobotu v 04:15 pod rootem periodic weekly.

Pro usnadnění práce můžete v crontab nahradit určité časové nastavení položkami např. @daily nebo @weekly. Více  man 5 crontab.

Ještě nutno dodat, že se systémovou tabulkou cron se pracuje jinak než s uživatelskou. V případě, že hodláte /etc/crontab editovat, pouze jej otevřete, pozměňte a uložte ve vašem editoru. Démon cron sám každou minutu kontroluje změny všech crontabs. Rovněž pro vypsání tabulky není nějaký speciální přepínač příkazu crontab, ale pouze  cat /etc/crontab.

Automatická údržba systému na FreeBSD

Z předešlého nastavení /etc/crontab jste se možná zamysleli nad příkazy periodic. FreeBSD pomocí periodic spouští v určitou dobu programy provádějící pravidelnou údržbu systému. Příkaz periodic čte konfigurační soubor /etc/default/periodic.conf, resp. /etc/periodic.conf, jestliže jej hodláte nějak měnit. Příkaz periodic můžete využít k periodickému spouštění denních, týdenních atd. vlastních příkazů.

Základní skripty pro periodic se nacházejí v /etc/periodic  a jsou rozděleny podle času spouštění plus adresář obsahující security skripty.

srot# ls -F /etc/periodic/
daily/ monthly/ security/ weekly/
srot# ls -F /etc/periodic/security/
100.chksetuid* 500.ipfwdenied* 650.ip6fwlimit* security.functions*
200.chkmounts* 510.ipfdenied* 700.kernelmsg*
300.chkuid0* 550.ipfwlimit* 800.loginfail*
400.passwdless* 600.ip6fwdenied* 900.tcpwrap* 

Jestliže si pořádně prohlédnete /etc/defaults/pe­riodic.conf, zjistíte, že si můžete periodic nastavit tak, aby vám prováděl důmyslné kontroly a funkce. Všechny výstupy periodic jsou zasílány mailem defaultně uživateli root (to samozřejmě můžete změnit zde, nebo pomocí /etc/mail/aliases). Některé z položek periodic.conf jsou (vybrány zcela náhodně pro ukázku):

daily_output="root"
# posílá output mail uživateli/ukládá do souboru

daily_status_disks_enable="YES"
# ukazuje kapacitu fs, a jestliže existuje
# /etc/dumpdates, tak pomocí dump -W ukáže,
# které fs potřebují zálohovat

daily_status_security_enable="YES"
# bezpečnostní kontrola

daily_status_security_passwdless_enable="YES
# kontrola účtů bez hesla 

Pořadí, v jakém jsou skripty spouštěny, je dáno číselným prefixem podle SystemV, proto např. 100.chksetuid poběží dříve než 200.chkmounts. Nastavení, aby se určité skripty spouštěly, má na starosti hlavní položka určité sekce. V případě promazávání tempů to je daily_clean_tmps_enable="NO". Jak již bylo zmíněno, změny neprovádíme do /etc/defaults/pe­riodic.conf.

# 110.clean-tmps
daily_clean_tmps_enable="YES" # Delete stuff daily
daily_clean_tmps_dirs="/tmp" # Delete under here
daily_clean_tmps_days="3" # If not accessed for
daily_clean_tmps_ignore=".X*-lock quota.user quota.group" # Don't delete these
daily_clean_tmps_verbose="YES" # Mention files deleted 

Pro zkoušku si můžete zkusit některé skripty spustit. Možná vám pomůže zajímavá (i když trochu zastaralá) stránka týkající se popisu voleb.

Příkaz periodic nám může, jestliže budeme číst jeho výstupy – emaily, pomoci při kontrole správy systému. Samozřejmě, že existují i sofistikovanější nástroje, ale zatím se pořád pohybujeme v základní instalaci. Na FreeBSDDiary.org je popis, jak udělat, aby vaše skripty byly spouštěny pomocí periodic.

Logovací démon

Systémové protokolování je možností, jak vyřešit nějaký problém programu nebo jak mít přehled nad tím, kdo se na server přihlašuje a co na něm dělá. Některé programy mají své vlastní logy, ale většina je napsána tak, aby spolupracovaly s unixovým systémem logování. Tradičně je logovacím démonem syslogd. Startování syslogd má jako obvykle na starosti /etc/rc.conf, jeho volby jsou:

syslogd_enable="YES" # Run syslog daemon (or NO).
syslogd_program="/usr/sbin/syslogd" # path to syslogd, if you want a different one.
syslogd_flags="-s" # Flags to syslogd (if enabled).
#syslogd_flags="-ss" # Syslogd flags to not bind an inet socket 

Z druhého řádku můžete vidět, že mohou existovat i jiné systémové loggery. Démon syslogd je na BSD standart, ale už je to takový dědeček. Mezi agilní nástupce patří syslogd-ng , který umí posílat logy přes TCP spojení a umožňuje použití regulárních výrazů, nebo nsyslogd , který umí rovněž TCP plus šifrování přenosu pomocí SSL. I  syslogd umí posílat logy na vzdálený systém, ale pouze přes UDP.

Flag "-s" udává, že má syslogd běžet v secure módu. Tzn. že nebude přijímat záznamy z jiných systémů. Kdybychom chtěli, aby syslogd přijímal logy od určitých serverů, pozměnili bychom řádek takto:

syslogd_flags="-s -a 10.0.0.10"

V případě posledního řádku a flagu "-ss" se nebude syslogd vůbec vázat na síť. soket, tj. bude přijímat záznamy pouze z místního systému.

Příkladový log z /var/log/cron.log:

Jul 14 03:40:00 srot /usr/sbin/cron[31541]: (root) CMD (/usr/libexec/atrun)
date hostname jmeno_procesu[PID-cislo procesu]:zprava 

Jaké záznamy od programů ukládá syslogd do logů, je definováno v souboru /etc/syslog.conf. Aby syslogd inteligentně zpracovával logy od programů, třídí je dle řetězců v přicházejících zprávách. Řetězce se dělí napříslušenství (facility) a úroveň (level). Nastavením určitého levelu logujete tento level a vyšší.

Abychom mohli dobře pochopit /etc/syslog.conf, následují tabulky vysvětlující tyto pojmy.

Tabulka č. 588
Příslušenství – příslušnost – Facility
auth bezpečné informace vztahující se k přihlašování – login, su.
authpriv stejné jako auth, přístupné pouze uživateli root
console zprávy vypsané na konzoli
cron zprávy od cronu
daemon zprávy od systémových démonů nemající vlastní příslušenství
ftp zprávy od ftp démonů
kern zprávy od jádra
lpr zprávy od tiskového démona
mail zprávy od mailserveru
mark neprogr. facility, v kombinaci s jiným facility pro vložení
časového razítka do logu (v intervalu 20 min)
news zprávy od news serveru
ntp zprávy od Network Time Protocolu
security zastřešuje zprávy od bezpečnostních programů, např. ipfw/ipf
syslog záznamy od syslogd obsahující všechny facility = kruh!
user sbírá všechny facility, jestliže určitému programu nepřiřadíte právě tuto
uucp zprávy z Unix-to-Unix Copy Protocolu
local0 - local7 facility pro definovaný program;
většina programů umožňuje logování přes tuto facility

 

Tabulka č. 589
Úroveň – Level (Od nejdůležitějších zpráv dolů)
emerg pád systému; zprávy na všech terminálech
alert zásadní výstraha pro opravu systému
crit hlášení o kritických chybách
err hlášení o chybách, systém však nespadne
warning výstraha
notice informativní upozornění
info hlavní systémové informace
debug zprávy používající se hlavně pro odlaďování programu
none level určující, aby se nazapisovaly do logů facility s tímto levelem

Vysvětlení /etc/syslog.conf

*.err;kern.debug;auth.notice;mail.crit /dev/console
# zaznamy vypisujici se na konzole

*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages

# téměř vse do messages:

# look at authpriv

security.* /var/log/security
# vsechny security zaznamy

auth.info;authpriv.info /var/log/auth.log
# autorizacni zaznamy, soubor ma prava 600

mail.info /var/log/maillog
# zaznamy mailserveru majici level info a vyssi

lpr.info /var/log/lpd-errs
# protokolovani tisk. demona majici level info a vyssi

cron.* /var/log/cron
# protokolovani všech zprav cronu

*.emerg *
# protokolovani jakychkoliv zprav majicich level emerge a vyssi kamkoli
#... odmazány zakomentované řádky kvůli místu

!startslip
# protokolovani podle nazvu programu (startslip)

*.* /var/log/slip.log
# jakekoli urovne do /var/log/slip.log

!ppp
# protokolovani podle nazvu programu (ppp)

*.* /var/log/ppp.log
# jakekoli urovne do /var/log/ppp.log 

V případě, že byste chtěli logovat na vzdálený stroj, bude vám stačit pouze řádek:

*.* @10.0.0.100

Na vzdáleném stroji pak nastavíte facility a levely logovacího démona, jako kdyby vše přijímal lokálně. Údaje budou obsahovat jméno serveru, ze kterého přicházejí.

Rotování logů

Patrně jste si všimli, že v adresáři jsou mimo datových logů určité logy zkomprimované. Po určité době/velikosti logu jsou soubory přesunuty do zkomprimované zálohy a hlavní log je vymazán. Tuto práci má na starosti newsyslog a jeho konfigurační soubor /etc/newsyslog.conf. Z cronu  vidíme, že je spouštěn jednou za hodinu.

0 * * * * root newsyslog

Konfigurační soubor máte za domácí úkol :) Případně tady.

Další možnosti monitorování

V případě, že chcete vědět, kdo je právě přihlášen do systému, můžete využít příkazů w, who a users, které čtou záznamy o momentálně přihlášených uživatelích z /var/run/utmp.

$ w
9:15AM up 8:38, 16 users, load averages: 0.40, 0.31, 0.60
USER TTY FROM LOGIN@ IDLE WHAT
styles p0 195-11.customer. 9:13AM 1 -zsh (zsh)
chamberl p1 80.97.66.147 8:02AM - bbs (yapp-3.1.1)
tetsuo p2 12.110.117.2 9:02AM 5 /usr/local/bin/real/ly 

Soubour /var/log/wtmp obsahuje záznamy o přihlašování. Můžete zkontrolovat pomocí  last:

> last | head -n 2
pepazdepa ttyp1 10.0.0.10 Thu Jul 15 14:48 still logged in
pepazdepa ttyp5 10.0.0.100 Thu Jul 15 06:49 - 06:49 (00:00) 

Kdy byly naposledy provedeny rebooty stroje?

UX DAy - tip 2

> last reboot | head -n 2
reboot ~ Tue Jul 13 23:40
reboot ~ Tue Jul 13 21:42 

Mezi další příkazy, které můžete využít, patří lastlog(určení posledního přihlášení uživatelů), ac (zobrazení přihlášeného času), nebo jestliže vám běží process accounting ( /etc/rc.conf  – accounting_enable="YES"), lastcomm, který vypíše ze souborů /var/account/acct* poslední příkazy uživatelů.

Závěr

Zcela vymazané logy nebo určité časové mezery jsou dílem stupidního crackera. Logy budou vždy cílem útočníkovy editace. Proto je dobré logy kontrolovat a mít pro ně dobře nastavená přístupová práva. Tímto dílem jsme, konečně, ukončili nesíťové bytí našeho stroje. Příště něco o errata, upgradu, patchování atd.

Byl pro vás článek přínosný?