Tips en Trucs 2021

Waarschuwingen op het Bureaublad

Logboeken houden bijna alles wat op een computersysteem gebeurd bij. De massa gegevens zorgen ervoor dat je belangrijke gegevens niet opmerkt. Je ziet m.a.w. door de bomen het bos niet meer.

Hulpprogramma's om relevante gegevens uit logboeken te halen zijn er in overvloed, maar je kunt dit ook eenvoudig zelf met een script maken. Je bepaalt dan zelf wat in jouw situatie relevant is.

We schrijven vandaag een script om op te zoeken of er gisteren in de loop van de dag een gebruiker werd aangemaakt. Dit script moet elke dag automatisch worden uitgevoerd en indien er iets te melden valt een bestand op het Bureaublad aanmaken met de melding(en).

Laten we als test eerst even een gebruiker aanmaken en terug verwijderen:

dany@pindabook:~> sudo useradd -m "PindaNet"
[sudo] wachtwoord voor root:
dany@pindabook:~> sudo userdel -r "PindaNet"
no crontab for PindaNet

In openSUSE Leap 15.2 worden de meeste gegevens verzameld in het logbestand /var/log/messages. Dit bestand kan je raadplegen met de opdracht:

dany@pindabook:~> sudo cat /var/log/messages
...
2021-05-01T15:20:20.428116+02:00 pindabook sudo:     dany : TTY=pts/1 ; PWD=/home/dany ; USER=root ; COMMAND=/usr/sbin/useradd -m PindaNet
2021-05-01T15:20:20.430158+02:00 pindabook sudo: pam_unix(sudo:session): session opened for user root by dany(uid=1000)
2021-05-01T15:20:20.442914+02:00 pindabook useradd[2735]: new user: name=PindaNet, UID=1001, GID=100, home=/home/PindaNet, shell=/bin/bash
2021-05-01T15:20:20.490816+02:00 pindabook nscd: 1143 er is geschreven naar gemonitord bestand '/etc/passwd'
2021-05-01T15:20:20.506912+02:00 pindabook nscd: 1143 gemonitord bestand '/etc/passwd' werd «moved into place»; wachter wordt toegevoegd
2021-05-01T15:20:20.592315+02:00 pindabook nscd: 1143 er is geschreven naar gemonitord bestand '/etc/group'
2021-05-01T15:20:20.593888+02:00 pindabook nscd: 1143 bestand '/etc/passwd' wordt gemonitord (8)
2021-05-01T15:20:20.594112+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:20.595286+02:00 pindabook nscd: 1143 bestand '/etc/group' wordt gemonitord (3)
2021-05-01T15:20:20.595519+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:20.608833+02:00 pindabook nscd: 1143 bestand '/etc/passwd' wordt gemonitord (8)
2021-05-01T15:20:20.609127+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:20.610282+02:00 pindabook nscd: 1143 bestand '/etc/group' wordt gemonitord (3)
2021-05-01T15:20:20.610552+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:20.613381+02:00 pindabook sudo: pam_unix(sudo:session): session closed for user root
2021-05-01T15:20:39.576883+02:00 pindabook sudo:     dany : TTY=pts/1 ; PWD=/home/dany ; USER=root ; COMMAND=/usr/sbin/userdel -r PindaNet
2021-05-01T15:20:39.578826+02:00 pindabook sudo: pam_unix(sudo:session): session opened for user root by dany(uid=1000)
2021-05-01T15:20:39.598372+02:00 pindabook crontab[2745]: (root) DELETE (PindaNet)
2021-05-01T15:20:39.601993+02:00 pindabook userdel[2743]: delete user 'PindaNet'
2021-05-01T15:20:39.613599+02:00 pindabook nscd: 1143 er is geschreven naar gemonitord bestand '/etc/passwd'
2021-05-01T15:20:39.623599+02:00 pindabook nscd: 1143 gemonitord bestand '/etc/passwd' werd «moved into place»; wachter wordt toegevoegd
2021-05-01T15:20:39.658710+02:00 pindabook nscd: 1143 er is geschreven naar gemonitord bestand '/etc/group'
2021-05-01T15:20:39.706792+02:00 pindabook nscd: 1143 bestand '/etc/passwd' wordt gemonitord (9)
2021-05-01T15:20:39.707101+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:39.708201+02:00 pindabook nscd: 1143 bestand '/etc/group' wordt gemonitord (3)
2021-05-01T15:20:39.708421+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:39.709618+02:00 pindabook nscd: 1143 bestand '/etc/passwd' wordt gemonitord (9)
2021-05-01T15:20:39.709864+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:39.711048+02:00 pindabook nscd: 1143 bestand '/etc/group' wordt gemonitord (3)
2021-05-01T15:20:39.711315+02:00 pindabook nscd: 1143 map '/etc' wordt gemonitord (2)
2021-05-01T15:20:39.713755+02:00 pindabook sudo: pam_unix(sudo:session): session closed for user root
2021-05-01T15:22:04.364720+02:00 pindabook sudo:     dany : TTY=pts/1 ; PWD=/home/dany ; USER=root ; COMMAND=/usr/bin/cat /var/log/messages
2021-05-01T15:22:04.366703+02:00 pindabook sudo: pam_unix(sudo:session): session opened for user root by dany(uid=1000)

