„Ubuntu szerver logolás (Fossa)” változatai közötti eltérés

Innen: AdminWiki
Ugrás a navigációhoz Ugrás a kereséshez
 
(11 közbenső módosítás ugyanattól a felhasználótól nincs mutatva)
8. sor: 8. sor:
* a (közel) valós idejű értesítésekért felelős ''logcheck'' átalakítása úgy, hogy ne csak natív szöveges állományokat, hanem a ''journalctl'' segítségével(?) a ''journal''-ből kinyert adatokat is tudjon elemezni. Léteznek erre a célra a ''logcheck''-től független ''parser'' projektek is (ld. pl. [https://pypi.python.org/pypi/journalwatch/ itt]), illetve valószínűnek tartom, hogy a valós idejű értesítés külön eszköz nélkül, magában a ''journal'' kezelőben is definiálható(? lesz?), de ezek az eszközök és beállítások az Ubuntu terjesztésnek (még) nem részei.
* a (közel) valós idejű értesítésekért felelős ''logcheck'' átalakítása úgy, hogy ne csak natív szöveges állományokat, hanem a ''journalctl'' segítségével(?) a ''journal''-ből kinyert adatokat is tudjon elemezni. Léteznek erre a célra a ''logcheck''-től független ''parser'' projektek is (ld. pl. [https://pypi.python.org/pypi/journalwatch/ itt]), illetve valószínűnek tartom, hogy a valós idejű értesítés külön eszköz nélkül, magában a ''journal'' kezelőben is definiálható(? lesz?), de ezek az eszközök és beállítások az Ubuntu terjesztésnek (még) nem részei.
Amíg a fentiek problémát jelentenek, célszerűbbnek tűnik a szöveges naplózás megtartása, kihasználva azt, hogy a ''systemd'' a telepített, hagyományos ''syslogd'' (''rsyslogd'', ''syslog-ng'', stb.) számára képes az általa kezelt eseményeket feladni, vagyis a ''journaling'' a rendszernapló szolgáltatás számára (közel) transzparens lehet.
Amíg a fentiek problémát jelentenek, célszerűbbnek tűnik a szöveges naplózás megtartása, kihasználva azt, hogy a ''systemd'' a telepített, hagyományos ''syslogd'' (''rsyslogd'', ''syslog-ng'', stb.) számára képes az általa kezelt eseményeket feladni, vagyis a ''journaling'' a rendszernapló szolgáltatás számára (közel) transzparens lehet.
A naplóbejegyzéseket adatként kezelve, azok kiértékelése (pl. adatbázis-lekérdezésekkel) sokkal hatékonyabb, mint lenne szöveges kezelés esetén (olvasás, parse-olás). Több gépes környezetben érdemes egy külön egységet dedikálni (naplószerver), amely megkapja az összes gép figyelt gép naplóadatait, és ezeket egységben képes kezelni. Ezen a gépen futtathatóak automatikus logelemző eszközök, riasztáskezelő vagy automatikus beavatkozó megoldások is, amelyeket nem feltétlenül érdemes minden figyelt gépre külön-külön telepíteni (pl. erőforrás-igényük miatt).
Ebben a leírásban arra az esetre javaslok megoldást, amikor nincsen naplószerver, illetve strukturált adatelemzés (pl. mert standalone gépet telepítünk). Ilyenkor - jobb híján - a szöveges napló szövegét helyben próbáljuk kielemeztetni valamilyen mintakereső eszközzel (a ''logcheck'' reguláris kifejezéseket használ a vélhetőleg fontos bejegyzések kiválogatására), azonban ez a módszer ''by design'' kevésbé hatékony. A naplóbejegyzések érdemi része ugyanis szabad szöveg, amelyet a ''maintainer''-ek szabadon bővíthetnek vagy módosíthatnak, ráadásul a nyelvi beállítások is befolyásolhatják ezeket. Semmi sem kötelezi a ''maintainer''-t arra, hogy közzétegye programja lehetséges naplóüzeneteinek szövegét, pláne nem arra, hogy megfelelő ''logcheck'' szabályokat is készítsen hozzájuk. Úgyhogy a ''logcheck'' használata során viszonylag gyakran leszünk kénytelenek finomhangolni a szabályokat, hogy továbbra is értesüljünk a lényeges eseményekről, de ne árasszanak el bennünket felesleges riasztások.


==Telepítés==
==Telepítés==
15. sor: 19. sor:


Annak érdekében, hogy a ''/etc/syslog-ng/conf.d''-ben később teljes értékű ''overlay'' állományokat helyezhessünk el, módosítsuk a ''/etc/syslog-ng.conf'' állományt, és helyezzük át az inklúziót a fájl végéről a ''log'' szekció elé:
Annak érdekében, hogy a ''/etc/syslog-ng/conf.d''-ben később teljes értékű ''overlay'' állományokat helyezhessünk el, módosítsuk a ''/etc/syslog-ng.conf'' állományt, és helyezzük át az inklúziót a fájl végéről a ''log'' szekció elé:
<pre>-rw-r--r-- root root syslog-ng.conf
<pre>-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf


[...]
[...]
39. sor: 43. sor:


==Logcheck==
==Logcheck==
A ''logcheck'' lényegében egy ''cron''-ból futtatott script, amely az utolsó futtatása óta készült logrészleteket összehasonlítja megadott reguláris kifejezésekkel, és az egyezéseket kigyűjtve (az előírtak figyelmen kívül hagyásával), email-ben elküldi. Telepítés után a ''logcheck.conf''-ot teljesen cseréljük le:
A ''logcheck'' lényegében egy ''cron''-ból futtatott script, amely az utolsó futtatása óta készült logrészleteket összehasonlítja megadott reguláris kifejezésekkel, és az egyezéseket kigyűjtve (az előírtak figyelmen kívül hagyásával), email-ben elküldi.  
 
===Beállítások===
Telepítés után a ''logcheck.conf''-ot teljesen cseréljük le:
<pre>mv /etc/logcheck/logcheck.conf /etc/logcheck/logcheck.conf.bak
<pre>mv /etc/logcheck/logcheck.conf /etc/logcheck/logcheck.conf.bak
touch /etc/logcheck/logcheck.conf; chown root:logcheck /etc/logcheck/logcheck.conf; chmod 640 /etc/logcheck/logcheck.conf
touch /etc/logcheck/logcheck.conf; chown root:logcheck /etc/logcheck/logcheck.conf; chmod 640 /etc/logcheck/logcheck.conf
83. sor: 90. sor:
Végül szigorítsuk meg a jelenleg eléggé liberális jogosultságokat a beállítások könyvtárában:
Végül szigorítsuk meg a jelenleg eléggé liberális jogosultságokat a beállítások könyvtárában:
<pre>chmod -R o-rwx /etc/logcheck</pre>
<pre>chmod -R o-rwx /etc/logcheck</pre>
===Figyelmen kívül hagyandók beállítása===
===Szabályok===
Néhány logbejegyzést érdemes figyelmen kívül hagyatni, az ezekre passzoló reguláris kifejezéseket a ''/etc/logcheck/ignore.d.server'' alatt egy-egy kivétel állományba célszerű felvenni.
A figyelmen kívül hagyandó logbejegyzésekre passzoló reguláris kifejezéseket a ''/etc/logcheck/ignore.d.server'' alatti kivétel állományok tartalmazzák, míg a mindenképpen jelentendő eseményeket a ''etc/logcheck/cracking.d'' vagy ''/etc/logcheck/violations.d'' állományokban lehet definiálni. A ''logcheck'' telepítésekor kapunk egy szabálykészletet, amely azonban még mindig nagyon sok, számunkra érdektelen logbejegyzést átenged. További szabályokért [{{SERVER}}/download/ töltsük le] a legfrissebb ''logcheck-rules-fix'' tarballt, és a könyvtárszerkezet megtartásával csomagoljuk ki.  
====Kernel bejegyzések====
<pre>touch /etc/logcheck/ignore.d.server/kernel-fix
chown root:logcheck /etc/logcheck/ignore.d.server/kernel-fix
chmod 640 /etc/logcheck/ignore.d.server/kernel-fix
mcedit /etc/logcheck/ignore.d.server/kernel-fix</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/ignore.d.server/kernel-fix
 
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? perf: interrupt took too long .*$
</pre>
 
====''syslog-ng'' bejegyzések====
<pre>touch /etc/logcheck/ignore.d.server/syslog-ng-fix
chown root:logcheck /etc/logcheck/ignore.d.server/syslog-ng-fix
chmod 640 /etc/logcheck/ignore.d.server/syslog-ng-fix
mcedit /etc/logcheck/ignore.d.server/syslog-ng-fix</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/syslog-ng-fix
 
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ syslog-ng\[[[:digit:]]+\]: Log statistics
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ syslog-ng\[[[:digit:]]+\]: WARNING: Default value changed for the prefix\(\) option of systemd-journal source in syslog-ng
</pre>
 
====''systemd'' bejegyzések====
<small>Bővebben ld. [https://wiki.debian.org/systemd/logcheck itt].</small>
<pre>touch /etc/logcheck/ignore.d.server/systemd-fix
chown root:logcheck /etc/logcheck/ignore.d.server/systemd-fix
chmod 640 /etc/logcheck/ignore.d.server/systemd-fix
mcedit /etc/logcheck/ignore.d.server/systemd-fix</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/ignore.d.server/systemd-fix
 
# https://wiki.debian.org/systemd/logcheck
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Starting|Started) Session [[:digit:]]+ of user [^[:space:]]+\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Reexecuting|Reloading)\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: systemd [[:digit:]]+ running in system mode. \((\+[[:alnum:]]+ ?)+\)$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Expecting device [^[:space:]]+\.device\.\.\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Start(ing|ed) Cleanup of Temporary Directories\.+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Start(ing|ed) Run anacron jobs\.+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-logind\[[[:digit:]]+\]: New session [[:alnum:]]+ of user [^[:space:]]+\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-logind\[[[:digit:]]+\]: Removed session [[:alnum:]]+\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Stopping|Stopped target|Reached target) (Shutdown|Timers|Default|Basic System|Paths|Sockets)\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Starting (Shutdown|Exit the Session\.\.|Timers|Default|Basic System|Paths|Sockets)\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Received SIGRTMIN\+24 from PID [[:digit:]]+ \(kill\)\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Startup finished in [[:digit:]]+ms\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Start|Stopp)(ing|ed) User Manager for UID [0-9]+\.+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Starting|Created|Stopping|Removed)( slice)? (user|system)-[\\[:alnum:]]+\.slice\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Time has been changed$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd(\[[[:digit:]]+\])?: pam_unix\(systemd-user:session\): session (opened|closed) for user [^[:space:]]+( by \(uid=[0-9]+\))?$
# logrotate
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Reload(ing|ed) LSB: .*\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: Reload(ing|ed) System Logger Daemon\.$
# systemd-logind
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-logind\[[[:digit:]]+\]: New session [[:alnum:]]+ of user [^ ]+\.*$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-logind\[[[:digit:]]+\]: Removed session [[:alnum:]]+\.$
# systemd-resolved
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-resolved\[[[:digit:]]+\]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001
# contributed
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: (Starting|Created|Stopping|Removed)( slice)? User Slice of [[:alnum:]]+\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd\[[[:digit:]]+\]: ((Start|Listen)ing|Closed) (on )?(GnuPG cryptographic agent).*$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd(\[[[:digit:]]+\])?: apt-daily(-upgrade)?\.timer: Adding ([. [:alnum:]])+ random time\.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ systemd-timesyncd\[[[:digit:]]+\]: Synchronized to time server .*\.$
</pre>
 
