108.2 Lecke 1
Tanúsítvány: |
LPIC-1 |
---|---|
Verzió: |
5.0 |
Témakör: |
108 Alapvető rendszerszolgáltatások |
Fejezet: |
108.2 Rendszernaplózás |
Lecke: |
1/2 |
Bevezetés
A logok (rendszernaplók) lehetnek a rendszergazda legjobb barátai. A logok olyan, általában szöveges fájlok, amelyekben a rendszer és a hálózat minden eseménye időrendben szerepel a rendszer indításának pillanatától kezdve. A logokban található információk köre gyakorlatilag a rendszer minden aspektusára kiterjed: sikertelen hitelesítési kísérletek, program- és szolgáltatáshibák, a tűzfal által blokkolt hostok stb. Sejthető tehát, hogy a logok nagyban megkönnyítik a rendszergazdák életét a hibaelhárítás, az erőforrások ellenőrzése, a programok rendellenes viselkedésének észlelése stb. terén.
Ebben a leckében a GNU/Linux disztribúciókban jelenleg megtalálható egyik legelterjedtebb logolási lehetőséget fogjuk megvitatni: rsyslog
. Megvizsgáljuk a különböző létező logtípusokat, hogy hol vannak tárolva, milyen információkat tartalmaznak, és hogyan lehet ezeket az információkat megszerezni és szűrni. Megvitatjuk a logrotációt és a kernel gyűrűpufferét (kernel ring buffer), valamint azt, hogy hogyan lehet a logokat IP-hálózatokon keresztül, központi szervereken tárolni.
Rendszernaplózás
Abban a pillanatban, hogy a kernel és a rendszer különböző folyamatai elkezdenek futni és kommunikálni egymással, rengeteg információ keletkezik üzenetek formájában, amelyeket — többnyire — a logokba küldenek.
Logolás nélkül a rendszergazdáknak fejfájást okozna egy szerveren történt esemény megkeresése, ezért fontos, hogy szabványosított és központosított módon lehessen nyomon követni a rendszereseményeket. A logok hibaelhárítás és biztonság szempontjából meghatározóak és sokatmondóak, valamint megbízható adatforrások a rendszerstatisztikák megértéséhez és a trendjósláshoz.
Ha eltekintünk a systemd-journald
-tól (amiről a következő leckében lesz szó), a logolást hagyományosan három fő dedikált szolgáltatás kezeli: syslog
, syslog-ng
(syslog new generation) és az rsyslog
(“the rocket-fast system for log processing” (a rakétasebessűg rendszer a logok feldolgozásához)). Az rsyslog
fontos fejlesztéseket hozott (például RELP-támogatást), és napjainkra a legnépszerűbbé vált. Mindegyik szolgáltatás összegyűjti a más szolgáltatásoktól és programoktól érkező üzeneteket és azokat logfájlokban tárolja, jellemzően a /var/log
alatt. Egyes szolgáltatások azonban saját logjaikról is gondoskodnak (vegyük például az Apache HTTPD webszervert vagy a CUPS nyomtatórendszert). Hasonlóképpen, a Linux kernel egy memórián belüli gyűrűpuffert használ a logüzenetek tárolására.
Note
|
A |
Mivel az rsyslog
lett a de facto szabványos logolási lehetőség minden nagyobb disztribúcióban, ezért ebben a leckében erre fogunk koncentrálni. Az rsyslog
kliens-szerver modellt használ. A kliens és a szerver lehet ugyanazon a gépen vagy különböző gépeken. Az üzenetek egy meghatározott formátumban kerülnek küldésre és fogadásra, és az IP-hálózatokon keresztül központosított rsyslog
szervereken tárolhatók. Az rsyslog daemonja — rsyslogd
— együtt dolgozik a klogd
-vel (amely a kernel üzeneteket kezeli).
A következő részekben az rsyslog
-ról és a logolási infrastruktúrájáról lesz szó.
Note
|
A daemon egy olyan szolgáltatás, ami a háttérben fut. Vegyük észre a |
Logtípusok
Mivel a logok változó (variable) adatok, alapesetben a /var/log
-ban találhatók meg. Nagyjából rendszerlogokra (system logs) és szolgáltatási vagy programlogokra (service or program logs) oszthatjuk őket.
Lássunk néhány rendszerlogot és az általuk tárolt információkat:
/var/log/auth.log
-
Autentikációs folyamatokkal kapcsolatos tevékenységek: bejelentkezett felhasználók,
sudo
információk, cronjobok, sikertelen bejelentkezési kísérletek, stb. /var/log/syslog
-
Gyakorlatilag az összes, az
rsyslogd
által rögzített log központi fájlja. Mivel nagyon sok információt tartalmaz, a logfájlok a/etc/rsyslog.conf
állományban megadott konfigurációnak megfelelően más állományok között oszlanak meg. /var/log/debug
-
Programok debug információi.
/var/log/kern.log
-
Kernel üzenetek.
/var/log/messages
-
Informatív üzenetek, amelyek nem a kernelhez, hanem más szolgáltatásokhoz kapcsolódnak. Ez az alapértelmezett remote klienslog célpontja is egy központosított log-szerver implementációjában.
/var/log/daemon.log
-
Daemonokhoz vagy egyéb, háttérben futó szolgáltatásokhoz kapcsolódó információk.
/var/log/mail.log
-
Az e-mail szerverhez kapcsolódó információk, pl. postfix.
/var/log/Xorg.0.log
-
A videokártyához kapcsolódó információk.
/var/run/utmp
and/var/log/wtmp
-
Sikeres bejelentkezések.
/var/log/btmp
-
Sikertelen bejelentkezési kísérletek, például brute force támadás SSH-n keresztül.
/var/log/faillog
-
Sikertelen autentikációs kísérletek.
/var/log/lastlog
-
A legutóbbi felhasználói bejelentkezések dátuma és időpontja.
Lássunk néhány példát a szolgáltatások logjaira:
/var/log/cups/
-
A_Common Unix Printing System_ jogjainak mappája. Általában a következő alapértelmezett logfájlokat tartalmazza:
error_log
,page_log
ésaccess_log
. /var/log/apache2/
or/var/log/httpd
-
Az Apache Web Server logjainak mappája. Általában a következő alapértelmezett logfájlokat tartalmazza:
access.log
,error_log
, ésother_vhosts_access.log
. /var/log/mysql
-
A MySQL Relational Database Management System logjainak mappája. Általában a következő alapértelmezett logfájlokat tartalmazza:
error_log
,mysql.log
ésmysql-slow.log
. /var/log/samba/
-
A Session Message Block (SMB) protokoll logjaiinak mappája. Általában a következő alapértelmezett logfájlokat tartalmazza:
log.
,log.nmbd
éslog.smbd
.
Note
|
A logfájlok pontos neve és tartalma Linux-disztribúcióról Linux-disztribúcióra változhat. Léteznek bizonyos disztribúciókra jellemző logfájlok is, mint például a Debian GNU/Linux és az ebből származó változatok esetében a |
Logok olvasása
A logfájlok olvasásához először meg kell győződnünk arról, hogy root felhasználóként vagyunk bejelentkezve, vagy olvasási jogosultságunk van a fájlon. Számos segédprogramot használhatunk, mint például:
less
ormore
-
Lapozók, amelyek egyszerre egy oldal megtekintését és görgetését teszik lehetővé:
root@debian:~# less /var/log/auth.log Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting. Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22. Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22. Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting. Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22. Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22. Sep 12 18:49:46 debian sshd[905]: Accepted password for carol from 192.168.1.65 port 44296 ssh2 Sep 12 18:49:46 debian sshd[905]: pam_unix(sshd:session): session opened for user carol by (uid=0) Sep 12 18:49:46 debian systemd-logind[331]: New session 2 of user carol. Sep 12 18:49:46 debian systemd: pam_unix(systemd-user:session): session opened for user carol by (uid=0) (...)
zless
orzmore
-
Ugyanaz, mint a
less
és amore
, de agzip
-pel tömörített logok esetére (alogrotate
egyik funkciója):root@debian:~# zless /var/log/auth.log.3.gz Aug 19 20:05:57 debian sudo: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/sbin/shutdown -h now Aug 19 20:05:57 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0) Aug 19 20:05:57 debian lightdm: pam_unix(lightdm-greeter:session): session closed for user lightdm Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event2 (Power Button) Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event3 (Sleep Button) Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event4 (Video Bus) Aug 19 23:50:49 debian systemd-logind[333]: New seat seat0. Aug 19 23:50:49 debian sshd[409]: Server listening on 0.0.0.0 port 22. (...)
tail
-
A fájl utolsó sorainak megtekintése (az alapértelmezett érték 10 sor). A tail ereje — nagyrészt — az
-f
kapcsolóban rejlik, amely dinamikusan mutatja az új sorokat, amint azok hozzáadásra kerülnek:root@suse-server:~# tail -f /var/log/messages 2019-09-14T13:57:28.962780+02:00 suse-server sudo: pam_unix(sudo:session): session closed for user root 2019-09-14T13:57:38.038298+02:00 suse-server sudo: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/usr/bin/tail -f /var/log/messages 2019-09-14T13:57:38.039927+02:00 suse-server sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0) 2019-09-14T14:07:22+02:00 debian carol: appending new message from client to remote server...
head
-
Egy fájl első sorainak megtekintésére szolgál (az alapértelmezés 10 sor):
root@suse-server:~# head -5 /var/log/mail 2019-06-29T11:47:59.219806+02:00 suse-server postfix/postfix-script[1732]: the Postfix mail system is not running 2019-06-29T11:48:01.355361+02:00 suse-server postfix/postfix-script[1925]: starting the Postfix mail system 2019-06-29T11:48:01.391128+02:00 suse-server postfix/master[1930]: daemon started -- version 3.3.1, configuration /etc/postfix 2019-06-29T11:55:39.247462+02:00 suse-server postfix/postfix-script[3364]: stopping the Postfix mail system 2019-06-29T11:55:39.249375+02:00 suse-server postfix/master[1930]: terminating on signal 15
grep
-
Filterezésre szolgáló segédprogram, amely lehetővé teszi bizonyos stringek keresését:
root@debian:~# grep "dhclient" /var/log/syslog Sep 13 11:58:48 debian dhclient[448]: DHCPREQUEST of 192.168.1.4 on enp0s3 to 192.168.1.1 port 67 Sep 13 11:58:49 debian dhclient[448]: DHCPACK of 192.168.1.4 from 192.168.1.1 Sep 13 11:58:49 debian dhclient[448]: bound to 192.168.1.4 -- renewal in 1368 seconds. (...)
Amint azt már észrevehettük, a kimenet a következő formátumban jelenik meg:
-
Időbélyeg
-
Hostnév, ahonnan az üzenet származik
-
Az üzenetet generáló program/szolgáltatás neve
-
Az üzenetet generáló program PID azonosítója
-
A végrehajtott művelet leírása
Van néhány példa, amikor a logok nem szöveges, hanem bináris fájlok, és — következésképpen — speciális parancsokat kell használnunk az elemzésükhöz:
/var/log/wtmp
-
who
(vagyw
) használata:root@debian:~# who root pts/0 2020-09-14 13:05 (192.168.1.75) root pts/1 2020-09-14 13:43 (192.168.1.75)
/var/log/btmp
-
utmpdump
vagylast -f
használata:root@debian:~# utmpdump /var/log/btmp Utmp dump of /var/log/btmp [6] [01287] [ ] [dave ] [ssh:notty ] [192.168.1.75 ] [192.168.1.75 ] [2019-09-07T19:33:32,000000+0000]
/var/log/faillog
-
faillog
használata:root@debian:~# faillog -a | less Login Failures Maximum Latest On root 0 0 01/01/70 01:00:00 +0100 daemon 0 0 01/01/70 01:00:00 +0100 bin 0 0 01/01/70 01:00:00 +0100 sys 0 0 01/01/70 01:00:00 +0100 sync 0 0 01/01/70 01:00:00 +0100 games 0 0 01/01/70 01:00:00 +0100 man 0 0 01/01/70 01:00:00 +0100 lp 0 0 01/01/70 01:00:00 +0100 mail 0 0 01/01/70 01:00:00 +0100 (...)
/var/log/lastlog
-
lastlog
használata:root@debian:~# lastlog | less Username Port From Latest root Never logged in daemon Never logged in bin Never logged in sys Never logged in (...) sync Never logged in avahi Never logged in colord Never logged in saned Never logged in hplip Never logged in carol pts/1 192.168.1.75 Sat Sep 14 13:43:06 +0200 2019 dave pts/3 192.168.1.75 Mon Sep 2 14:22:08 +0200 2019
Note
|
Vannak grafikus eszközök is a logfájlok olvasására, például: |
Hogyan lesznek az üzenetekből logok?
A következő folyamat azt szemlélteti, hogyan íródik egy üzenet a logba:
-
Az alkalmazások, a szolgáltatások és a kernel üzeneteket írnak speciális fájlokba (socketek és memóriapufferek), például a
/dev/log
vagy a/dev/kmsg
fájlokba. -
A
rsyslogd
megkapja az információ a socketekből vagy a memóriapufferekből. -
Az
/etc/rsyslog.conf
állományban és/vagy az/etc/ryslog.d/
állományokban található szabályoktól függően azrsyslogd
a megfelelő logfájlba (jellemzően a/var/log
fájlba) továbbítja az információt.
Note
|
A socket egy speciális fájl, amelyet a különböző folyamatok közötti információátvitelre használnak. A rendszerben lévő összes socket listázásához a |
Eszközök, prioritások és intézkedések
Az rsyslog
konfigurációs fájl az /etc/rsylog.conf
(néhány disztribúcióban a /etc/rsyslog.d/
állományban is találhatunk konfigurációs fájlokat). Általában három részre van osztva: MODULES
, GLOBAL DIRECTIVES
és RULES
. Nézzük meg ezeket a Debian GNU/Linux 10 (buster) gépünk rsyslog.conf
fájljának feltárásával — ehhez használhatjuk a sudo less /etc/rsyslog.conf
parancsot!
A MODULES
tartalmazza a logolás, az üzenetküldési képesség és az UDP/TCP logfogadás modul-támogatását:
################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514")
A GLOBAL DIRECTIVES
lehetővé teszi számunkra, hogy számos dolgot konfiguráljunk, például a logok és a logmappák jogosultságait:
########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # # Set the default permissions for all log files. # $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf
A RULES
az, ahol az eszközök (facilities), a prioritások (priorities) és a intézkedések (actions) megjelennek. Az ebben a szakaszban található beállítások utasítják a logolási daemont, hogy bizonyos szabályok szerint szűrje az üzeneteket, és szükség esetén logolja vagy küldje el azokat. Ahhoz, hogy megértsük ezeket a szabályokat, először is el kell magyaráznunk az rsyslog
eszközök és prioritások fogalmát. Minden logüzenet kap egy facility számot és egy kulcsszót, amelyek az üzenetet előállító Linux belső alrendszeréhez kapcsolódnak:
Szám | Kulcsszó | Leírás |
---|---|---|
|
|
Linux kernel üzenetk |
|
|
Felhasználói szintű üzenetek |
|
|
Mail rendszer |
|
|
System daemonok |
|
|
Biztonsági/Autorizációs üzenetek |
|
|
syslogd üzenetek |
|
|
Line printer alrendszer |
|
|
Hálózati hírek alrendszer |
|
|
UUCP (Unix-to-Unix Copy Protocol) alrendszer |
|
|
Óra daemon |
|
|
Biztonsági/Autorizációs üzenetek |
|
|
FTP (File Transfer Protocol) daemon |
|
|
NTP (Network Time Protocol) daemon |
|
|
Log audit |
|
|
Log alert |
|
|
Óra daemon |
|
|
Helyi használat 0 - 7 |
Továbbá minden üzenetnek van egy prioritási szintje:
Kód | Súlyosság (severity) | Kulcsszó | Leírás |
---|---|---|---|
|
Vészhelyzet (emergency) |
|
A rendszer használhatatlan. |
|
Riasztás (alert) |
|
Azonnali cselekvés szükséges |
|
Kritikus (critical) |
|
Kritikus állapotok |
|
Hiba (error) |
|
Hibahelyzet. |
|
Figyelmeztetés (warning) |
|
Figyelmeztető állapotok |
|
Tájékoztatás (notice) |
|
Normál, de szignifikáns állapotok |
|
Informális (informational) |
|
Tájékoztató üzenetek |
|
Hibakeresés (debug) |
|
Hibakeresési szintű üzenetek |
Íme egy részlet az rsyslog.conf
állományból a Debian GNU/Linux 10 (buster) rendszerünkből, amely tartalmaz néhány mintaszabályt:
############### #### RULES #### ############### # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # mail.info -/var/log/mail.info mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Some "catch-all" log files. # *.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug *.=info;*.=notice;*.=warn;\ auth,authpriv.none;\ cron,daemon.none;\ mail,news.none -/var/log/messages
A szabály formátuma a következő: <facility>.<priority>
<action>
A <facility>.<priority>
szelektor kiszűri a megfelelő üzeneteket. A prioritási szintek hierarchikusan inkluzívak, ami azt jelenti, hogy az rsyslog a megadott prioritású és magasabb prioritású üzeneteket fogja megtalálni. Az <action>
megadja, hogy milyen műveletet kell végrehajtani (hova küldje a logüzenetet). Az egyértelműség kedvéért íme néhány példa:
auth,authpriv.* /var/log/auth.log
A prioritástól (*
) függetlenül, az auth
vagy authpriv
eszközök minden üzenete a /var/log/auth.log
mappába kerül.
*.*;auth,authpriv.none -/var/log/syslog
Minden üzenet — prioritástól (*
) függetlenül — minden eszköztől (*
) — az auth
vagy authpriv
üzenetek kivételével (ezért a .none
utótag) — a /var/log/syslog
mappába íródik (az útvonal előtti mínusz jel (-
) megakadályozza a túlzott lemezírást). Figyeljük meg a pontosvesszőt (;
) a választó kettéválasztására és a vesszőt (,
) két lehetőség egy szabályban való összekapcsolására (auth,authpriv
).
mail.err /var/log/mail.err
A mail
szolgáltatásból érkező, error
vagy magasabb prioritási szintű (critical
, alert
vagy emergency
) üzenetek a var/log/mail.err
-be kerülnek.
*.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug
Az összes eszközből származó debug
prioritású és semmilyen más (=
) üzenetek a /var/log/debug
mappába kerülnek — kivéve az auth
, authpriv
, news
és mail
szolgáltatásból származó üzeneteket (vegyük észre a szintaxist: ;\
).
Manuális bejegyzések a rendszerlogba: logger
A logger
parancs jól jön shell scriptek készítéséhez vagy tesztelési célokra. A logger
minden kapott üzenetet a /var/log/syslog
állományhoz csatol (vagy a /var/log/messages
állományba, ha egy távoli központi logszerverre (central log server) logolunk, ahogy azt a lecke későbbi részében látni fogjuk):
carol@debian:~$ logger this comment goes into "/var/log/syslog"
A /var/log/syslog
utolsó sorának kiíratásához használjuk a tail
parancsot a -1
kapcsolóval:
root@debian:~# tail -1 /var/log/syslog Sep 17 17:55:33 debian carol: this comment goes into /var/log/syslog
rsyslog
, mint Central Log Server
A téma elmagyarázásához egy új host hozzáadásával fogjuk bővíteni a beállításainkat. Az elrendezés a következő:
Szerep | Hostnév | OS | IP Cím |
---|---|---|---|
Central Log Server |
|
openSUSE Leap 15.1 |
192.168.1.6 |
Client |
|
Debian GNU/Linux 10 (buster) |
192.168.1.4 |
Kezdjük a szerver konfigurálásával. Először is győződjünk meg róla, hogy az rsyslog
működik:
root@suse-server:~# systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2019-09-17 18:45:58 CEST; 7min ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 832 (rsyslogd) Tasks: 5 (limit: 4915) CGroup: /system.slice/rsyslog.service └─832 /usr/sbin/rsyslogd -n -iNONE
Az openSUSE a távoli logoláshoz külön konfigurációs fájlt tartalmaz: /etc/rsyslog.d/remote.conf
. Engedélyezzük a TCP-n keresztül érkező üzenetek fogadását a kliensektől (távoli hostoktól). Vissza kell vonnunk a kikommentezést a modul betöltését és a TCP-szerver elindítását végző sorokból az 514-es porton:
# ######### Receiving Messages from Remote Hosts ########## # TCP Syslog Server: # provides TCP syslog reception and GSS-API (if compiled to support it) $ModLoad imtcp.so # load module ##$UDPServerAddress 10.10.0.1 # force to listen on this IP only $InputTCPServerRun 514 # Starts a TCP server on selected port # UDP Syslog Server: #$ModLoad imudp.so # provides UDP syslog reception ##$UDPServerAddress 10.10.0.1 # force to listen on this IP only #$UDPServerRun 514 # start a UDP syslog server at standard port 514
Ha ez megtörtént, újra kell indítanunk az rsyslog szolgáltatást, és ellenőriznünk kell, hogy a szerver az 514-es porton figyel-e:
root@suse-server:~# systemctl restart rsyslog root@suse-server:~# netstat -nltp | grep 514 [sudo] password for root: tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 2263/rsyslogd tcp6 0 0 :::514 :::* LISTEN 2263/rsyslogd
Ezután nyissuk meg a portokat a tűzfalon, és töltsük újra a konfigurációt:
root@suse-server:~# firewall-cmd --permanent --add-port 514/tcp success root@suse-server:~# firewall-cmd --reload success
Note
|
Az openSUSE Leap 15.0 megjelenésével a |
Sablonok és szűrési feltételek
Alapértelmezés szerint a kliens logjai a szerver /var/log/messages
fájljába kerülnek — a szerver logjaival együtt. Létrehozunk azonban egy sablont (template) és egy szűrési feltételt (filter condition), hogy a kliens logjait saját, egyértelmű mappákban tároljuk. Ehhez a következőket kell hozzáadnunk az /etc/rsyslog.conf
(vagy /etc/rsyslog.d/remote.conf
) állományhoz:
$template RemoteLogs,"/var/log/remotehosts/%HOSTNAME%/%$NOW%.%syslogseverity-text%.log" if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs & stop
- Template
-
A sablon az első sornak felel meg, és lehetővé teszi a lognevek formátumának megadását a dinamikus fájlnévgenerálással. A sablon a következőkből áll:
-
Sablon utasítás (
$template
) -
Sablon neve (
RemoteLogs
) -
Sablon szövege (
"/var/log/remotehosts/%HOSTNAME%/%$NOW%.%syslogseverity-text%.log"
) -
Kapcsolók (opcionális)
-
A sablonunk neve RemoteLogs
, a szövege pedig a /var/log
elérési útvonala. A távoli hostunk összes logja a remotehosts
mappába kerül, ahol a gép hostneve (%HOSTNAME%
) alapján létrehozunk egy almappát. Ebben a mappában minden egyes fájlnév a dátumot (%$NOW%
), az üzenet súlyosságát (más néven prioritását) szöveges formátumban (%syslogseverity-text%
) és a .log
utótagot tartalmazza. A százalékjelek közötti szavak a tulajdonságok (properties), és lehetővé teszik a logüzenet tartalmának (dátum, prioritás stb.) elérését. A syslog
üzenetnek számos jól definiált tulajdonsága van, amelyek sablonokban használhatók. Ezekhez a tulajdonságokhoz az úgynevezett property replacer segítségével férhetünk hozzá — és módosíthatjuk őket --, ami azt jelenti, hogy a százalékjelek közé írjuk őket.
- Filter Condition
-
A fennmaradó két sor a szűrőfeltételnek és a hozzá tartozó műveletnek felel meg:
-
Expression-Based Filter (
if $FROMHOST-IP=='192.168.1.4'
) -
Action (
then ?RemoteLogs
,& stop
)
-
Az első sor ellenőrzi a logot küldő távoli host IP-címét, és — ha ez megegyezik a Debian kliensünkével — alkalmazza a RemoteLogs
sablont. Az utolsó sor (& stop
) garantálja, hogy az üzenetek nem kerülnek egyszerre a /var/log/messages
mappába (hanem csak a /var/log/remotehosts
mappában lévő állományokba).
Note
|
A sablonokról, tulajdonságokról és szabályokról többet megtudhatunk az |
A frissített konfigurációval újraindítjuk az rsyslog
rendszert, és megerősítjük, hogy a /var/log
mappában még nincs remotehosts
mappa:
root@suse-server:~# systemctl restart rsyslog root@suse-server:~# ls /var/log/ acpid chrony localmessages pbl.log Xorg.0.log alternatives.log cups mail pk_backend_zypp Xorg.0.log.old apparmor firebird mail.err samba YaST2 audit firewall mail.info snapper.log zypp boot.log firewalld mail.warn tallylog zypper.log boot.msg krb5 messages tuned boot.omsg lastlog mysql warn btmp lightdm NetworkManager wtmp
A szerver most már konfigurálva van. Most pedig konfiguráljuk a klienst!
Ismét meg kell győződnünk arról, hogy az rsyslog
telepítve van és fut:
root@debian:~# sudo systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: Active: active (running) since Thu 2019-09-17 18:47:54 CEST; 7min ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 351 (rsyslogd) Tasks: 4 (limit: 4915) CGroup: /system.slice/rsyslog.service └─351 /usr/sbin/rsyslogd -n
A példánkban a névfeloldást a kliensen az /etc/hosts
állományba a 192.168.1.6 suse-server
sor hozzáadásával valósítottuk meg. Így a szerverre vagy névvel (suse-server
) vagy IP-címmel (192.168.1.6
) hivatkozhatunk.
A mi Debian kliensünkben nincs meg az /etc/rsyslog.d/
állományban található remote.conf
fájl, ezért a konfigurációnkat az /etc/rsyslog.conf
állományban fogjuk alkalmazni. A következő sort írjuk a fájl végére:
*.* @@suse-server:514
Végül újraindítjuk az rsyslog
-ot.
root@debian:~# systemctl restart rsyslog
Most menjünk vissza a suse-server
gépünkre, és ellenőrizzük a /var/log
-ban a remotehosts
létezését:
root@suse-server:~# ls /var/log/remotehosts/debian/ 2019-09-17.info.log 2019-09-17.notice.log
Már van két log a /var/log/remotehosts'-en belül, ahogyan azt a sablonunkban leírtuk. A szakasz befejezéséhez futtassuk a `tail -f
2019-09-17.notice.log
parancsot a suse-server
-en, miközben manuálisan elküldünk egy logot a Debian kliensünkről, és megerősítjük, hogy az üzenetek a várt módon kerülnek a logfájlba (a -t
kapcsoló egy címkét (tag) ad az üzenetünkhöz):
root@suse-server:~# tail -f /var/log/remotehosts/debian/2019-09-17.notice.log 2019-09-17T20:57:42+02:00 debian dbus[323]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' 2019-09-17T21:01:41+02:00 debian anacron[1766]: Anacron 2.3 started on 2019-09-17 2019-09-17T21:01:41+02:00 debian anacron[1766]: Normal exit (0 jobs run)
carol@debian:~$ logger -t DEBIAN-CLIENT Hi from 192.168.1.4
root@suse-server:~# tail -f /var/log/remotehosts/debian/2019-09-17.notice.log 2019-09-17T20:57:42+02:00 debian dbus[323]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher' 2019-09-17T21:01:41+02:00 debian anacron[1766]: Anacron 2.3 started on 2019-09-17 2019-09-17T21:01:41+02:00 debian anacron[1766]: Normal exit (0 jobs run) 2019-09-17T21:04:21+02:00 debian DEBIAN-CLIENT: Hi from 192.168.1.4
A logrotáció mechanizmusa
A logok rendszeres rotálódnak, ami két fő célt szolgál:
-
Megakadályozza, hogy a régebbi logfájlok a szükségesnél több helyet foglaljanak a lemezen.
-
Kezelhető hosszúságúan tartja a logot, hogy megkönnyítse a megtekintést.
A logok rotációjáért (vagy ciklikusságáért) felelős segédprogram a logrotate
, és olyan műveleteket végez, mint a logfájlok új néven való áthelyezése, archiválása és/vagy tömörítése, néha e-mailben történő elküldése a rendszergazdának, és végül, elöregedésük esetén, a törlésük. Különböző konvenciók léteznek ezeknek a rotált logfájloknak a megnevezésére (például a dátumot tartalmazó utótag hozzáadása a fájlnévhez); azonban az általános gyakorlat az, hogy egyszerűen egy egész számot tartalmazó utótagot adunk hozzá:
root@debian:~# ls /var/log/messages* /var/log/messages /var/log/messages.1 /var/log/messages.2.gz /var/log/messages.3.gz /var/log/messages.4.gz
Most nézzük, mi fog történni a következő logrotáció során:
-
A
messages.4.gz
törlődik és elvész. -
A
messages.3.gz
tartalma átkerül amessages.4.gz
-be. -
A
messages.2.gz
tartalma átkerül amessages.3.gz
-be. -
A
messages.1
tartalma átkerül amessages.2.gz
-be. -
A
messages
tartalma átkerül amessages.1
-be, és amessages
üres lesz és készen áll az új logbejegyzések regisztrálására.
Figyeljük meg, hogy — a logrotate
utasítások szerint, amelyeket hamarosan látni fogunk — a három régebbi logfájl tömörítve van, míg a két legújabb nem. Továbbá, az elmúlt 4-5 hét logfájljait is megtartjuk. Az 1 hetes üzenetek olvasásához a messages.1
-t fogjuk felkeresni (és így tovább).
A logrotate
naponta fut automatikus folyamatként vagy cronjobként a /etc/cron.daily/logrotate
script segítségével, és az /etc/logrotate.conf
konfigurációs fájlt olvassa be. Ez a fájl jól kommentezett, tartalmaz néhány globális opciót, és mindegyiknek rövid magyarázattal mutatja be a célját:
carol@debian:~$ sudo less /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d (...)
Látható, hogy az /etc/logrotate.d
állományban található konfigurációs fájlok is szerepelnek egyes csomagokhoz. Ezek az állományok — többnyire — helyi definíciókat tartalmaznak, és megadják, hogy mely logfájlokat kell rotálni (ne feledjük, hogy a helyi definíciók elsőbbséget élveznek a globálisakkal szemben, és a későbbi definíciók felülírják a korábbiakat). Az alábbiakban a /etc/logrotate.d/rsyslog
definíciójának egy részletét olvashatjuk:
/var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }
Mint látható, minden direktívát szóköz és/vagy egy opcionális egyenlőségjel (=
) választ el az értékétől. A postrotate
és endscript
közötti soroknak azonban önmagukban kell megjelenniük. A magyarázat a következő:
rotate 4
-
4 hétig őrzi meg a logokat.
weekly
-
Hetente rotálja a logfájlokat.
missingok
-
Ne adjon ki hibaüzenetet, ha a logfájl hiányzik; csak lépjen tovább a következőre.
notifempty
-
Ne rotálja a logot, ha az üres.
compress
-
A logfájlok tömörítése az
gzip
programmal (alapértelmezett). delaycompress
-
Az előző logfájl tömörítésének elhalasztása a következő rotációs ciklusra (csak a tömöréssel együtt használva hatékony). Ez akkor hasznos, ha egy programnak nem lehet megmondani, hogy zárja be a logfájlját, és így egy ideig még írhat az előző logfájlba.
sharedscripts
-
A prerotate és postrotate scriptekhez kapcsolódik. Annak érdekében, hogy egy scriptet ne kelljen többször végrehajtani, azaz függetlenül attól, hogy hány logfájl felel meg egy adott mintának (pl.
/var/log/mail/*
), a scriptet csak egyszer futtassa. A scriptek azonban nem fognak lefutni, ha a mintában szereplő logfájlok egyike sem igényel rotálást. Ráadásul, ha a scriptek hibával lépnek ki, a fennmaradó műveletek nem kerülnek végrehajtásra egyetlen log esetében sem. postrotate
-
Egy postrotate script kezdetének a jelzése.
invoke-rc.d rsyslog rotate > /dev/null
-
A
/bin/sh
használata ainvoke-rc.d rsyslog rotate > /dev/null
futtatásához a logrotáció után. endscript
-
Egy postrotate script végének a jelzése.
Note
|
A direktívák teljes listája és magyarázata megtalálható a |
A kernel gyűrűpuffer
Mivel a kernel számos üzenetet generál, mielőtt az rsyslogd
elérhetővé válik a rendszerindításkor, szükség van egy mechanizmusra ezen üzenetek regisztrálására. Itt jön a képbe a kernel gyűrűpuffer (kernel ring buffer). Ez egy fix méretű adatstruktúra, és — ezért — ahogy növekszik a mérete az új üzenetek miatt, a legrégebbiek eltűnnek.
A dmesg
parancs kiírja a kernel gyűrűpufferét. A puffer mérete miatt ezt a parancsot általában a grep
szövegszűrő segédprogrammal együtt használjuk. Itt láthatunk egy példát az univerzális soros busz eszközökkel kapcsolatos üzenetek keresésére:
root@debian:~# dmesg | grep "usb" [ 1.241182] usbcore: registered new interface driver usbfs [ 1.241188] usbcore: registered new interface driver hub [ 1.250968] usbcore: registered new device driver usb [ 1.339754] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001, bcdDevice= 4.19 [ 1.339756] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 (...)
Gyakorló feladatok
-
Milyen segédprogramokat/parancsokat használhatunk a következő esetekben:
Cél és logfájl Segédprogram /var/log/syslog.7.gz
olvasása/var/log/syslog
olvasásaSzűrés a
renewal
szóra a/var/log/syslog
-ban/var/log/faillog
olvasása/var/log/syslog
dinamikus olvasása -
Rendezzük át a következő logbejegyzéseket úgy, hogy azok egy érvényes, megfelelő szerkezetű logüzenet legyenek:
-
debian-server
-
sshd
-
[515]:
-
Sep 13 21:47:56
-
Server listening on 0.0.0.0 port 22
A helyes sorrend:
-
-
Milyen szabályokat kell hozzáadni az
/etc/rsyslog.conf
állományhoz a következők megvalósítása érdekében:-
Küldjük az összes,
crit
(vagy magasabb) prioritású/súlyosságú üzenetet amail
eszközből a/var/log/mail.crit
-be: -
Küldjük az összes,
alert
ésemergency
üzenetet amail
eszközből a/var/log/mail.urgent
-be: -
A
cron
ésntp
eszközökből jövő üzenetek kivételével, küldje az összes üzenetet — eszköztől és prioritástól függetlenül — a/var/log/allmessages
-be: -
Az összes szükséges beállítás megfelelő konfigurálásával küldjük el az összes üzenetet a
mail
eszközből egy távoli hostnak, amelynek IP-címe192.168.1.88
, TCP használatával és az alapértelmezett port megadásával: -
Eszköztől függetlenül, küldjük az összes
warning
prioritású üzenetet (csak awarning
prioritásúakat) a/var/log/warnings
-ba úgy, hogy megakadályozzuk a lemezre történő túlzott írást:
-
-
Tekintsük a következő részt az
/etc/logrotate.d/samba
állományból és magyarázzuk el a különböző opciókat:carol@debian:~$ sudo head -n 11 /etc/logrotate.d/samba /var/log/samba/log.smbd { weekly missingok rotate 7 postrotate [ ! -f /var/run/samba/smbd.pid ] || /etc/init.d/smbd reload > /dev/null endscript compress delaycompress notifempty }
Opció Jelentés weekly
missingok
rotate 7
postrotate
endscript
compress
delaycompress
notifyempty
Gondolkodtató feladatok
-
A “Sablonok és szűrési feltételek” szekcióban egy kifejezés-alapú szűrőt (expression-based filter) használtunk szűrési feltételként. A tulajdonság-alapú szűrő (property-based filter) másfajta szűrőtípus, amely csak az
rsyslogd
esetén létezik. Alakítsuk át a kifejezés-alapú szűrőt tulajdonság-alapú szűrőre:Kifejezés-alapú szűrő Tulajdonság-alapú szűrő if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs
-
Az
omusrmsg
egy beépítettrsyslog
modul, amely megkönnyíti a felhasználók értesítését (logüzeneteket küld a felhasználó termináljára). Írjunk egy szabályt, amely az összes eszköz összes emergency üzenetét elküldi mind aroot
, mind acarol
normál felhasználónak!
Összefoglalás
Ebben a leckében megtanultuk:
-
A rendszeradminisztráció ellátásához kritikusan fontos a logolás.
-
Az
rsyslogd
a logok rendben tartásáért felelős szolgáltató. -
Néhány szolgáltatás gondoskodik a saját logjairól.
-
A logok nagyjából rendszerlogokra és szolgáltatási/programlogokra oszthatók.
-
Számos eszköz van, ami kényelmesebbé teszi a logok olvasását :
less
,more
,zless
,zmore
,grep
,head
éstail
. -
A legtöbb logfájl egyszerű szöveges fájl, azonban van néhány bináris logfájl is.
-
A logolás szempontjából az
rsyslogd
speciális fájlokból (socketek és memóriapufferek) kapja a vonatkozó információkat, mielőtt feldolgozná azokat. -
A logok osztályozásához az
rsyslogd
az/etc/rsyslog.conf
-ban vagy az/etc/rsyslog.d/*
-ban található szabályokat használja. -
Bármely felhasználó manuálisan is beírhatja saját üzeneteit a rendszerlogba a
logger
segédprogrammal. -
Az
rsyslog
lehetővé teszi, hogy az összes IP-hálózati logot egy központi log-szerveren tartsa. -
A logfájlok dinamikus formázásához hasznosak lehetnek a sablonok.
-
A logrotációnak két célja van: megakadályozni, hogy a régi logok túl sok helyet foglaljanak a lemezen, és a konzultációs logok kezelhetővé váljanak.
Válaszok a gyakorló feladatokra
-
Milyen segédprogramokat/parancsokat használhatunk a következő esetekben:
Cél és logfájl Segédprogram /var/log/syslog.7.gz
olvasásazmore
vagyzless
/var/log/syslog
olvasásamore
vagyless
Szűrés a
renewal
szóra a/var/log/syslog
-bangrep
/var/log/faillog
olvasásafaillog -a
/var/log/syslog
dinamikus olvasásatail -f
-
Rendezzük át a következő logbejegyzéseket úgy, hogy azok egy érvényes, megfelelő szerkezetű logüzenet legyenek:
-
debian-server
-
sshd
-
[515]:
-
Sep 13 21:47:56
-
Server listening on 0.0.0.0 port 22
A helyes sorrend:
Sep 13 21:47:56 debian-server sshd[515]: Server listening on 0.0.0.0 port 22
-
-
Milyen szabályokat kell hozzáadni az
/etc/rsyslog.conf
állományhoz a következők megvalósítása érdekében:-
Küldjük az összes,
crit
(vagy magasabb) prioritású/súlyosságú üzenetet amail
eszközből a/var/log/mail.crit
-be:mail.crit /var/log/mail.crit
-
Küldjük az összes,
alert
ésemergency
üzenetet amail
eszközből a/var/log/mail.urgent
-be:mail.alert /var/log/mail.urgent
-
A
cron
ésntp
eszközökből jövő üzenetek kivételével, küldje az összes üzenetet — eszköztől és prioritástól függetlenül — a/var/log/allmessages
-be:*.*;cron.none;ntp.none /var/log/allmessages
-
Az összes szükséges beállítás megfelelő konfigurálásával küldjük el az összes üzenetet a
mail
eszközből egy távoli hostnak, amelynek IP-címe192.168.1.88
, TCP használatával és az alapértelmezett port megadásával:mail.* @@192.168.1.88:514
-
Eszköztől függetlenül, küldjük az összes
warning
prioritású üzenetet (csak awarning
prioritásúakat) a/var/log/warnings
-ba úgy, hogy megakadályozzuk a lemezre történő túlzott írást:*.=warning -/var/log/warnings
-
-
Tekintsük a következő részt az
/etc/logrotate.d/samba
állományból és magyarázzuk el a különböző opciókat:carol@debian:~$ sudo head -n 11 /etc/logrotate.d/samba /var/log/samba/log.smbd { weekly missingok rotate 7 postrotate [ ! -f /var/run/samba/smbd.pid ] || /etc/init.d/smbd reload > /dev/null endscript compress delaycompress notifempty }
Opció Jelentés weekly
Logrotáció hetente.
missingok
Ne legyen hibaüzenet, ha a log hiányzik, csak lépjen a következőre.
rotate 7
Tartson meg 7 heti logot.
postrotate
Futtassa a következő sorban található scriptet a logrotáció után.
endscript
Jelezze a postrotate script végét.
compress
Tömörítse a fájlokat a
gzip
-pel.delaycompress
Halassza el a tömörítést a következő rotációs ciklusra a
compress
kombinálásával.notifyempty
Ne rotálja a logot, ha üres.
Válaszok a gondolkodtató feladatokra
-
A “Sablonok és szűrési feltételek” szekcióban egy kifejezés-alapú szűrőt (expression-based filter) használtunk szűrési feltételként. A tulajdonság-alapú szűrő (property-based filter) másfajta szűrőtípus, amely csak az
rsyslogd
esetén létezik. Alakítsuk át a kifejezés-alapú szűrőt tulajdonság-alapú szűrőre:Kifejezés-alapú szűrő Tulajdonság-alapú szűrő if $FROMHOST-IP=='192.168.1.4' then ?RemoteLogs
:fromhost-ip, isequal, "192.168.1.4" ?RemoteLogs
-
Az
omusrmsg
egy beépítettrsyslog
modul, amely megkönnyíti a felhasználók értesítését (logüzeneteket küld a felhasználó termináljára). Írjunk egy szabályt, amely az összes eszköz összes emergency üzenetét elküldi mind aroot
, mind acarol
normál felhasználónak!*.emerg :omusrmsg:root,carol