Dit bestand presenteert de gegevens in een vaste structuur, waardoor we deze op een relatief eenvoudige manier kunnen doorzoeken.

dany@pindabook:~> sudo grep -i "`date --date='today' '+%F'`" /var/log/messages | egrep -wi 'new user'
2021-05-01T15:20:20.442914+02:00 pindabook useradd[2735]: new user: name=PindaNet, UID=1001, GID=100, home=/home/PindaNet, shell=/bin/bash

En we hebben de regel met de vermelding van het aanmaken van een nieuwe gebruiker. De grep opdracht doorzoekt het logbestand naar meldingen die vandaag (today) voorkwamen. De datum wordt daarbij samengesteld zoals deze in het logbestand voorkomt, in het formaat JJJJ-MM-DD. De regels met meldingen van vandaag worden doorgegeven aan de egrep opdracht die de regels met de woorden 'new user' eruit haalt.

Het script

#!/bin/bash
# /opt/scripts/new-users.sh

# Tel het aantal te rapporteren logboekmeldingen
prev_count=0
count=$(grep -i "`date --date='yesterday' '+%F'`" /var/log/messages | egrep -wi 'new user' | wc -l)
if [ "$prev_count" -lt "$count" ] ; then
  # Plaats een tekstbestand met een waarschuwing op het Bureaublad.
  BERICHT="/home/dany/Bureaublad/Waarschuwing.txt"
  GEBRUIKER=$(grep -i "`date --date='yesterday' '+%F'`" /var/log/messages | egrep -wi 'new user' | awk '{print $6}' | uniq | sed 's/,/ /')
  echo "ATTENTIE: Gebruiker ${GEBRUIKER#*=}aangemaakt op `date --date='yesterday' '+%e %b'`" >> $BERICHT
fi

