PAM aceitando qualquer senha para usuários válidos

6

Acabei de vincular minha estação de trabalho Arch Linux ao Samba AD que configuramos para nossa empresa. Eu testei e funcionou, pelo menos foi o que pensei. Ele aceitou minha senha, criou meu homedir e tudo, e me conectou. O que eu esqueci de testar era o que não aceitaria. Como se vê, desde que o nome de usuário seja válido (AD ou local, não importa), ele aceitará qualquer senha. Alguém pode me apontar o que eu fiz de errado?

Estou usando o SSSD para gerenciar a conexão do AD. Aqui está o meu /etc/pam.d/system-auth :

#%PAM-1.0

auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        required      pam_env.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     optional      pam_mkhomedir.so umask=0077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_sss.so
    
por Duncan X Simpson 29.12.2017 / 16:42

1 resposta

10

Vamos analisar a seção de autenticação da sua configuração do PAM em detalhes.

auth        sufficient    pam_unix.so nullok try_first_pass

A primeira linha diz: "Se esse teste for bem-sucedido, pare de verificar mais e aceite o login; se ele falhar, continue verificando. Verifique os usuários / senhas configurados em /etc/passwd e /etc/shadow .Se o usuário existir e o campo de senha está em branco, o usuário pode entrar. " Esta é a verificação de autenticação para contas de usuários locais.

auth        requisite     pam_succeed_if.so uid >= 500 quiet

A segunda linha diz: "Se este teste falhar, pare de checar mais e rejeite o login; se for bem-sucedido, continue verificando. O valor de UID do usuário deve ser 500 ou maior." Isso impede logins para contas do sistema usando senhas no AD ou outro banco de dados de usuários compartilhados.

auth        sufficient    pam_sss.so use_first_pass

A terceira linha diz: "Se este teste for bem sucedido, pare de verificar mais e aceite o login; se falhar, continue verificando. Verifique com o SSSD." Esta é a verificação de contas do AD.

auth        required      pam_env.so

A quarta linha diz: "Se esta linha falhar, rejeite o login, mas continue verificando até o final desta seção. Defina as variáveis de ambiente descritas em /etc/security/pam_env.conf e / ou /etc/environment ."

Agora pense no que acontecerá se o usuário existir (no AD ou no local /etc/passwd ), mas as verificações de senha falharão. Primeiro, pam_unix.so falha; mas isso não pode causar uma rejeição porque isso impediria o uso de qualquer conta de usuário baseada em AD.

Então o processo segue para a segunda linha. Se o usuário tiver um mapeamento de UID válido e o número de UID for 500 ou maior, isso também será bem-sucedido. As únicas maneiras de falhar seriam se o UID fosse menor que 500.

A terceira linha faz a verificação AD; isso também falha. Mas, novamente, "suficiente" é usado para permitir a configuração de qualquer outro método de autenticação após este, então o processo continua, assim como acontece com pam_unix.so .

Neste ponto, a quarta linha deve ser executada com sucesso para permitir que o usuário entre. Mas isso é apenas definir variáveis de ambiente. man pam_env informa que o módulo pam_env.so retornará um valor PAM_SUCCESS se as variáveis de ambiente forem configuradas com sucesso. Mas como este é o último módulo PAM nesta pilha, e nenhum dos outros módulos terá rejeitado até agora, o resultado deste módulo se tornará o resultado geral da fase de autenticação.

Para corrigir isso, a fase de autenticação precisa de pam_deny.so no final, para interromper qualquer tentativa de login sempre que todos os mecanismos de autenticação reais não aceitarem o usuário.

Além disso, o pam_env.so provavelmente deve acontecer mais cedo no processo, para que a inicialização da variável de ambiente ocorra da mesma maneira para todos os usuários válidos. Se isso não funcionar no início da fase auth , o pam_env.so provavelmente deve ir para a fase session ; man pam_env diz que funcionará em auth ou session fases.

Então, minha sugestão inicial seria alterar a seção auth da sua configuração do PAM para esta:

auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_sss.so use_first_pass
auth        requisite     pam_deny.so

Então, a funcionalidade seria:

  • Definir variáveis de ambiente para o usuário. Se isso falhar, algo está seriamente errado de qualquer maneira.
  • Verifique a senha local; Se for bem sucedido, aceite o login e termine esta fase.
  • Rejeite usuários com UID abaixo de 500 neste momento (= nenhum login de conta raiz ou do sistema com uma conta do AD!)
  • Verifique a senha no AD; Se for bem sucedido, aceite o login e termine esta fase.
  • Se chegarmos a este ponto, nenhum dos mecanismos de autenticação reais aceitaram a senha, portanto, rejeite a tentativa de login incondicionalmente.

Se acontecer que pam_env.so cause problemas quando colocado no início da fase auth , você pode tentar apenas comentá-lo; parece que anteriormente ele foi ignorado em logins válidos.

Como sempre, ao alterar as configurações do PAM, primeiro abra uma sessão no sistema e certifique-se de que ele tenha sudo 'd para root ou que tenha privilégios completos de root disponíveis: faça backup da configuração atual. Faça a alteração mas não efetue logout para testá-la: em vez disso, teste-a abrindo outra sessão. Se falhar, você ainda terá a sessão original conectada, para que possa restaurar facilmente a configuração antiga, se necessário. Se este for um sistema de produção ou outro crítico, abra duas sessões raiz antes de fazer a alteração, apenas para proteger contra erros do tipo dedos-sendo-mais-que-o-cérebro.

    
por 02.01.2018 / 08:34