Me encontré con un problema extraño al configurar PAM al intentar restringir los inicios de sesión ssh mediante pam_access.so con el paquetelibpam-modules_1.1.8-3.6ubuntu2.18.04.1.
contenidos de/etc/security/access.conf
+ : root : ALL
+ : devops : ALL
#+ : computer managers : ALL
- : ALL : ALL
contenidos de/etc/pam.d/sshd
account required pam_access.so listsep=, debug
Con esta configuración, todos y cada uno de los usuarios pueden iniciar sesión sin importar si están en un grupo específico o no. Si elimino listsep=,
de la configuración de PAM, entonces funciona como se supone que debe hacerlo.
de los registros de depuración Parece que cada vez que listsep
se especifica no devuelve ningún error cuando no puede encontrar el grupo de usuarios en access.conf También conocido como pam_access.so siempre devolverá éxito con listep.
En el siguiente contexto, el usuario es miembro de "administradores de computadoras", pero no de "devops".
Registros de depuración con listep habilitado y solo devops en 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
vea la última línea de registro de pam_access user_match=0
. comparémoslo con los registros de cuando no se especifica listep
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'
Puedo confirmar que, cuando listsep=,
se especifica, está analizando correctamente el grupo "administradores de computadoras", pero no devuelve códigos de error.
¿Alguien ha experimentado este problema?
¿Existe alguna solución cuando el nombre del grupo contiene espacios?
Gracias de antemano,
bhanú
Respuesta1
En su registro de depuración, puede ver que list
se utilizan espacios en blanco.
...
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
...
Tenga en cuenta que los espacios en blanco alrededor root
y devops
y ALL
.
Con esta configuración, todos y cada uno de los usuarios pueden iniciar sesión sin importar si están en un grupo específico o no.
Este es un comportamiento correcto, ya que ha definido en las /etc/security/access.conf
reglas con espacios en blanco ( + : root : ALL
), mientras que ha establecido que listsep=,
sea una coma y no un espacio. Entonces ningún usuario es parte del ALL
, ya que la palabra clave especial es ALL
(sin espacios en blanco).
La solución correcta sería la /etc/pam.d/sshd
:
account required pam_access.so listsep=, debug
Y el /etc/security/access.conf
:
+:root:ALL
+:devops:ALL
+:computer managers:ALL
-:ALL:ALL
Y supongo que devops
y computer managers
son grupos, por lo tanto deberíamos usar paréntesis para denotar grupo:
+:root:ALL
+:(devops):ALL
+:(computer managers):ALL
-:ALL:ALL
Fuentes:
$ 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).
...