![设置基于密钥的身份验证后,SSH 仍要求输入密码](https://linux22.com/image/1294076/%E8%AE%BE%E7%BD%AE%E5%9F%BA%E4%BA%8E%E5%AF%86%E9%92%A5%E7%9A%84%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%90%8E%EF%BC%8CSSH%20%E4%BB%8D%E8%A6%81%E6%B1%82%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81.png)
我已成功为从我的 A 机器到我的 B 机器的 root 用户创建了基于密钥的身份验证。
现在,我在 B 机器上创建了一个新用户,与 A 机器上的用户相同,我们称他为USER
。我在 B 机器上为他创建了一个主目录/home/USER
,并且我想为他创建从机器 A 到 B 机器的基于密钥的身份验证。
因此,我在 A 机器上运行
ssh-keygen -t rsa
,接受所有路径,因此/home/USER/.ssh/id_rsa
且没有短语ssh-copy-id -i /home/USER/.ssh/id_rsa.pub USER@BmachinesIP
,输入密码并收到按摩
现在尝试登录机器 bla bla bla
一切似乎都还好。
但当我尝试连接时,系统ssh USER@BmachinesIP
要求我输入密码。我尝试查看日志并运行ssh -vvv USER@BmachinesIP
,以下是部分输出:
debug1: Authentications that can continue: publickey,password
debug3: start over, passed a different list publickey,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/USER/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/USER/.ssh/id_dsa
debug3: no such identity: /home/USER/.ssh/id_dsa
debug2: we did not send a packet, disable method
debug3: authmethod_lookup password
debug3: remaining preferred: ,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
USER@BmachinesIP's password:
那么,有人能告诉我我做错了什么或者我应该改变什么吗?也许问题出在权限上,它们如下:
在 A 机器上:
drwx------ 2 USER USER SIZE DATE TIME .ssh
-rw------- 1 USER USER 1675 2011-10-31 14:36 id_rsa
-rw-r--r-- 1 USER USER 413 2011-10-31 14:36 id_rsa.pub
在 B 机器上:
drwx------ 2 USER defaultGroup SIZE DATE TIME .ssh
-rw------- 1 USER defaultGroup SIZE DATE TIME authorized_keys
答案1
我找到了解决方案。权限方面存在问题。
/home/USER
在远程计算机上已授予所有权限,但对于基于密钥的身份验证,必须将其设置为 755
答案2
我新安装的 CentOS7 也遇到同样的问题。
1.检查主目录权限和 ~/.ssh 和 ~/.ssh/authorized_keys 权限(根据@erik)
chmod o-w ~/; chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
2. 检查/etc/ssh/sshd_配置设置 && 服务 sshd 重启(每次编辑后)有用:在 sshd_config 中尝试“LogLevel VERBOSE”。
检查完所有一切正常后,我仍然收到密码提示。
使用 -vvv 日志运行 ssh 客户端:
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
服务器(/var/log/secure)日志:
Failed publickey for * from * port * ssh2: RSA *
ssh 服务器不会向客户端发送更多错误信息,因为这会带来安全风险。
如果我在不同端口上运行 sshd 'sshd -p 5555 -d'。密钥有效。无密码登录成功。WTF?
然后我禁用了 selinux(在 /etc/selinux/config 中设置 SELINUX=disabled)并重新启动。无密码登录就可以正常工作了。
我的当前工作的 sshd_config 设置:
[root@hp-bl-05 ~]# grep -vE "^#|^$" /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
SyslogFacility AUTHPRIV
LogLevel VERBOSE
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
HostbasedAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
因此,如果知道我们是否可以在 selinux 中做一些小改动,让无密码 ssh 登录正常工作,那就太好了。有人可以改进答案吗?
答案3
解决方案不是禁用 SELinux,而是修复用户目录的 SELinux 权限。必须将用户目录上下文设置为user_home_t
。
去检查,
$ sudo ls -Z /home/
如果您的用户目录的上下文是user_home_t
,则 SELinux 将不允许该用户通过公钥通过 SSH 进入该用户目录。
修理,
$ sudo semanage fcontext -a -t user_home_t /home/azureuser
$ sudo restorecon -vvRF /home/azureuser
基于密钥的登录现在应该可以工作了。