Estou tentando implementar a autenticação de dois fatores para o OpenSSH. O ambiente é Centos 7 (kernel: 3.10.0-229.1.2.el7.x86_64) com OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 de fevereiro de 2013. Temos o Active Directory (LDAP) + Kerberos implantado. A especificação é a seguinte:
- Um usuário com um ticket Kerberos válido e existente deve ser solicitado apenas para o segundo fator
- Um usuário sem um ticket Kerberos válido e válido deve ser solicitado para a senha e um segundo fator
- Usuários locais (sem acesso LDAP) devem ser capazes de autenticar com suas senhas locais
- O segundo fator não deve ser oferecido antes do primeiro
- Além do Kerberos, a autenticação de chave pública também deve ser aceita como primeiro fator, se disponível
- O recurso deve poder ser limitado a um conjunto de usuários - outros apenas podem entrar com suas senhas
Para realizar o processo de autenticação do segundo fator, existe um módulo PAM de terceiros disponível que não sabe nada sobre o Kerberos. Então, aqui está o que eu fiz:
Coloque estas linhas em / etc / ssh / sshd_config:
# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes
# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes
# Enable public key authentication
PubkeyAuthentication yes
# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes
# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)
A seção auth da configuração do PAM para sshd (/etc/pam.d/sshd)
auth [success=ignore default=1] pam_localuser.so
auth substack password-auth
auth [success=1 default=ignore] pam_localuser.so
auth required pam_2fa.so [...some arguments...]
auth include postlogin
O módulo pam_2fa.so é responsável por solicitar e validar o segundo fator.
Agora, para o Kerberos, isso faz quase tudo que eu queria alcançar. No entanto, para contas locais, isso resulta em dois prompts de senha subsequentes. Este é o meu principal problema aqui. Isso ocorre porque, nesse caso, o caminho "password, keyboard-interactive: pam" é usado, como esperado. (Preciso desse caminho de autenticação para que alguém com uma conta Kerberos, mas sem um ticket válido, possa obter um ticket digitando a senha e depois a OTP.) Se eu remover completamente a subchagem password-auth da configuração do PAM, as contas do Kerberos continuarão funcionando e contas locais permanecem não funcionando. Para mim, parece que a instrução yes KerberosOrLocalPasswd é ignorada, porque UsePAM yes também está presente. No entanto, o sshd realmente continua usando o KDC para validação de senha, porque senão não funcionaria para contas LDAP.
Então, novamente, para esclarecer melhor o que eu quero implementar aqui é o pseudocódigo que descreveu a lógica de autenticação desejada:
if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
return second_factor_auth(user, read_otp())
else:
if is_local_account(user):
if local_passwd_auth(user, read_password()):
return second_factor_auth(user, read_otp())
else:
return AUTH_ERR
else:
if krb5_auth(principal, read_password()):
return second_factor_auth(user, read_otp())
return AUTH_ERR
Então, meu cenário não é muito complexo ou ambicioso, mas ainda não consegui encontrar uma maneira clara de implementá-lo, apesar de ter passado dias pesquisando e experimentando. Você poderia, por favor, me ajudar a encontrar uma solução?
Muito obrigado antecipadamente!