【OpenSSH升级】无论密码输入正确与否总是登录失败

# 问题:如果远程通过ssh访问,无论密码输入正确与否总是失败
通过journalctl -xe -u sshd查看日志有
error: Received disconnect from 192.168.18.202 port 52219:13: The user canceled authentication.  [preaut>
Disconnected from authenticating user root 192.168.18.202 port 52219 [preauth]
error: Could not get shadow information for root
Failed password for root from 192.168.18.202 port 52248 ssh2


# 分析:
具体因为啥还得查看/var/log/audit/audit.log查看selinux日志分析:

type=AVC msg=audit(1297958384.484:13923): avc:  denied  { read } for  pid=5219 comm="sshd" name="shadow" dev=dm-0 ino=4115 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:shadow_t:s0 tclass=file

ll -Z /etc/shadow
----------. 1 root root system_u:object_r:shadow_t:s0 1068 Mar 20 10:39 /etc/shadow

# 原因:
默认情况下,sshd使用PAM检查密码。sshd使用的PAM模块之一是pam_unix。这个模块首先尝试直接读取/etc/shadow。如果权限被拒绝,则执行/sbin/unix_chkpwd。unix_chkpwd接受用户名和密码,并向pam_unix指示密码是否与用户名匹配。
这里的问题是,由于“PAM”在这里被禁用,sshd试图直接访问shadow文件。因为没有selinux规则允许这样的直接访问,所以selinux拒绝这样做。目标策略只允许unix_chkpwd (chkpwd_t)和unix_update (updpwd_t)程序读取/etc/shadow。允许sshd直接读取影子文件被认为存在潜在的安全风险。

# 解决方案:
方案一:(太过粗放霸道)
通过setenforce关闭selinux即可,或者编辑 /etc/selinux/config 文件,修改如下设置:
SELINUXTYPE=disabled
重启服务器,用以永久禁用SELinux。

方案二:(创建selinux策略,放行sshd直接读shadow)
参考链接:https://access.redhat.com/solutions/46137

# vi /etc/ssh/ssh_password
module ssh_password 1.0;

require {
     type sshd_t;
     type shadow_t;
     class file { read open };
}

#============= sshd_t ==============
allow sshd_t shadow_t:file { read open };

# cd /etc/ssh/
# checkmodule -M -m -o ssh_password.mod ssh_password
# semodule_package -o ssh_password.pp  -m ssh_password.mod
# ll ssh_password*
-rw-r--r--. 1 root root 187 Mar 20 12:07 ssh_password
-rw-r--r--. 1 root root 926 Mar 20 12:08 ssh_password.mod
-rw-r--r--. 1 root root 942 Mar 20 12:08 ssh_password.pp
# semodule -i ssh_password.pp
# semodule -l |grep ssh
rssh
ssh
ssh_password

方案三:启动UsePAM yes,由pam_unix去读取shadow文件。
1、升级openssh之前,备份原有配置文件

mv /etc/ssh/sshd_config /etc/ssh/sshd_config_bak
mv /etc/pam.d/sshd /etc/pam.d/sshd_bak

2、升级完成之后备份新的配置文件,恢复原来的配置

mv /etc/pam.d/sshd /etc/pam.d/sshd_new
mv /etc/ssh/sshd_config /etc/ssh/sshd_config_new

mv /etc/ssh/sshd_config_bak /etc/ssh/sshd_config
mv /etc/pam.d/sshd_bak /etc/pam.d/sshd 

你可能感兴趣的:(操作系统,ssh,pam,selinux)