pam_access.so funktioniert nicht, wenn listsep angegeben ist

pam_access.so funktioniert nicht, wenn listsep angegeben ist

Ich bin auf ein seltsames Problem gestoßen, als ich PAM konfiguriert habe und versucht habe, SSH-Logins mit pam_access.so mit dem Paket einzuschränkenlibpam-modules_1.1.8-3.6ubuntu2.18.04.1.

Inhalt von/etc/security/access.conf

+ : root : ALL
+ : devops : ALL
#+ : computer managers : ALL
- : ALL : ALL

Inhalt von/etc/pam.d/sshd

account required pam_access.so listsep=, debug

Mit dieser Einstellung darf sich jeder Benutzer anmelden, unabhängig davon, ob er einer bestimmten Gruppe angehört oder nicht. Wenn ich es listsep=,aus der PAM-Konfiguration entferne, funktioniert es wie vorgesehen.

Aus den Debug-Protokollen geht hervor, dass, wenn listsepangegeben wird, kein Fehler zurückgegeben wird, wenn die Benutzergruppe in access.conf nicht gefunden werden kann. AKA pam_access.so gibt mit listsep immer Erfolg zurück.

Im folgenden Kontext ist der Benutzer Mitglied der „Computermanager“, aber nicht der „DevOps“.

Debug-Protokolle mit aktiviertem listsep und nur devops in access.conf

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok= root , item=user
pam_access(sshd:account): string_match: tok= root , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok= devops , item=user
pam_access(sshd:account): string_match: tok= devops , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok= ALL , item=user
pam_access(sshd:account): string_match: tok= ALL , item=user
pam_access(sshd:account): user_match=0, "user"
Accepted password for user from IP port PORT ssh2

siehe die letzte pam_access-Protokollzeile user_match=0. Vergleichen wir sie mit Protokollen aus der Zeit, in der listsep nicht angegeben ist

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok=root, item=user
pam_access(sshd:account): string_match: tok=root, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok=devops, item=user
pam_access(sshd:account): string_match: tok=devops, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok=ALL, item=user
pam_access(sshd:account): string_match: tok=ALL, item=user
pam_access(sshd:account): user_match=2, "user"
pam_access(sshd:account): list_match: list= ALL, item=user
pam_access(sshd:account): from_match: tok=ALL, item=IP
pam_access(sshd:account): string_match: tok=ALL, item=IP
pam_access(sshd:account): from_match=2, "IP"
pam_access(sshd:account): access denied for user 'user' from 'IP'

Ich kann bestätigen, dass listsep=,die Gruppe „Computermanager“ bei entsprechender Angabe korrekt analysiert wird, aber keine Fehlercodes zurückgegeben werden.

Hat jemand dieses Problem erlebt?

Gibt es Workarounds, wenn der Gruppenname Leerzeichen enthält?

Dank im Voraus,

Bhanu

Antwort1

In Ihrem Debugprotokoll können Sie sehen, dass listLeerzeichen verwendet werden.

...
pam_access(sshd:account): list_match: list= root , item=user
...
pam_access(sshd:account): list_match: list= devops , item=user
...
pam_access(sshd:account): list_match: list= ALL , item=user
...

Beachten Sie die Leerzeichen um rootund devopsund ALL.

Mit dieser Einstellung darf sich jeder einzelne Benutzer anmelden, unabhängig davon, ob er zu einer angegebenen Gruppe gehört oder nicht.

/etc/security/access.confDies ist ein korrektes Verhalten, da Sie in den Regeln Leerzeichen ( ) definiert haben + : root : ALL, wobei Sie festgelegt haben, dass das listsep=,Komma und kein Leerzeichen ist. Daher ist kein Benutzer Teil des ALL, da das spezielle Schlüsselwort ALL(ohne Leerzeichen) ist.

Die richtige Lösung wäre /etc/pam.d/sshd:

account required pam_access.so listsep=, debug

Und das /etc/security/access.conf:

+:root:ALL
+:devops:ALL
+:computer managers:ALL
-:ALL:ALL

Und ich vermute, dass devopsund computer managersGruppen sind, daher sollten wir Klammern verwenden, um Gruppen zu kennzeichnen:

+:root:ALL
+:(devops):ALL
+:(computer managers):ALL
-:ALL:ALL

Quellen:

$ man pam_access
...
       listsep=separators
           This option modifies the list separator character that pam_access will recognize when parsing the access configuration file. For example:
           listsep=, will cause the default ` ' (space) and `\t' (tab) characters to be treated as part of a list element value and `,' becomes the
           only list element separator. Doing this may be useful on a system with group information obtained from a Windows domain, where the default
           built-in groups "Domain Users", "Domain Admins" contain a space.
...
$ man access.conf
...
       The second field, the users/group field, should be a list of one or more login names, group names, or ALL (which always matches). To
       differentiate user entries from group entries, group entries should be written with brackets, e.g.  (group).
...

verwandte Informationen