Estou configurando a autenticação de dois fatores do Google em um servidor de saída na empresa em que trabalho.
Aqui estão as configurações relevantes:
/etc/ssh/sshd_config
:
ubuntu@stage-itai-1:~$ egrep -v '^#' /etc/ssh/sshd_config | sed '/^\s*$/d'
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication yes
PasswordAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
Match Group gauth
AuthenticationMethods publickey,keyboard-interactive
/etc/pam.d/sshd
:
ubuntu@stage-itai-1:~$ egrep -v '^#' /etc/pam.d/sshd | sed '/^\s*$/d'
auth required pam_google_authenticator.so nullok
account required pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
@include common-session
session optional pam_motd.so motd=/run/motd.dynamic noupdate
session optional pam_motd.so # [1]
session optional pam_mail.so standard noenv # [1]
session required pam_limits.so
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
@include common-password
Os usuários que são membros do grupo "gauth" devem ser forçados a fornecer a chave pública e o código de verificação do Google, que é intencional e está funcionando.
Os usuários que não são membros do grupo "gauth" devem ser forçados a fornecer a chave pública, mas na realidade eles são capazes de se conectar à máquina sem fornecer uma chave pública nem uma senha.
Há um usuário especial na máquina que é chamado de "resgate" e este usuário deve ser obrigado a fornecer apenas uma senha e seu objetivo é nunca ficar bloqueado fora da máquina, mas na realidade o usuário é capaz de se conectar sem um senha em tudo.
Minha pergunta é: como faço para impor minhas "supostas" regras, o que significa que:
- os usuários do grupo "gauth" devem fornecer a chave pública e o Google OTP
- os usuários que não são membros do grupo "gauth" devem poder efetuar login apenas fornecendo uma chave pública.
- o usuário "resgate" deve ser capaz de efetuar login apenas fornecendo uma senha (ou também fornecendo uma chave pública).
Como pode ser feito?
Edição nº 1:
Seguindo a resposta do FaCe, configurei /etc/ssh/sshd_config
assim:
Alterei PasswordAuthentication de volta para "Yes" e "ChallengeResponseAuthentication" de volta para "No" para todo o arquivo e, em seguida, adicionei na parte inferior do arquivo as seguintes linhas:
Match Group guath
PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Match User rescue
PasswordAuthentication yes
ChallengeResponseAuthentication no
AuthenticationMethods password
Depois de redefinir o serviço ssh, não consigo fazer login, independentemente do usuário que estou usando, recebo o seguinte erro:
ssh_exchange_identification: Connection closed by remote host
E nada é exibido em /var/log/auth.log
.
Alguém pode por favor lançar alguma luz sobre o assunto?
Você precisa usar várias diretivas Match Group:
Não tenho certeza sobre sua versão do Ubuntu, mas no Debian Jessie a palavra-
ChallengeResponseAuthentication
chave não pode fazer parte de umMatch
bloco. De acordo comman sshd_config
: