Ek het sopas met logger 'n nie-wortelgebruiker gespeel, maar dit lyk asof almal in staat is om vals inskrywings in die syslog te skep deur die "-t" parameter te gebruik.

Word verwag dat dit op hierdie manier sal werk? Ek kan die logboek oorstroom of sommige aksies onder 'n vloed van verskillende vals inskrywings versteek - nie goed in middel van stelselsekuriteit nie.

Kan ek dit voorkom? => logger is deel van die pakket util-linux-systemd (vorige util-linux) en kan nie maklik gedeïnstalleer word nie, tweedens is dit by verstek uitvoerbaar vir almal op die masjien.

gebruikte stelsel: verskillende SuSE Linux (SLE 10, 11, 15)

bevelreël:

[email protected]:~ > logger -t sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)"
[email protected]:~ > su -l
Password:
[email protected]:~ > tail -n 2 /var/log/messages
Oct 27 13:35:45 garfield sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)
Oct 27 13:36:21 garfield su: (to root) justin on /dev/pts/0

Let wel: ek het net onmoontlike waardes (IP, publieke sleutel) gebruik om dit duidelik te maak dat dit 'n vals inskrywing is.

answer

Ek dink dit word verwag om so te werk, soms is dit nogal nuttig om log boodskappe vanaf 'n skrif te plaas. Dit was beslis nie bedoel vir gebruikers om die stelsellogboeke te besoedel nie. Die oplossing na my mening is om 'n goed gekonfigureerde aantekenstelsel te hê, wat sal verhoed dat gebruikers die logs besoedel, of stelselboodskappe namaak, sodat jy gebruikers kan identifiseer wat die gewoonte het om dit te doen.

Ek gebruik rsyslogd, so ek gebruik dit vir voorbeelde.

Eerstens moet u opstel rsyslogdom sekere veranderlikes te stoor vanaf die sok wat dit oopmaak:

module (load="imuxsock"
    SysSock.Annotate="on"
    SysSock.ParseTrusted="on"
)

Hiermee kan u toegang tot die volgende veranderlikes verkry:

  • pid: die PID van die aantekenproses.
  • uiden gid: die UID en GID soos die aantekenproses loop.
  • appname: die naam van die aantekenproses
  • cmd: die volledige opdragreël van die aantekenproses

In die geval van logger, pidsal die PID van wees systemd-journald, en appnamesal altyd wees systemd-journal. Met hierdie kan jy 'n paar dinge doen:

Teken dit eenvoudig aan

Jy kan 'n sjabloon gebruik wat hierdie veranderlikes insluit, sodat jy kan sien of daar 'n verskil is tussen die boodskap en die verkrygde parameters. In 'n sjabloon het jy toegang tot hierdie veranderlikes soos %$!pid%. So byvoorbeeld, van jou gebruik 'n sjabloon soos hierdie:

$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (logged by pid=%$!pid% running as %$!uid%)\n"

daemon.* /var/log/daemon.log;SomeLogFormat

sal die volgende inskrywing oplewer:

2021-10-27T18:27:54.638759+02:00 <daemon.info> sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake) (logged by pid=540 running as 1000)

Daaruit kan jy sien of die boodskap wettig is, en indien nie, kry jy die UID van die gebruiker wat in 'n snaakse bui is. Let daarop dat in plaas daarvan om die parameters een vir een te verskaf, jy die %$!%sjabloon kan gebruik , wat die bogenoemde waardes in JSON-formaat sal aanteken.

Herlei gebruikerslogboeke

Jy kan logs wat deur gebruikers geskryf is, in 'n aparte lêer plaas (miskien op 'n aparte lêerstelsel, sodat gebruikers nie die wortellêerstelsel kan vul nie). U kan alle logs wat van gebruikers afkomstig is herlei met die volgende konfigurasie:

if $!uid > 999 then /opt/log/user.log;SomeLogFormat
& stop

Die gebruik van die sjabloon (die ;SomeLogFormatdeel) is opsioneel. Op hierdie manier sal alles wat afkomstig is van enigiets met 'n UID van 1000+ na geskryf word /opt/log/user.log. U kan selfs die gebruikerslogboeke so deur UID skei:

$template userLogFile,"/opt/log/userlog_%$!uid%.log"

if $!uid > 999 then ?userLogFile;SomeLogFormat
& stop

Op hierdie manier sal elke gebruiker sy eie userlog_xxxx.loglêer hê.