我正在尝试使用 Google 2FA 解决方案保护出站服务器的安全。
目前,我首先在本地 Vagrant 机器上配置所有内容,一旦一切按预期工作,我将在远程出站机器上将其作为 Ansible 剧本运行。
我已/etc/ssh/sshd_config
这样配置:
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 User rescue
AuthenticationMethods publickey
Match Group gauth
AuthenticationMethods publickey,keyboard-interactive
就像/etc/pam.d/sshd
这样:
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
由于某种原因,不属于该gauth
组成员的用户无需提供任何密码即可登录机器,查看日志时,我看到以下几行:
Jun 15 13:35:57 vagrant-ubuntu-trusty-64 sshd[9836]: Accepted keyboard-interactive/pam for ubuntu from 10.0.2.2 port 55495 ssh2
Jun 15 13:35:57 vagrant-ubuntu-trusty-64 sshd[9836]: pam_unix(sshd:session): session opened for user ubuntu by (uid=0)
因为它是一台流浪机器,所以值得一提的是,当我连接到机器进行测试时,我运行:
ssh localhost -p 2222 -l username
并不是
vagrant ssh machine_name
我也尝试过编辑/etc/ssh/sshd_config
和修改 PermitRootLogin 指令,将“无密码”改为“无”,但无济于事。
我仍然可以自动登录到机器,而无需提供任何密码。
当我从 pam 中的 auth 行中删除“nullok”时,根本没有用户可以连接,并且给出的错误消息是:
Permission denied (publickey,keyboard-interactive).
还有一件值得一提的事情是,我的主机和 Vagrant 机器之间没有交换 ssh 密钥。
答案1
由于某种原因,不属于 gauth 组的用户无需提供任何密码即可登录机器
您在开始时从 PAM 堆栈@include common-auth
行中删除了负责正常身份验证的内容。如果我没记错的话,PAM 会检查 PAM 堆栈中的所有身份验证机制,如果其中一个“允许”连接(pam_google_authenticator.so nullok
显然允许),则允许连接。了解 PAM 身份验证如何成功超出了 openssh 的范围。
我也尝试过编辑
/etc/ssh/sshd_config
并将PermitRootLogin
指令从“无密码”改为“无”,但无济于事。
您尝试过root
用户吗?应该会被拒绝。
当我从 pam 中的 auth 行中删除“nullok”时,任何用户都无法连接
在这种情况下,唯一的 PAM 身份验证方法是pam_google_authenticator.so
(带标志required
),如果失败。你显然会被拒绝。
但在这种情况下使用公钥应该可以起作用。