É 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.so
tiver ê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.so
e 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.so
mó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.so
mó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 su
para 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.so
módulo pode ser encontrada em http://linux.die.net/man/8/pam_succeed_if