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 at
, man 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/periodic.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/periodic.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.
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 |
Ú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?
> 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.