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 list
está 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 root
e devops
e 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.conf
regras 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 devops
e computer managers
sã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).
...