Wie stoppe ich sudo PAM-Nachrichten in auth.log für einen bestimmten Benutzer?

16

Ich verwende Zabbix zur Überwachung meiner Umgebung und zabbix_agentdführe als Benutzer zabbixalle 60 Sekunden ein benutzerdefiniertes Skript aus. Es wird verwendet sudo, um dieses Skript als auszuführen root.

In /var/log/auth.logsehe ich alle 60 Sekunden:

Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session closed for user root

Ich möchte verhindern, dass diese Nachricht mein Protokoll überschwemmt. Ich habe die folgende Zeile /etc/pam.d/sudounmittelbar vor der Datei hinzugefügt session required pam_unix.so:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

und die Nachricht verschwand.

Aber das Problem ist, dass ich auf diese Weise jede PAM-Nachricht unterdrückt habe, wenn jemand ein Skript mit sudoas ausführt root.

Ich möchte die Nachricht nur für Benutzer stoppen zabbix(nicht für alle anderen Benutzer). sudoweiß, dass zabbixBenutzer das Skript mit rootBerechtigungen ausführen möchten, und gibt es eine Möglichkeit, dies PAM mitzuteilen? Wie kann ich PAM anweisen, sich bei der Verwendung nicht für einen bestimmten Benutzer anzumelden sudo?

Hinweis : Ich habe versucht, die Nachrichten im Syslog zu filtern. Obwohl dies funktioniert, hat es das gleiche Problem wie oben, nämlich, dass es zu wahllos ist, da die Protokollmeldung nicht angibt, welcher Benutzer root wird.

inivanoff1
quelle
Es unterstützt das Filtern und mit dem Filtern funktioniert es. Ich habe es versucht, aber ich mag es nicht, weil das Filtern kein universeller Weg ist. Eines Tages wird sich ein Zeichen in der Nachricht ändern oder etwas wird sich ändern und mein Filter wird fehlschlagen. Ich suche nach einer Lösung mit Konfigurationsparametern, Direktiven oder ähnlichem, um sicherzugehen, dass dies in allen Fällen gestoppt wird. Und die Nachricht sagt, session closed for user rootund wenn ich es tatsächlich filtere, filtere ich alle Nachrichten. Ich möchte für einen bestimmten Benutzer, der nicht in der Nachricht erwähnt wird, und ich kann nicht nach seinem Namen filtern ...
inivanoff1

Antworten:

11

Sie scheinen ziemlich nah an Ihrer PAM-Konfidenz zu sein:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

Wenn Sie sich die Handbuchseite ansehen pam_succeed_if, denken Sie, dass Sie testen möchten, ob der anfordernde Benutzer ( ruser) ist zabbix.

Also schlage ich vor:

session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = zabbix

Das wird den nächsten Test unterdrücken, wenn der Benutzer zabbixwird root(aber keine anderen Übergänge). Ich habe dies mit einem Paar meiner eigenen Benutzer getestet.

Entfernen Sie den uid = 0Test oben, wenn Sie nicht zabbixnur root, sondern auch keinen Benutzer werden möchten .

Ich habe den service in sudoTest entfernt: Er ist überflüssig, da diese Leitung aktiviert ist /etc/pam.d/sudo.