Pas in het script het pad aan naar het Bureaublad van jouw eigen Persooonlijke map, m.a.w. vervang in de variabele BERICHT, dany door uw eigen gebruikersnaam. Let op het feit dat we hier de meldingen van gisteren (yesterday) doorzoeken, wat ook de bedoeling was. Om het script te testen, kan je beter werken met vandaag (today). De variabele GEBRUIKER halen we uit de melding met de awk opdracht die er het zesde veld (door spaties gescheiden woorden) uithaalt. Daar deze echter nog 'name=' bevat, verwijderen we dit gedeelte tijdens het wegschrijven naar het bestand op het Bureaublad. Het gebruik van ${GEBRUIKER#*=}) zorgt ervoor dat enkel het gedeelte na het =-teken wordt weergegeven. Het script test je met de opdracht:

dany@pindabook:~> sudo bash /opt/scripts/new-user.sh 
[sudo] wachtwoord voor root:

Het volgende bestand met de volgende inhoud verschijnt op het Bureaublad:
Waarschuwing

Eén keer per dag automatisch starten

Eerst maken we het script uitvoerbaar:

dany@pindabook:~> sudo chmod +x /opt/scripts/new-user.sh

Met systemd timers kunnen we taken dagelijks laten uitvoeren (zie Systemd Timers). Maak de volgende systemd service aan:

dany@pindabook:~> sudo nano /etc/systemd/system/new-user.service

Met de volgende inhoud:

# new-user.service
[Unit]
Description= Logboeken doorzoeken op het aanmaken van nieuwe gebruikers
Documentation= https://linux.pindanet.be/faq/tips21/warning.html

[Service]
Type= simple
ExecStart= /opt/scripts/new-user.sh

[Install]
WantedBy= multi-user.target

Test de nieuwe service door het vorige Bureaubladbestand te wissen, systemd services in te lezen en onze nieuwe service te starten:

dany@pindabook:~> sudo rm Bureaublad/Waarschuwing.txt
[sudo] wachtwoord voor root:
dany@pindabook:~> sudo systemctl daemon-reload
dany@pindabook:~> sudo systemctl start new-user.service 
dany@pindabook:~> sudo systemctl status new-user.service 
● new-user.service - Logboeken doorzoeken op het aanmaken van nieuwe gebruikers
   Loaded: loaded (/etc/systemd/system/new-user.service; disabled; vendor preset: disabled)
   Active: inactive (dead) since Sat 2021-05-01 16:41:25 CEST; 26s ago
     Docs: https://linux.pindanet.be/faq/tips21/warning.html
  Process: 3699 ExecStart=/opt/scripts/new-user.sh (code=exited, status=0/SUCCESS)
 Main PID: 3699 (code=exited, status=0/SUCCESS)

mei 01 16:41:25 pindabook systemd[1]: Started Logboeken doorzoeken op het aanmaken van nieuwe gebruikers.

Om deze service dagelijks te starten, maak je de volgende timer aan:

dany@pindabook:~> sudo nano /etc/systemd/system/new-user.timer

Met de volgende inhoud:

[Unit]
Description=Run new-user daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

De Persistent=true optie zorgt ervoor dat de taak wordt uitgevoerd bij de eerste start na het verstrijken van de uitvoertijd. Start de timer met de opdrachten:

dany@pindabook:~> sudo systemctl daemon-reload
[sudo] wachtwoord voor root: 
dany@pindabook:~> sudo systemctl start new-user.timer
dany@pindabook:~> sudo systemctl status new-user.timer
● new-user.timer - Run new-user dayly
   Loaded: loaded (/etc/systemd/system/new-user.timer; disabled; vendor preset: disabled)
   Active: active (waiting) since Sat 2021-05-01 16:26:31 CEST; 22min ago
  Trigger: Sun 2021-05-02 00:00:00 CEST; 7h left

mei 01 16:26:31 pindabook systemd[1]: Started Run new-user dayly.
dany@pindabook:~> systemctl list-timers
NEXT                          LEFT                LAST                          PASSED       UNIT                         A>
Sat 2021-05-01 17:00:00 CEST  10min left          Sat 2021-05-01 16:00:04 CEST  49min ago    snapper-timeline.timer       s>
Sun 2021-05-02 00:00:00 CEST  7h left             Sat 2021-05-01 15:04:36 CEST  1h 44min ago logrotate.timer              l>
Sun 2021-05-02 00:00:00 CEST  7h left             Sat 2021-05-01 15:04:36 CEST  1h 44min ago mandb.timer                  m>
Sun 2021-05-02 00:00:00 CEST  7h left             n/a                           n/a          new-user.timer               n>
Sun 2021-05-02 00:31:29 CEST  7h left             Sat 2021-05-01 15:04:36 CEST  1h 44min ago backup-sysconfig.timer       b>
Sun 2021-05-02 00:58:17 CEST  8h left             Sat 2021-05-01 15:04:36 CEST  1h 44min ago backup-rpmdb.timer           b>
Sun 2021-05-02 01:56:24 CEST  9h left             Sat 2021-05-01 15:04:36 CEST  1h 44min ago check-battery.timer          c>
Sun 2021-05-02 15:24:16 CEST  22h left            Sat 2021-05-01 15:24:16 CEST  1h 25min ago snapper-cleanup.timer        s>
Sun 2021-05-02 15:29:16 CEST  22h left            Sat 2021-05-01 15:29:16 CEST  1h 20min ago systemd-tmpfiles-clean.timer s>
Mon 2021-05-03 00:00:00 CEST  1 day 7h left       Sat 2021-05-01 15:04:36 CEST  1h 44min ago btrfs-balance.timer          b>
Mon 2021-05-03 00:00:00 CEST  1 day 7h left       Mon 2021-04-26 19:00:08 CEST  4 days ago   fstrim.timer                 f>
Tue 2021-06-01 00:00:00 CEST  4 weeks 2 days left Sat 2021-05-01 15:04:36 CEST  1h 44min ago btrfs-scrub.timer            b>

12 timers listed.
Pass --all to see loaded but inactive timers, too.

De laatste opdracht toont welke timers uitgevoerd werden en wanneer ze terug uitgevoerd worden. Deze opdracht sluit je af door q te drukken. Uiteindelijk activeer je het automatisch starten van de timer met de opdracht:

dany@pindabook:~> sudo systemctl enable new-user.timer
Created symlink /etc/systemd/system/timers.target.wants/new-user.timer → /etc/systemd/system/new-user.timer.

Toepassingen en alles opruimen

Het spreekt voor zich dat je door het aanpassen van het script allerlei zaken in het oog kunt houden. Daarenboven kan je bij elke gevonden melding een actie laten uitvoeren. Naast het aanmaken van een opvallende melding op het Bureaublad, kan je een e-mail ontvangen of gerichte tegenmaatregelen treffen.

Alle onderdelen van dit artikel ruim je op met de volgende opdrachten:

dany@pindabook:~> sudo rm Bureaublad/Waarschuwing.txt
[sudo] wachtwoord voor root: 
dany@pindabook:~> sudo systemctl disable new-user.timer
Removed /etc/systemd/system/timers.target.wants/new-user.timer.
dany@pindabook:~> sudo rm /etc/systemd/system/new-user.timer
dany@pindabook:~> sudo rm /etc/systemd/system/new-user.service
dany@pindabook:~> sudo rm /opt/scripts/new-user.sh