pam_access.so não está funcionando quando listep é especificado

pam_access.so não está funcionando quando listep é especificado

Encontrei um problema estranho ao configurar o PAM tentando restringir logins ssh por pam_access.so com pacotelibpam-modules_1.1.8-3.6ubuntu2.18.04.1.

conteúdo de/etc/security/access.conf

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

conteúdo de/etc/pam.d/sshd

account required pam_access.so listsep=, debug

com esta configuração, todo e qualquer usuário tem permissão para fazer login, independentemente de estar em um grupo especificado ou não. Se eu remover listsep=,da configuração do PAM, ele funcionará como deveria.

dos logs de depuração Parece que sempre que listsepé especificado, ele não retorna nenhum erro quando não consegue encontrar o grupo de usuários em access.conf, também conhecido como pam_access.so, sempre retornará sucesso com listep.

No contexto abaixo, o usuário é membro de "gerentes de computador", mas não de "devops"

Logs de depuração com listep habilitado e apenas devops em 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

veja a última linha de log do pam_access user_match=0. vamos compará-lo com os logs de quando listep não foi especificado

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'

Posso confirmar que quando listsep=,especificado está analisando corretamente o grupo "gerentes de computador", mas não retorna códigos de erro.

Alguém mais sofreu este problema?

Existe alguma solução alternativa quando o nome do grupo contém espaços?

Desde já, obrigado,

Bhanu

Responder1

No seu log de depuração, você pode ver que isso listestá usando espaços em branco.

...
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
...

Observe que os espaços em branco ao redor roote devopse ALL.

com esta configuração, todo e qualquer usuário tem permissão para fazer login, independentemente de estar em um grupo especificado ou não.

Este é um comportamento correto, já que você definiu nas /etc/security/access.confregras com espaços em branco ( + : root : ALL), enquanto definiu que listsep=,é vírgula e não espaço. Portanto, nenhum usuário faz parte do ALL, já que a palavra-chave especial é ALL(sem espaços em branco).

A solução correta seria a /etc/pam.d/sshd:

account required pam_access.so listsep=, debug

E a /etc/security/access.conf:

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

E eu acho que isso devopse computer managerssão grupos, portanto, você deve usar parênteses para denotar grupo:

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

Fontes:

$ 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).
...

informação relacionada