putty公钥登录问题


上一篇博文介绍了使用Putty免密码登录,我后面试了另一台虚拟机,结果putty显示错误server refused our key(在linux下则表现为仍需要输入密码),搜索了下,很多人都遇到这个问题,大致有三种原因:

1、.ssh文件夹权限错

.ssh 以及其父文件夹(root为/root,普通用户为Home目录)都应该设置为只有该用户可写(比如700)。

以下为原因:

ssh服务器的key方式登录对权限要求严格。对于客户端: 私钥必须为600权限或者更严格权限(400), 一旦其他用户可读, 私钥就不起作用(如640), 表现为系统认为不存在私钥
对于服务器端: 要求必须公钥其他用户不可写, 一旦其他用户可写(如660), 就无法用key登录, 表现为:Permission denied (publickey).
同时要求.ssh目录其他用户不可写,一旦其他用户可写(如770), 就无法使用key登录, 表现为:Permission denied (publickey).

2、SElinux导致

密钥文件不能通过SElinux认证,解决方法如下:

# restorecon -R -v /home #root用户为/root

我遇到的就是这种情况,找了好久还找到是这个原因,因为是新装的虚拟机,SElinux还没关闭。

这篇博文详细得说明了原因:http://www.toxingwang.com/linux-unix/linux-basic/846.html

3、sshd配置不正确

正确配置方法如下:

vim /etc/ssh/sshd_config 
1、找到 #StrictModes yes 改成 StrictModes no (去掉注释后改成 no) 
2、找到 #PubkeyAuthentication yes 改成 PubkeyAuthentication yes (去掉注释)
3、找到 #AuthorizedKeysFile .ssh/authorized_keys 改成 AuthorizedKeysFile .ssh/authorized_keys (去掉注释) 
4、保存
5、/etc/rc.d/init.d/sshd reload 重新加载

4、copy问题
由于服务器空间问题,需要将home目录扩容,于是备份home目录。
但是回复后仍然存在问题,提示“server refused our key”,这个应该与2相同,即按照2的方法可以解决。
下面看一下具体原因,与2的异同点。
查看了一下服务器上authorized_keys文件的SELinux的content内容

ls -lZ ~/.ssh/authorized_keys
-rw-------. abc abc unconfined_u:object_r:default_t:s0 authorized_keys

初步看没有问题,不知道为什么还会登陆失败。
于是看了下登录的日志。有两个文件可以入手
/var/log/message
/var/log/audit/auth.log
查看后发下存在如下

type=AVC msg=audit(1597718231.507:2318): avc:  denied  { read } for  pid=17711 comm="sshd" name="authorized_keys" dev="dm-1" ino=1879052803 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=file

这里的default_t是问题的原因,使用2的方法,content如下

ls -Z ~/.ssh/authorized_keys
-rw-------. abc abc unconfined_u:object_r:ssh_home_t:s0 /home/zlin/.ssh/authorized_keys

PS:
SElinux 全称为 Security Enhanced Linux,安全强化Linux,是Mandatory Access Control(Mac 强访问控制系统)的一个实现,目的在于明确系统中某个进程可以访问哪些资源。
1.获取当前系统SELinux的运行状态
getenforce
返回结果有三种:Enforcing,Permissive,Disabled。Disabled表示SELinux被仅用,Permissive表示记录安全警告但是不阻止可以行为,Enforcing表示记录警告并且组织可疑行为。
2、修改SELinux的运行状态
setenforcing 1//启动 Enforcing
setenforcing 0//设为Permissive ,宽容状态
3、log的重要性,查看SElinux的报错信息
sealert -l 053318c7-b6f3-496b-acaa-ccb98d5cbb7e

参考:
1、Redhat SElinux 2、default_t


对于2,4的另外一个解决方案 这里报了 avc: denied { search } 的错误,属于SELinux安全性问题,解决该问题的方法是:

1、把 /var/log/audit/audit.log 文件中报错的行拷贝到临时文件 /tmp/error.txt :

# grep "avc:  denied  { search }" /var/log/audit/audit.log > /tmp/error.txt

2、执行下面的命令让系统自己找原因:

# audit2why -i /tmp/error.txt
type=AVC msg=audit(1417198093.916:14807): avc: denied { search } for pid=1977 comm="sshd" name="/" dev=vdb1 ino=2 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir

  Was caused by:
    Missing type enforcement (TE) allow rule.

You can use audit2allow to generate a loadable module to allow this access.

3、按上面命令的输出说明,执行:

# audit2allow -i /tmp/error.txt -M local
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i local.pp

4、按上面命令的输出说明,执行:

semodule -i local.pp

这样就解决了 avc: denied { search } 问题。

解决掉这个问题后,再执行ssh登录仍然需要输入密码。为此又查看了 /var/log/audit/audit.log 文件尾部,新发现了 avc: denied { getattr } 报错,解决方法同上面的1-4步。解决掉这两个报错后就可无密码登录了。