pam_access.so no funciona cuando se especifica listep

pam_access.so no funciona cuando se especifica listep

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 listsepse 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 listse 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 rooty devopsy 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.confreglas 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 devopsy computer managersson 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).
...

información relacionada