Tenho lido tudo o que posso encontrar no PAM (por exemplo , http://wpollock.com/AUnix2/PAM-Help.htm ), no entanto, ainda estou confuso sobre a precisão com que as opções avançadas devem funcionar. Por exemplo, toda referência diz isso:
Each of the four control-flag keywords (required, requisite, sufficient, and
optional) have an equivalent expression in terms of the [...] syntax:
required
[success=ok new_authtok_reqd=ok ignore=ignore default=bad]
Meu entendimento é que os módulos podem retornar uma variedade de tokens e que a ação associada a cada token é descrita no arquivo de configuração. Com base nesse entendimento, o que
new_authtok_reqd=ok
tem a ver com o sinalizador de controle necessário ? Qual é o significado/propósito de
ignore=ignore ?
Isso por si só:
success=ok
é o que eu acho que corresponde ao comportamento exigido , mas não
default=bad
significa que se o módulo retornar qualquer outro token de ação, o módulo falhará? O token action=value success=ok é substituído por default=bad ou vice-versa? Qual tem precedência? Não está claro em nada que li.
Mais geralmente, suponha que eu tenha algo como
[success=done default=die]
O que acontece se o módulo retornar sucesso e um outro token?
Por fim, também não consigo encontrar a resposta para esta pergunta: todo valor pode ok, done, bad, die, ignore, reset, N
ser associado a qualquer ação? O que significaria mesmo dizer
[default=done] ?
Os módulos PAM têm mais de 30 valores de retorno diferentes que são mapeados para aprovação ou reprovação de toda a pilha PAM, conforme declarado pela configuração.
Vale ressaltar que um módulo PAM pode se comportar diferente dependendo do contexto (autenticação, conta, senha, sessão) em que é chamado.
Os pares de valor = ação entre colchetes descrevem qual ação tomar para cada valor de retorno possível do módulo PAM.
Uma boa explicação de valores e ações pode ser encontrada lendo atentamente a página acima mencionada até o final.
success=ok
o módulo retornou com sucesso, isso será honrado na avaliação de toda a pilha PAM, se nenhum módulo anterior falhou, considere passar para toda a pilha até este ponto.new_authtok_reqd=ok
um novo token de autenticação é necessário. Por exemplo, no contexto da sessão , isso pode fazer com que o usuário altere sua senha.ignore=ignore
o módulo PAM quer que seu resultado seja ignorado, então nós o ignoramos.default=bad
todos os outros resultados fazem com que a pilha PAM falhe (mas não pare de processar os módulos subseqüentes)Os módulos PAM retornam apenas um único valor.
Isso significa: qualquer token não mencionado aqui (ou seja, todos os tokens possíveis) encerra o processamento da pilha PAM e retorna o resultado até o momento.
Em primeiro lugar, ua2b forneceu a resposta crítica que estava causando minha confusão:
Os módulos PAM só podem retornar um único valor de status por chamada
Como os módulos só podem retornar um código de status, fica claro que a ação para qualquer conjunto de parênteses de valor/ação não é ambígua. Achei que um módulo poderia retornar vários códigos de status de uma só vez ( com base na leitura de vários documentos ), daí minha confusão. Espanta-me que nenhuma referência que encontrei, incluindo a documentação oficial , seja capaz de afirmar isso claramente. Em vez disso, encontram-se comentários como este:
" Um ou mais códigos de status são retornados por cada rotina PAM-API. "
Isso para mim parece que um módulo pode retornar vários códigos de status. Foi somente depois de ler o guia do desenvolvedor do módulo PAM que percebi que os códigos de status são retornados como um único número inteiro que mapeia para os possíveis valores de código de status conforme descrito aqui (Sim, a mesma referência!)
Minha próxima pergunta tinha a ver com igualar a palavra-chave do sinalizador de controle de estilo antigo necessária com esta sintaxe de colchetes:
Essa equivalência é repetida em todo lugar, por exemplo aqui .
Acontece que isso é um absurdo completo e absoluto. Os códigos de status retornados por qualquer módulo em particular podem diferir e diferir novamente dependendo do tipo de grupo de gerenciamento (por exemplo, autenticação versus conta).
Tomemos, por exemplo, o módulo pam_securetty . Este módulo fornece apenas o tipo de autenticação e tem os seguintes valores de retorno de código de status possíveis:
O
ignore=ignore
mapeamento de valor/ação consequentemente parece ser inútil, já que este módulo nunca retorna ignore. Nesse caso, você pode querer considerar o usouser_unknown=ignore
se de fato quiser ignorar o resultado se o usuário não puder ser encontrado.