PAM - sinalizador de controle necessário e suficiente

14

Estou estudando PAM e sou um pouco ignorante sobre o significado de alguma combinação de sinalizadores de controle. Da documentação da Red Hat, temos:

  • a
    falha necessária de tal PAM levará à falha de retorno da API do PAM, mas somente após a invocação dos módulos empilhados restantes (para este serviço e tipo)

  • requisito
    como necessário, no entanto, no caso em que tal módulo um retorna uma falha, o controlo é devolvido directamente para a aplicação.

  • o
    sucesso suficiente desse módulo é suficiente para satisfazer os requisitos de autenticação da pilha de módulos (se um módulo exigido anteriormente falhar, o sucesso deste módulo será ignorado). Uma falha deste módulo não é considerada fatal por satisfazer o aplicativo que esse tipo teve êxito. Se o módulo for bem-sucedido, a estrutura do PAM retornará o sucesso ao aplicativo imediatamente sem tentar outros módulos.

Portanto, no meu entendimento, se um módulo requisitefalhar, toda a pilha de módulos não será analisada e o controle voltará ao aplicativo imediatamente. Se um módulo sufficientfor bem-sucedido, o restante da pilha de módulos não será analisado e o controle retornará ao aplicativo imediatamente. Se um módulo requiredfalhar, a pilha inteira será analisada.

Agora, não consigo entender qual será o comportamento quando um determinado módulo requiredfalhar e outro módulo sufficientfor bem-sucedido.

ludiegu
fonte

Respostas:

11

O PAM continua os itens na pilha em sequência. Ele apenas mantém a memória do estado em que se encontra (sucesso ou negação, com sucesso significando sucesso até agora), e não de como chegou a esse estado.

Se um item marcado sufficientfor bem-sucedido, a biblioteca do PAM interromperá o processamento dessa pilha. Isso acontece se houve requireditens anteriores ou não. Neste ponto, o PAM retorna o estado atual: êxito se nenhum requireditem anterior falhar, caso contrário, negado.

Da mesma forma, se um item marcado requisitefalhar, a biblioteca PAM interrompe o processamento e retorna uma falha. Nesse ponto, é irrelevante se um requireditem anterior falhou.

Em outras palavras, required não necessariamente faz com que toda a pilha seja processada. Significa apenas continuar.

Gilles 'SO- parar de ser mau'
fonte
Mas se algum requireditem falhou, por que PAMprecisa continuar avançando na pilha? se finalmente vai falhar mesmo assim?
Mohammed Noureldin
1
@MohammedNoureldin Mesmo que uma tentativa de login falhe, algumas coisas devem ser feitas, como registrar, adicionar um tempo limite contra tentativas de força bruta, etc. Além disso, geralmente o sistema não revela o motivo exato da falha, por exemplo, se procurar a nome de usuário falhar, ainda será solicitada uma senha ao usuário.
Gilles 'SO- stop be evil'
A ordem é a ordem em que eles estão listados na configuração?
OrangeDog 29/05
@OrangeDog Sim. O módulo listado na primeira linha é executado e, em seguida, a segunda linha é executada (ou pulada dependendo do resultado da primeira linha), etc.
Gilles 'SO- stop be evil'
1

Na minha opinião, um requiredsinalizador de controle deve ser sempre bem-sucedido para que um módulo seja bem-sucedido.

Um sufficientmódulo sinalizado é ignorado se falhar. Se for bem-sucedido e nenhum requiredmódulo sinalizado acima falhar, nenhum outro módulo do mesmo tipo deverá ser verificado e o módulo será considerado bem-sucedido. Então, basicamente, orequired bandeira tem prioridade mais alta que a sufficientbandeira, mas a última tem capacidade de parar de verificar o restante deles, se os anteriores tiverem requiredsucesso.

Exemplo:

1 auth       required     /lib/security/pam_nologin.so
2 auth       required     /lib/security/pam_securetty.so
3 auth       required     /lib/security/pam_env.so
4 auth       sufficient   /lib/security/pam_rhosts_auth.so
5 auth       required     /lib/security/pam_stack.so service=system-auth

Se as linhas 1, 2, 3 e 4 forem bem-sucedidas, a linha 5 poderá ser pulada e o módulo authbem-sucedido. Se a linha 4 não for bem sucedida, ela será ignorada e a linha 5 será verificada. Se alguma das linhas 1, 2, 3 falhar, a linha 4 não será levada em consideração.

dsmsk80
fonte
1
Acho que a pergunta dele é o que acontece se 1 falhar e 2-4 for bem-sucedido. 5 é executado? Se 1 tivesse sucesso, 5 não seria executado. Ou, em outras palavras, a "parada após êxito suficiente" se aplica se um módulo necessário anterior falhar?
Cjm
Não, o módulo de autenticação falharia com essa combinação.
dsmsk80
A questão não é se a autorização falhará. Será. A questão é se o módulo 5 será executado antes que a falha seja relatada ao aplicativo.
Cjm