Autenticação em três etapas?

9

Estou usando o Ubuntu.

Só estou imaginando se é possível ter o libpam-google-authenticator (que permite fazer login usando um código gerado pelo seu telefone) E autenticação de certificado configurada para trabalhar em conjunto, e se for possível, como eu iria configurando. Assim - para fazer login na minha conta, você precisa ter minha senha, meu telefone (e sua senha) E meu certificado / chave privada e sua senha.

Comecei a trabalhar de forma independente, mas nunca consegui fazê-los trabalhar juntos. Tenho certeza de que, de alguma forma, é possível.

Obrigado.

Jesse W
fonte
Normalmente você não ganha muito por fatores duplicados. Um certificado e um gerador de código se encaixam no fator 'algo que você tem'. Uma senha se encaixa no 'algo que você sabe'. O outro fator comum é 'algo que você é' (biometria).
Zoredache

Respostas:

8

É possível fazer isso encadeando os módulos PAM. Mas antes de entrar em detalhes:

A configuração incorreta do PAM pode impedi-lo de fazer login no sistema

Felizmente, você sempre pode inicializar no modo de usuário único e corrigir o problema, mas lembre-se de que o PAM não é algo com o qual você queira mexer mais do que o necessário.

De qualquer forma, a idéia por trás disso é que é possível utilizar empilhamento módulos PAM para se certificar de que pam-google-authenticator, pam_unix(isto verifica a senha) e o módulo certificado todos têm de ter sucesso para permitir-lhe acesso. Por padrão, o PAM está configurado para permitir que qualquer módulo de autenticação o autentique, ignorando os outros.

No arquivo /etc/pam.d/common-auth, você verá na parte superior uma linha semelhante à seguinte:

auth    [success=2 default=ignore]  pam_unix.so nullok_secure try_first_pass

Isso informa ao PAM que, se pam_unix.sotiver êxito, pulará as próximas duas regras (que normalmente são outro módulo de autenticação pam_deny.so) e continuará para os módulos opcionais. No entanto, se o módulo falhar, será ignorado e o controle passará para o próximo módulo da cadeia. Isso continua em cada módulo de autenticação até o controle pular para o bloco opcional ou o PAM acessar pam_deny.so e falhar ali.

Isso pode ser aproveitado para garantir que pam-google-authenticator, pam_unix.soe o módulo PAM do seu certificado tenha que ter sucesso para permitir o acesso. Não sei o nome do módulo autenticador do Google ou do módulo de certificado que você está usando, mas você poderá encontrá-los no seu arquivo de autenticação comum. Então, colocando algo assim no topo:

auth    requisite   pam_unix.so nullok_secure
auth    requisite   pam_google_authenticator.so
auth    requisite   pam_certificate_auth.so
auth    [success=<n>]   pam_permit.so

Substituindo <n>pelo número de módulos entre o módulo pam_permit.so aqui e o próximo pam_permit.somódulo - em outras palavras, isso deve ser definido como o código [sucesso = n padrão = ignorar] do módulo de autenticação mais alto + 1. Essa sintaxe é um pouco descolada , mas basicamente ignora os módulos de autenticação depois que os módulos acima foram bem-sucedidos.

Obviamente, você pode estar se perguntando como limitar essa autenticação em três etapas apenas à sua conta de usuário. Isso pode ser feito com um pam_succeed_if.somódulo e deve ser inserido acima do bloco de autenticação em três etapas descrito acima:

auth    [success=ignore default=4]  pam_succeed_if.so user = <username>

Onde <username>é substituído pelo seu nome de usuário. Essa linha simplesmente diz que se pam_succeed_if.so for bem-sucedido (também conhecido como seu nome de usuário corresponde ao nome de usuário nessa linha), o PAM deve prosseguir com os próximos módulos, que são os módulos de autenticação em três etapas. Caso contrário, o PAM deve pular para os módulos reais, que estão a 4 módulos deste.

Para corresponder a várias coisas, por exemplo, associação a um grupo e um determinado nome de usuário, várias linhas devem ser usadas, por exemplo:

auth    [success=1 default=ignore]  pam_succeed_if.so user = <username>
auth    [success=ignore default=4]  pam_succeed_if.so user ingroup <group>

Antes de fazer isso, eu fazia o backup do arquivo de autenticação comum e também me familiarizava com o modo de usuário único e como restaurar o arquivo antigo em caso de emergência. Essa configuração não foi testada por mim, mas deve funcionar.

Para testar isso pela primeira vez, abra um shell raiz ou dois e deixe-os em paz. Eles atuam como substitutos no caso de algo dar errado, pois você pode substituir facilmente a autenticação comum pelo backup. Em seguida, faça essas alterações. Em seguida, tente usar supara fazer login na sua conta de usuário - você precisará passar pelo processo de autenticação em três etapas.

A documentação completa do pam_succeed_if.somódulo pode ser encontrada em http://linux.die.net/man/8/pam_succeed_if

Xenopático
fonte
Excelente resposta! Se eu pudesse votar mais de uma vez, faria.
Aaron Miller
Obrigado! Embora - para o login do certificado, estou adicionando minha chave pública às chaves .ssh / allowed_keys (usando as configurações RSAAuthentication e PubkeyAuthentication em sshd_config) e para o código OTP estou usando pam_google_authenticator - google-authenticator.googlecode.com/hg . Então, como isso funcionaria?
Jesse W
@JesseW Para que isso funcione, você precisa configurar o SSHD para usar o PAM e também uma chave pública. Embora eu não tenha certeza dos detalhes, você certamente precisará definir ChallengeResponseAuthenticatione UsePAMcomo 'yes'; em seguida, defina as linhas detalhadas na minha resposta acima em /etc/pam.d/sshd ou /etc/pam.d/common -auth, dependendo se você deseja executar isso para todos os logins ou apenas SSH. Lembre-se de remover a linha de preenchimento 'pam_certificate_auth.so' e modificar a linha [success = <n> como resultado.
Xenopathic
2

Li este post e achei legal - aqui está como consegui a autenticação de três fatores para funcionar. Eu escrevi um post sobre isso aqui .

Basicamente, configurei o Google Authenticator e a senha no PAM, depois configurei a autenticação de chave pública no OpenSSH (isso ignora os outros dois) e, finalmente, exigi que o OpenSSH também se autenticasse através do PAM (a última linha)

Em / etc / ssh / sshd_conf

PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Einar
fonte
1

Somente Pubkey + GoogleAuth você precisa adicionar ao topo do seu /etc/pam.d/sshd

#auth    requisite    pam_unix.so nullok_secure #if you want password, too :)
auth    requisite    pam_google_authenticator.so
auth    [success=2]  pam_permit.so

Eu suponho que você tenha OpenSSH> = 6.2 e sshd_config editado

Para uma segurança mais paranóica, adicione algumas configurações extras: D

x4k3p
fonte