====''sudo'' bejegyzések====
<pre>touch /etc/logcheck/ignore.d.server/sudo-fix
chown root:logcheck /etc/logcheck/ignore.d.server/sudo-fix
chmod 640 /etc/logcheck/ignore.d.server/sudo-fix
mcedit /etc/logcheck/ignore.d.server/sudo-fix</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/sudo-fix
 
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sudo\[[[:digit:]]+\]: pam_[[:alnum:]]+\(sudo:session\): session closed for user [[:alnum:]-]+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sudo\[[[:digit:]]+\]: pam_[[:alnum:]]+\(sudo:session\): session opened for user [[:alnum:]-]+ by ([[:alnum:]-]+)?\(uid=[0-9]+\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sudo\[[[:digit:]]+\]:[[:space:]]+[_[:alnum:].-]+ : TTY=(unknown|(pts/|tty|vc/)[[:digit:]]+) ; PWD=[^;]+ ; USER=[._[:alnum:]-]+ ; COMMAND=(/(usr|etc|bin|sbin)/|sudoedit ).*$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sudo\[[[:digit:]]+\]:[[:space:]]+[_[:alnum:].-]+ : \(command continued\).*$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sudo\[[[:digit:]]+\]: pam_unix\(sudo:auth\): Couldn't open \/etc\/securetty: No such file or directory$
</pre>
 
====''su'' bejegyzések====
Mivel a ''maintainer'' (elég szigorú) ''violations.d'' szabályokat adott meg, a szokásostól eltérően a kivételeket a ''violations.ignore.d'' alatt kell elkönyvelnünk - itt a fájlnév is számít, ezért a  meglévő állomány kiegészítésével:
<pre>-rw-r----- root logcheck /etc/logcheck/violations.ignore.d/logcheck-su
 
[...]
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ su\[[0-9]+\]: pam_[[:alnum:]]+\(su:session\): Cannot create session: Already running in a session$
</pre>
 
====''sshd failures''====
<small>''Opcionálisan'', ha nem érdekelnek a gyakori, random próbálkozások.</small>
<pre>touch /etc/logcheck/ignore.d.server/ssh-failures
chown root:logcheck /etc/logcheck/ignore.d.server/ssh-failures
chmod 640 /etc/logcheck/ignore.d.server/ssh-failures
mcedit /etc/logcheck/ignore.d.server/ssh-failures</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/ignore.d.server/ssh-failures
 
# Originally from https://raw.githubusercontent.com/ties/logcheck-extrarules/master/ignore.d.server/local-ssh
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: warning: /etc/hosts\.(allow|deny), line [[:digit:]]+: can't verify hostname: getaddrinfo\([._[:alnum:]-]+, AF_INET\) failed$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: warning: /etc/hosts\.(allow|deny), line [[:digit:]]+: host name/(name|address) mismatch: [._[:alnum:]-]+ != [._[:alnum:]-]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: warning: can\'t get client address: Connection reset by peer$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Did not receive identification string from
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Could not write ident string to
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: Write failed: Broken pipe$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: Write failed: Connection (timed out|reset by peer)$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: Write failed: Connection reset by peer \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: error: PAM: User not known to the underlying authentication module for i(llegal|nvalid) user[-_.[:alnum:] ]+ from ([:.[:xdigit:]]+|UNKNOWN|[-_.[:alnum:]]+)$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: error: PAM: Authentication failure for [^[:space:]]+ from ([:.[:xdigit:]]+|UNKNOWN|[-_.[:alnum:]]+)( port [[:digit:]]{1,5})?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: I(llegal|nvalid) user[-_.[:alnum:] ]+ from ([:.[:xdigit:]]+|UNKNOWN)( port [[:digit:]]{1,5})?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Failed (keyboard-interactive/pam|password|none) for (i(llegal|nvalid) user )?[-_.[:alnum:] ]+ from ([:.[:xdigit:]]+|UNKNOWN|[-_.[:alnum:]]+) port [[:digit:]]{1,5} ssh2?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: (\(pam_unix\)|pam_unix\(sshd?:auth\):) authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=[^[:space:]]+([[:space:]]+user=[^[:space:]]+)?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: (\(pam_unix\)|pam_unix\(sshd?:auth\):) check pass; user unknown$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: recv_rexec_state: ssh_msg_recv failed$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: input_userauth_request: invalid user[-_.[:alnum:] ]+ \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: Read from socket failed: Connection reset by peer \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: (error: )?(Received disconnect|Disconnected) from [ [:alnum:].:]+ ([ [:alnum:]:,])*\[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Connection (closed|reset) by [[:alnum:].: ]+ (port [[:digit:]]{1,5} )?\[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: ssh_dispatch_run_fatal: Connection from [[:alnum:].:]+ (port [[:digit:]]{1,5})?: (Broken pipe|DH GEX group out of range) \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: packet_write_wait: Connection from [[:alnum:].:]+ (port [[:digit:]]{1,5})?: (Broken pipe) \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Disconnecting: Change of username or service not allowed:
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Disconnecting: Packet corrupt
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Disconnecting: Too many authentication failures
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: error: maximum authentication attempts exceeded
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: PAM [[:digit:]]+ more authentication failure(s)?;
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: PAM service\(sshd\) ignoring max retries; [[:digit:]]{1,2} > [[:digit:]]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: subsystem(s)? request for sftp by user [-._[:alnum:] ]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Corrupted MAC on input\. \[preauth\]$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: no matching cipher found:
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: fatal: Unable to negotiate a key exchange method
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Unable to negotiate with [[:alnum:].:]+ (port [[:digit:]]{1,5})?: no matching (key exchange method|host key type|cipher) found
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Protocol major versions differ for [[:alnum:].:]+ (port [[:digit:]]{1,5})?:
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Bad protocol version identification
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Bad packet length
^\w{3} [ :[:digit:]]{11} ([._[:alnum:]-]+)? sshd\[[[:digit:]]+\]: last message repeated [[:digit:]]+ times$
</pre>
''Megjegyzés:'' Néhány kiadás óta nincs az ''ignore'' szabálykészletben (azaz jelentendőnek számít) a sima (1024 bites) DSA kulccsal történő bejelentkezés. Nézetem szerint ez helyes, és csak akkor vegyük fel figyelmen kívül hagyandónak, ha nincs lehetőségünk az elavult DSA kulcsokat RSA-ra cseréltetni. A szükséges ''ignore'' szabály:
<pre># Ignoring DSA public key authentication
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ sshd\[[[:digit:]]+\]: Accepted publickey for [^[:space:]]+ from [^[:space:]]+ port [[:digit:]]+( (ssh|ssh2))?(: DSA ([[:xdigit:]]{2}:){15}[[:xdigit:]]{2})?$
</pre>


====Speciális esetek====
Az ebben szereplő szabályok (''*-fix'' állományok) közül az alábbiakra csak speciális esetekben van szükség (de rutinszerű meghagyásuk nem hiba):
<small>Az alábbi javításokra csak speciális esetekben van szükség, de rutinszerű felvételük sem hiba.</small>
* ''speciálisan'' DHCP-vel kiszolgált hálózaton lévő gép esetén az ''automatic private IP address'' (169.254.0.0/16 B osztály) alhálózat forgalma
<pre>touch /etc/logcheck/ignore.d.server/kernel-apipa
chown root:logcheck /etc/logcheck/ignore.d.server/kernel-apipa
chmod 640 /etc/logcheck/ignore.d.server/kernel-apipa
mcedit /etc/logcheck/ignore.d.server/kernel-apipa</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/ignore.d.server/kernel-apipa


^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? martian source 169.254
* ''kernel-apipa-fix'' - DHCP-vel kiszolgált hálózaton lévő gép szerver esetén az ''automatic private IP address'' (169.254.0.0/16 B osztály) alhálózat forgalmát nem jelenti;
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? martian destination 169.254
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? __ratelimit:
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? net_ratelimit:</pre>
* ''speciálisan'' egy osztott hálózaton lévő gép esetén "marslakó" ''(martian source/destination)'' broadcast-ok
<pre>touch /etc/logcheck/ignore.d.server/kernel-martians
chown root:logcheck /etc/logcheck/ignore.d.server/kernel-martians
chmod 640 /etc/logcheck/ignore.d.server/kernel-martians
mcedit /etc/logcheck/ignore.d.server/kernel-martians</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/ignore.d.server/kernel-martians


^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? martian source 255.255.255.255
* ''kernel-martians-fix'' - Osztott hálózaton lévő gép esetén "marslakó" ''(martian source/destination)'' broadcast-okat nem jelenti;
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? martian destination 0.0.0.0
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? __ratelimit:
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ kernel:( \[ *[[:digit:]]+\.[[:digit:]]+\])? net_ratelimit:</pre>
* ''speciálisan'' DHCP szerver esetén nem IP-vel hanem hostnévvel hivatkozás
<pre>touch /etc/logcheck/ignore.d.server/dhcp-fix
chown root:logcheck /etc/logcheck/ignore.d.server/dhcp-fix
chmod 640 /etc/logcheck/ignore.d.server/dhcp-fix
mcedit /etc/logcheck/ignore.d.server/dhcp-fix</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/dhcp-fix


^\w{3} [ :0-9]{11} [._[:alnum:]-]+ dhcpd: uid lease [.0-9]{7,15} for client [:[:xdigit:]]+ is duplicate on [._[:alnum:]-]+$</pre>
* ''dhcp-fix'' - DHCP szerver esetén a nem IP-vel hanem hostnévvel hivatkozást nem jelenti.


===Mindenképpen jelentendők beállítása===
Bármely szabályállományt szabadon szerkeszthetjük, illetve módosíthatjuk, azonban érdemes saját szabályállományokat használni egy esetleges jövőbeni csomagfrissítéssel ütközés elkerülése érdekében. A szabálymódosítások a ''logcheck'' következő lefutásakor azonnal érvényesülnek (semmit nem kell újraindítani).
Azokat a bejegyzéseket, amelyeket a logcheck alapértelmezésben figyelmen kívül hagy, de mi szeretnénk, ha jelentené, a ''/etc/logcheck/cracking.d'' vagy ''/etc/logcheck/violations.d'' alatt felvett, a bejegyzésre passzoló reguláris kifejezést tartalmazó állományba kell beírni.
* belépés SSH-val és jelszavas authentikációval (házirend szerint a kulccsal történő authentikáció az elfogadott):
<pre>touch /etc/logcheck/violations.d/ssh
chown root:logcheck /etc/logcheck/violations.d/ssh; chmod 640 /etc/logcheck/violations.d/ssh
mcedit /etc/logcheck/violations.d/ssh</pre>
<pre>-rw-r----- root logcheck /etc/logcheck/violations.d/ssh


^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Accepted password for</pre>
A fenti beállítások a logcheck következő lefutásakor azonnal érvényesülnek.
===Tesztelési tippek===
===Tesztelési tippek===
Saját szabályok teszteléséhez használható tippek (innen: [https://zeldor.biz/2010/08/configure-logcheck/ Configure logcheck] - thx!):
Saját szabályok teszteléséhez használható tippek (innen: [https://zeldor.biz/2010/08/configure-logcheck/ Configure logcheck] - thx!):
268. sor: 109. sor:
* A logcheck manuális indítása:
* A logcheck manuális indítása:
<pre>su -s /bin/bash -c "/usr/sbin/logcheck" logcheck</pre>
<pre>su -s /bin/bash -c "/usr/sbin/logcheck" logcheck</pre>
==Irodalom==
==Irodalom==

A lap jelenlegi, 2020. május 19., 12:46-kori változata

Az Ubuntu Fossa egy systemd System and Service Manager alapú disztribúció, amely a rendszereseményeket egy bináris adatbázisban (journal) rögzíti és ennek feldolgozására számos lehetőséget ad. Noha valószínűleg sokkal hatékonyabb lenne a releváns eseményeket magából az adatbázisból kiválogattatni, ebben a leírásban kihasználjuk, hogy az eseményeket a systemd képes a syslog-nak feladni, így a naplózást a régi megközelítésnek megfelelően a syslog-ng-vel végeztetjük, és a logokat a logcheck-kel figyeljük. Nem használunk naplószervert, az értesítéseket email-ben küldjük el.

Elvi megfontolások

Megjegyzés: 2017-es szöveg, ellenőrizni: TODO!

A systemd naplózó szolgáltatása elvileg feleslegessé teszi a hagyományos, szövegállományokra bontott naplók kezelését. A systemd journal jól strukturált, tömörített, tagelt és indexelt bináris adatbázis, melynek kezelésére hatékony eszköz áll rendelkezésre (journalctl). A szöveges naplózásról erre történő áttéréshez azonban - szerintem - az alábbi fejlesztésekre lenne szükség (TODO!):

  • hatékony együttműködés a sok naplóbejegyzést termelő, eleddig fájlokba dolgozó szolgáltatások (pl. Apache webszerver) és a systemd naplózó szolgáltatása között. Lehetséges, hogy a journaling nagy terhelés esetén sem számottevő jelentős többlet erőforrást, ezt azonban meg kellene vizsgálni.
  • a hagyományos logrotate konfigurációkban megfogalmazotthoz hasonló policy, amely a különféle jellegű naplóesemények megőrzésének idejét szabályozza. Jelenleg a journal egyszerűen perzisztenssé tehető (alapértelmezésben a /run hierarchiában keletkezik, így minden rendszerindításkor kiürül), de számára csak egy általános méretkorlát van beállítva. Nyilvánvaló, hogy a méretkorláton belül különböző mennyiségű (visszamenőlegességű) tűzfal- webszerver-, smtp-, stb. log megtartása lenne szükséges, és ez biztosan be is állítható, azonban ezek a beállítások az Ubuntu terjesztésnek (még) nem részei.
  • a (közel) valós idejű értesítésekért felelős logcheck átalakítása úgy, hogy ne csak natív szöveges állományokat, hanem a journalctl segítségével(?) a journal-ből kinyert adatokat is tudjon elemezni. Léteznek erre a célra a logcheck-től független parser projektek is (ld. pl. itt), illetve valószínűnek tartom, hogy a valós idejű értesítés külön eszköz nélkül, magában a journal kezelőben is definiálható(? lesz?), de ezek az eszközök és beállítások az Ubuntu terjesztésnek (még) nem részei.

Amíg a fentiek problémát jelentenek, célszerűbbnek tűnik a szöveges naplózás megtartása, kihasználva azt, hogy a systemd a telepített, hagyományos syslogd (rsyslogd, syslog-ng, stb.) számára képes az általa kezelt eseményeket feladni, vagyis a journaling a rendszernapló szolgáltatás számára (közel) transzparens lehet.

A naplóbejegyzéseket adatként kezelve, azok kiértékelése (pl. adatbázis-lekérdezésekkel) sokkal hatékonyabb, mint lenne szöveges kezelés esetén (olvasás, parse-olás). Több gépes környezetben érdemes egy külön egységet dedikálni (naplószerver), amely megkapja az összes gép figyelt gép naplóadatait, és ezeket egységben képes kezelni. Ezen a gépen futtathatóak automatikus logelemző eszközök, riasztáskezelő vagy automatikus beavatkozó megoldások is, amelyeket nem feltétlenül érdemes minden figyelt gépre külön-külön telepíteni (pl. erőforrás-igényük miatt).

Ebben a leírásban arra az esetre javaslok megoldást, amikor nincsen naplószerver, illetve strukturált adatelemzés (pl. mert standalone gépet telepítünk). Ilyenkor - jobb híján - a szöveges napló szövegét helyben próbáljuk kielemeztetni valamilyen mintakereső eszközzel (a logcheck reguláris kifejezéseket használ a vélhetőleg fontos bejegyzések kiválogatására), azonban ez a módszer by design kevésbé hatékony. A naplóbejegyzések érdemi része ugyanis szabad szöveg, amelyet a maintainer-ek szabadon bővíthetnek vagy módosíthatnak, ráadásul a nyelvi beállítások is befolyásolhatják ezeket. Semmi sem kötelezi a maintainer-t arra, hogy közzétegye programja lehetséges naplóüzeneteinek szövegét, pláne nem arra, hogy megfelelő logcheck szabályokat is készítsen hozzájuk. Úgyhogy a logcheck használata során viszonylag gyakran leszünk kénytelenek finomhangolni a szabályokat, hogy továbbra is értesüljünk a lényeges eseményekről, de ne árasszanak el bennünket felesleges riasztások.

Telepítés

A szükséges komponenseket a szokásos módon telepítjük:

apt install syslog-ng logcheck logcheck-database # +: dependens könyvtárak (sok!) és Python (ha még nincs telepítve)

A fenti művelet eltávolítja az alapértelmezett rsyslog-ot, helyette a syslog-ng lesz az alapértelmezett naplózó démon. Az Ubuntu Fossa-ban a journal feladása alapértelmezetten be van állítva, így a syslog-ng a korábbi Ubuntu terjesztésekkel analóg módon működik.

Annak érdekében, hogy a /etc/syslog-ng/conf.d-ben később teljes értékű overlay állományokat helyezhessünk el, módosítsuk a /etc/syslog-ng.conf állományt, és helyezzük át az inklúziót a fájl végéről a log szekció elé:

-rw-r--r-- root root /etc/syslog-ng/syslog-ng.conf

[...]
###
# Include all config files in /etc/syslog-ng/conf.d/
###
@include "/etc/syslog-ng/conf.d/*.conf"

########################
# Log paths
########################
[...]

Logrotate módosítások

A rotáláskor a logrotate megkísérel lefuttatni egy scriptet a /tmp-ben. Mivel a biztonsági házirendünk szerint a /tmp nem lesz futtatható, ez hibát okoz. Ezért a root nevében lefutó logrotate számára a /etc alatt létrehozunk egy logrotate.tmp könyvtárat:

mkdir /etc/logrotate.tmp

és a logrotate számára előírjuk ennek használatát:

-rwxr-xr-x root root /etc/cron.daily/logrotate

[...]
export TMPDIR=/etc/logrotate.tmp
[...]

Logcheck

A logcheck lényegében egy cron-ból futtatott script, amely az utolsó futtatása óta készült logrészleteket összehasonlítja megadott reguláris kifejezésekkel, és az egyezéseket kigyűjtve (az előírtak figyelmen kívül hagyásával), email-ben elküldi.

Beállítások

Telepítés után a logcheck.conf-ot teljesen cseréljük le:

mv /etc/logcheck/logcheck.conf /etc/logcheck/logcheck.conf.bak
touch /etc/logcheck/logcheck.conf; chown root:logcheck /etc/logcheck/logcheck.conf; chmod 640 /etc/logcheck/logcheck.conf
mcedit /etc/logcheck/logcheck.conf

Az új állomány beállításai:

-rw-r----- root logcheck /etc/logcheck/logcheck.conf

# Logcheck custom settings

# Filtering rules from ignore.d.server
REPORTLEVEL="server"

# Mail goes to the local administrator
SENDMAILTO="root"

# The hostname in the subject of generated mails should be fully qualified
FQDN=1

# Controls [logcheck] prefix on Subject: lines
ADDTAG="yes"

Egy új (.logfiles kiterjesztésű!), overlay állományban írjuk elő, hogy az alapértelmezetteken kívül a logcheck figyelje a kern.log-ot és a messages-t is:

touch /etc/logcheck/logcheck.logfiles.d/additional.logfiles
chown root:logcheck /etc/logcheck/logcheck.logfiles.d/additional.logfiles
chmod 640 /etc/logcheck/logcheck.logfiles.d/additional.logfiles
mcedit /etc/logcheck/logcheck.logfiles.d/additional.logfiles
-rw-r----- root logcheck /etc/logcheck/logcheck.logfiles.d/additional.logfiles

/var/log/kern.log
/var/log/messages

Reboot-kor, és normális üzemben 5 percenként fusson le az ellenőrzés (idő módosítása):

-rw-r--r-- root root /etc/cron.d/logcheck

# /etc/cron.d/logcheck: crontab entries for the logcheck package
                                                                                                                                  
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
                                                                                                                                  
@reboot         logcheck    if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck -R; fi
0-59/5 * * * *  logcheck    if [ -x /usr/sbin/logcheck ]; then nice -n10 /usr/sbin/logcheck; fi
                                                                                                                                  
# EOF

Megjegyzés: a maintainer óránként, vagy még ritkábban futtatja a logcheck-et. Ha az erőforrások megengedik, talán érdemes ezt gyakoribbra venni egy esetleges illegális távoli bejelentkezés vagy más biztonsági esemény korai jelzése érdekében. Ez kevesebb időt hagy a behatolónak arra is, hogy root jogot szerezve leállítsa a riasztást.

Végül szigorítsuk meg a jelenleg eléggé liberális jogosultságokat a beállítások könyvtárában:

chmod -R o-rwx /etc/logcheck

Szabályok

A figyelmen kívül hagyandó logbejegyzésekre passzoló reguláris kifejezéseket a /etc/logcheck/ignore.d.server alatti kivétel állományok tartalmazzák, míg a mindenképpen jelentendő eseményeket a etc/logcheck/cracking.d vagy /etc/logcheck/violations.d állományokban lehet definiálni. A logcheck telepítésekor kapunk egy szabálykészletet, amely azonban még mindig nagyon sok, számunkra érdektelen logbejegyzést átenged. További szabályokért töltsük le a legfrissebb logcheck-rules-fix tarballt, és a könyvtárszerkezet megtartásával csomagoljuk ki.

Az ebben szereplő szabályok (*-fix állományok) közül az alábbiakra csak speciális esetekben van szükség (de rutinszerű meghagyásuk nem hiba):

  • kernel-apipa-fix - DHCP-vel kiszolgált hálózaton lévő gép szerver esetén az automatic private IP address (169.254.0.0/16 B osztály) alhálózat forgalmát nem jelenti;
  • kernel-martians-fix - Osztott hálózaton lévő gép esetén "marslakó" (martian source/destination) broadcast-okat nem jelenti;
  • dhcp-fix - DHCP szerver esetén a nem IP-vel hanem hostnévvel hivatkozást nem jelenti.

Bármely szabályállományt szabadon szerkeszthetjük, illetve módosíthatjuk, azonban érdemes saját szabályállományokat használni egy esetleges jövőbeni csomagfrissítéssel ütközés elkerülése érdekében. A szabálymódosítások a logcheck következő lefutásakor azonnal érvényesülnek (semmit nem kell újraindítani).

Tesztelési tippek

Saját szabályok teszteléséhez használható tippek (innen: Configure logcheck - thx!):

  • Nézzük meg, hogy egy szabályokat tartalmazó állomány milyen üzeneteket fog el (helyettesítsük be a tesztelendő fájlnevet!):
egrep -f /etc/logcheck/ignore.d.server/[FILE] /var/log/syslog  # illetve, amelyik naplót teszteljük
  • A logcheck manuális indítása:
su -s /bin/bash -c "/usr/sbin/logcheck" logcheck

Irodalom