Toby Speight
quelle
1
Vielen Dank! Das ist es, wonach ich suche. Perfekt! Und danke für den Vorschlag zu entfernen service in sudo.
inivanoff1
1
Wenn Sie auch die [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...Zeile aus dem Protokoll entfernen möchten , können Sie dies zu einer sudoers.d / -Datei hinzufügen: Defaults:[user] !logfile, !syslog( [user]ggf. ersetzen )
thom_nic
@ thom_nic Wie lautet der Pfad zu dieser Datei?
not2qubit
Beliebige Datei unter /etc/sudoers.d/- Ich bevorzuge es, den Namen des Benutzers, der Gruppe oder der Anwendung zu verwenden, für die dies gilt. Siehe sudo.ws/man/1.8.15/sudoers.man.html
thom_nic
@thom_nic Könntest du das bitte etwas ausführlicher als Antwort posten? Das von Ihnen oben vorgeschlagene Format wird nicht angezeigt. Außerdem glaube ich nicht, dass da ein drin ist :. Und sind das logfilesexplizite oder etwas, das ersetzt werden sollte?
not2qubit
3

Basierend auf Tobys Antwort habe ich einen Weg gefunden, dies unter Debian / Ubuntu etwas anders zu konfigurieren. Zum Kontext siehe:

Also haben Debian / Ubuntu diesen pam-auth-updateBefehl und wenn Sie sich das ansehen /etc/pam.d/sudo, sieht es so aus:

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

und /etc/pam.d/common-session-noninteractivesieht so aus:

#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
session [default=1]         pam_permit.so
# here's the fallback if no module succeeds
session requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
# end of pam-auth-update config

So sicher, ich könnte beide der oben genannten Dateien bearbeiten, aber hier ist eindeutig eine "höhere Leistung" am Werk. Wie kann ich erreichen, dass meine Änderungen gut mit anderen Paketen zusammenspielen, die möglicherweise Pam-Regeln hinzufügen möchten? Um das Ganze abzurunden, schien es, als könnte ich nicht einfach eine Zeile /etc/pam.d/sudozwischen den beiden so @includeeinfügen.

##### THIS DIDN'T WORK :( ######
@include common-auth
@include common-account
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
@include common-session-noninteractive

Nachdem ich die obigen Links sowie andere Beispiele gelesen hatte (siehe /usr/share/pam-configs/unix), kam ich auf Folgendes /usr/share/pam-configs/myapp:

# Don't log "session opened" messages for myapp user
# See: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
#      https://manpages.debian.org/stretch/libpam-modules/pam_succeed_if.8.en.html
Name: myapp disable session logging
Default: yes
Priority: 300
Session-Type: Additional
Session:
    [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser

Sessionund Session-TypeKontrolle , welche Dateien bearbeitet und Prioritydefiniert , was sie gehen zu bestellen. Nach Zugabe dieser Datei und läuft pam-auth-update, /etc/pam.d/common-session-noninteractivesieht wie folgt aus (unten :)

#... omitted
session required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
session required pam_unix.so 
# end of pam-auth-update config

... was wir wollen, weil unsere pam_succeed_ifLinie vorher kommen muss session required pam_unix.so. (Diese Zeile kommt von /use/share/pam-configs/unixund hat ein, Priority: 256so dass sie an zweiter Stelle endet.) Beachten Sie auch, dass ich das service = sudoPrädikat verlassen habe, da es common-session-noninteractivemöglicherweise auch in anderen Konfigurationen enthalten ist sudo.

In meinem Fall hatte ich meinen Code bereits als .deb-Installationsprogramm gepackt, also fügte ich die /usr/share/pam-configs/myappDatei hinzu und fügte pam-auth-update --packagemeinen postinstund prermSkripten hinzu , und es kann losgehen!

Vorbehalt...

Wenn Sie den PAMConfigFrameworkSpec-Artikel lesen, den ich oben verlinkt habe , definiert er eine Session-Interactive-OnlyOption, bietet jedoch keine Möglichkeit, nur nicht interaktive Regeln anzugeben . So /etc/pam.d/common-sessionwurde auch aktualisiert . Ich glaube nicht, dass es einen Ausweg gibt. Wenn Sie damit einverstanden sind, dass interaktive Sitzungen für diesen Benutzer nicht protokolliert werden (es handelt sich um ein Dienstkonto, richtig?), Sollten Sie bereit sein!

Bonus: So entfernen Sie auch die Sudo-Log-Ausgabe

Zusätzlich zu den von session openened|closedPAM ausgegebenen Zeilen werden sudozusätzliche Informationen zu dem ausgeführten Befehl protokolliert. Es sieht aus wie das:

[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...

Wenn Sie das auch entfernen möchten, öffnen Sie diesen Link und fahren Sie unten fort ...

Also ... Sie sind wahrscheinlich mit typischen /etc/sudoers.d/___Setups vertraut, die für ein Dienstkonto, für das Superuser-Berechtigungen für einige Aktionen erforderlich sind, so etwas tun könnten:

myuser ALL=(ALL) NOPASSWD: /bin/ping

das könnte reingehen /etc/sudoers.d/10_myuser. Nun, unter anderem können Sie auch angebenDefaults . Beachten Sie speziell diese Syntax'Defaults' ':' User_List

Schauen Sie sich jetzt den Abschnitt SUDOERS OPTIONS an . Interessante Bits sind log_input, log_outputaber (wahrscheinlich) noch wichtiger, syslogund logfile. Es scheint mir, dass in neueren Versionen von Debian entweder rsyslog oder logge dich sudobei stdoutoder stderrstandardmäßig ein. Für mich tauchte dies also im Journald-Protokoll für meinen Dienst auf und nicht z. B. dort, /var/log/auth.logwo es nicht in meine Anwendungsprotokolle eingemischt wurde. Um die Sudo-Protokollierung zu entfernen, habe ich Folgendes hinzugefügt, /etc/sudoers.d/10_myuserdamit es so aussieht:

Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping

YMMV: Wenn Sie der Meinung sind, dass das Deaktivieren der Protokollierung Probleme mit Sicherheitsüberprüfungen hervorruft, versuchen Sie möglicherweise auch, diese Probleme mithilfe von rsyslog-Filtern zu lösen.

thom_nic
quelle
Die Art und Weise, wie Sie das "Session Opened / Closed" - Zeug implementiert haben, hat bei mir nicht funktioniert. Es gibt zwei Gründe: (1) Sie haben die Verwendung nicht angegeben success=1(wobei die nächste Klausel service = sudoübersprungen wird ) und (2) Wie Sie angegeben haben , führen alle ausgeführten CRON-Jobs zu requirement "service = sudo" not met by user "root". (Und möglicherweise auch andere Nebenwirkungen.) Ihr Bonusmaterial hat jedoch großartig funktioniert! Vielen Dank.
not2qubit
Wie sehen Ihre postinstund prermSkripte aus?
not2qubit
@ not2qubit re: success=1- Ich würde lieber nicht pam_unixganz überspringen . Ich möchte nur aufhören, die Ausgabe zu protokollieren, was [default=ignore]ohne Überspringen von pam_unix ganz gut zu funktionieren scheint.
thom_nic
re: cronjobs und service = sudo: Ist es möglich, dass Ihre Cron-Jobs als unpriv-Benutzer ausgeführt werden, Sie aber nicht sudoals Teil der Cron-Jobs anrufen ?
thom_nic
2

Nach einigen unheimlichen Tests und Nachforschungen habe ich eine funktionierende Lösung für Debian Stretch (auf Raspberry) gefunden. Es gibt sicherlich mehr als einen Weg, um das zu erreichen, wonach OP verlangt. Aber die PAM-Dokumentation ist überwältigend, so dass die meisten Dinge wirklich TL sind; DR.

  1. Sie können einen benutzerdefinierten Zeichenfolgenfilter für rsyslog in: hinzufügen, /etc/rsyslog.d/anyname.confindem Sie Folgendes verwenden:
    :msg, contains, "session opened for user root by pi" stop
  2. Sie können direkt bearbeiten /etc/pam.d/sudo
  3. Sie können dies auf die richtige Weise tun, indem Sie eine benutzerdefinierte PAM-Konfigurationsdatei erstellen in: /usr/share/pam-configs/
  4. Sie können dies tun, indem Sie eine benutzerdefinierte sudoers- Datei erstellen in:/etc/sudoers.d/020_pi

Ich zeige Ihnen, wie es geht (2) und (4).

WARNUNG

Bearbeiten Sie keine Dateien, /etc/pam.d/ohne zuvor die Schreibrechte für die Welt zu ändern. Wenn Sie dies nicht tun und einen Fehler machen, können Sie die zukünftige Verwendung von sudo / su sperren ! Stellen Sie also sicher, dass Sie die neuen Einstellungen getestet haben, bevor Sie sie wieder ändern. (Standard ist 644 )


So entfernen Sie "Sitzung öffnen / schließen":

Wir wollen folgenden /var/log/auth.logSpam loswerden :

May 10 11:28:03 xxx sudo[26437]: pam_unix(sudo:session): session opened for user root by (uid=0)
May 10 11:28:07 xxx sudo[26437]: pam_unix(sudo:session): session closed for user root

Mach das:

# sudo chmod 666 /etc/pam.d/sudo
# sudo cat /etc/pam.d/sudo

#%PAM-1.0

@include common-auth
@include common-account
session [success=1 default=ignore] pam_succeed_if.so quiet_success uid = 0 ruser = pi
@include common-session-noninteractive

Entscheidend ist hierbei, dass success=1bei Erfolg die nächste 1-Klausel übersprungen wird (oder im PAM-Jargon "über das nächste Modul im Stack springen").

Von man pam.conf:

Ignorieren - Bei Verwendung mit einem Stapel von Modulen trägt der Rückgabestatus des Moduls nicht zum Rückgabecode bei, den die Anwendung erhält.

done - äquivalent zu ok mit dem Nebeneffekt, dass der Modulstapel beendet wird und PAM sofort zur Anwendung zurückkehrt.

N - entspricht ok mit dem Nebeneffekt, über die nächsten N Module im Stapel zu springen.

Starten Sie als nächstes neu und lassen Sie es einige Stunden laufen (um beispielsweise Cron-Jobs zu überprüfen), um zu testen, ob dies funktioniert. Stellen Sie dann sicher, dass Sie die Dateiberechtigungen erneut installieren, da Sie sonst eine Sicherheitslücke in Ihrem System haben. ( sudo chmod 644 /etc/pam.d/sudo)


So entfernen Sie wiederholte "TTY PWD COMMAND" -Nachrichten:

Wir wollen auch Nachrichten wie diese loswerden:

May 11 18:23:20 xxx sudo:       pi : TTY=unknown ; PWD=... ; USER=root ; COMMAND=/usr/bin/arp-scan -q -l

In meinem Fall wurde dies von einem IDS-Skript generiert, das alle paar Minuten arp-scan ausführte . Erstellen Sie die folgende Datei, um zu verhindern, dass sie in den Protokollen angezeigt wird:

# sudo nano /etc/sudoers.d/020_pi
# sudo cat /etc/sudoers.d/020_pi

Defaults:pi     !logfile, !syslog
pi xxx = (root) NOPASSWD: /usr/bin/arp-scan

(Hier xxxist Ihr Computername und pider Benutzername.)

not2qubit
quelle
1
> Bearbeiten Sie keine Dateien in /etc/pam.d/, ohne zuerst die Schreibberechtigungen für die Welt zu ändern. Es wird dringend empfohlen, stattdessen eine andere Terminalsitzung als Root auszuführen. sudo su - Sie müssen dann keine gefährlichen Berechtigungen festlegen und riskieren, Änderungen zu vergessen es zurück.
thom_nic
@thom_nic Hast du das getestet? Ich vermute, dass, wenn Sie versehentlich die Verwendung von sudo / su in PAM blockieren, unabhängig davon, was Sie tun, selbst in einer Root-Shell ein Fehler auftritt. Wenn dies nicht der Fall ist, funktioniert PAM wahrscheinlich nicht ordnungsgemäß.
not2qubit
-2

Sie erhalten:

pam_succeed_if(sudo:session): unknown attribute "ruser"

mit deiner antwort.

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive
session     [success=1 default=ignore] pam_succeed_if.so service in zabbix quiet use_uid
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

funktioniert aber du bekommst trotzdem ein:

pam_unix(sudo:session): session opened for user root by (uid=0)

in deinen Protokollen.

golfdq
quelle
1
Bitte spezifizieren Sie: 1. welche Datei Sie bearbeiten, 2. wer ist "Sie" und was löst es.
not2qubit