zlib openssl openssh 升级
zlib升级
安装编译环境
yum install vim gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel zlib-devel tcp_wrappers-devel tcp_wrappers perl-IPC-Cmd
解压zlib源码并编译
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr
make
卸载当前zlib
注意:此步骤必须在步骤A执行完毕后再执行,否则先卸载zlib后,/lib64/目录下的zlib相关库文件会被删除,编译zlib会失败。
查看系统安装的zlib
rpm -qa | grep zlib
卸载zlib
rpm -e --nodeps `rpm -qa | grep zlib`
安装之前编译好的zlib
在zlib编译目录执行如下命令
make install
5、共享库注册
zlib安装完成后,会在/usr/lib目录中生产zlib相关库文件,需要将这些共享库文件注册到系统中。
echo '/usr/lib' >> /etc/ld.so.conf
ldconfig #更新共享库cache
openssl升级
解压openssl源码并编译安装
解压编译
tar -zxvf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./config --prefix=/usr --openssldir=/etc/ssl --shared zlib #必须加上--shared,否则编译时会找不到新安装的openssl的库而报错
备份当前系统ssl
find / -name openssl
/etc/pki/ca-trust/extracted/openssl
/usr/bin/openssl
/usr/lib64/openssl
/usr/include/openssl
mv -f /etc/pki/ca-trust/extracted/openssl /etc/pki/ca-trust/extracted/openssl.bak
mv -f /usr/bin/openssl /usr/bin/openssl.bak
mv -f /usr/lib64/openssl /usr/lib64/openssl.bak
mv -f /usr/include/openssl /usr/include/openssl.bak
如下两个库文件必须先备份,因系统内部分工具(如yum、wget等)依赖此库,而新版OpenSSL不包含这两个库
cp /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so.10.bak
cp /usr/lib64/libssl.so.10 /usr/lib64/libssl.so.10.bak
卸载当前openssl
rpm -qa | grep openssl
rpm -e --nodeps `rpm -qa | grep openssl`
安装ssl
make clean && make -j 4 && make test && make install
echo "/usr/lcoal/ssl/lib" >> /etc/ld.so.conf
ldconfig
openssl version -a
恢复共享库
mv /usr/lib64/libcrypto.so.10.bak /usr/lib64/libcrypto.so.10
mv /usr/lib64/libssl.so.10.bak /usr/lib64/libssl.so.10
ssh升级
安装编译环境
如果只更新ssh需要安装编译环境,否则上面步骤已经安装过环境了
yum install vim gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel zlib-devel tcp_wrappers-devel tcp_wrappers perl-IPC-Cmd
编译源码
tar -zxvf openssh-9.9p1.tar.gz
cd openssh-9.9p1
./configure --prefix=/usr --sysconfdir=/etc/ssh #(--prefix=/usr --sysconfdir=/etc/ssh 指定路径可以直接存储到对应文件位置)
备份+移除原来的文件
#(避免make install 的时候报错或者文件已存在不覆盖新文件)
mv -f /usr/sbin/sshd /usr/sbin/sshd.bak
mv -f /usr/bin/ssh /usr/bin/ssh.bak
mv -f /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
mv -f /etc/ssh /etc/ssh.bak
#如果是首次升级ssh 需要卸载系统自带ssh,导致删除下面文件,所以需要先进行备份
cp -f /etc/pam.d/sshd /etc/pam.d/sshd.bak
cp -f /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak
cp -f /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak
卸载系统自带ssh
rpm -qa | grep openssh
rpm -e --nodeps `rpm -qa | grep openssh`
rpm -qa | grep openssh
安装最新版本
make && make install
恢复/创建 sshd.service
# 卸载系统自带ssh会删除启动文件需要创建系统启动文件
#1、恢复原来的文件
cp /usr/lib/systemd/system/sshd.service.bak /usr/lib/systemd/system/sshd.service
#2、在对应目录新建sshd.service并粘贴以下内容
vim /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
恢复卸载自带ssh后删除的文件,如果没有该文件将无法登录
cp /etc/pam.d/sshd.bak /etc/pam.d/sshd
配置ssh
#(允许root登录 允许密码认证等,可以从原来的备份复制过来,注意:有可能有些配置不能使用)
vim /etc/ssh/sshd_config
# 或者直接从备份文件中恢复
重新加载启动文件
systemctl daemon-reload
重启ssh
systemctl restart sshd
设置开机自启
systemctl enable sshd
查看ssh版本、查看sftp是否正常
ssh -V
报错小计
升级成功但是使用密码登录访问拒绝,报错 error: Could not get shadow information for root
原因:默认情况下,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
需要提前确保这两个工具包已安装:checkpolicy、policycoreutils-python
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文件。(该方案试过无效,当前最新版本ssh不支持UsePAM)
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
注意:使用本方案,需要使用老的/etc/pam.d/sshd文件,否则会报错:
sshd-session[19991]: PAM unable to dlopen(/usr/lib64/security/pam_stack.so): /usr/lib64/security/pam_stack.so: cannot open shared object file: No such file or directory
sshd-session[19991]: PAM adding faulty module: /usr/lib64/security/pam_stack.so
其他报错信息
sshd-session[21108]: error: Received disconnect from 192.168.14.143 port 42902:14: Unable to authenticate using any of the configured authentication methods. [preauth]
原因:配置了PermitRootLogin prohibit-password或passwordauthentication no
原因:配置了PermitRootLogin prohibit-password或passwordauthentication no
sshd-session[19991]: PAM unable to dlopen(/usr/lib64/security/pam_stack.so): /usr/lib64/security/pam_stack.so: cannot open shared object file: No such file or directory
sshd-session[19991]: PAM adding faulty module: /usr/lib64/security/pam_stack.so
原因:配置了usepam yes,然使用的/etc/pam.d/sshd 是新的,需要使用旧文件替代。
本文参考链接:
https://blog.csdn.net/avatar_2009/article/details/129665320
https://www.cnblogs.com/wzh19820101/p/12095850.html