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 listsep
angegeben 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 list
Leerzeichen 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 root
und devops
und 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.conf
Dies 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 devops
und computer managers
Gruppen 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).
...