2023年9月-博主最近将文档进行了更新,着重更新开机自启部分
2023年1月-博主最近将文档进行了更新,如何去更新和操作过程
- 以前原文已放后面链接:原文:ssh-浅谈openssl和openssh的升级
- 关于linux漏洞升级的科普文章:https://www.cnblogs.com/subsea/p/17055762.html
以下为正文部分:博主项目上要求修复ssh漏洞,于是打算分享openssl和openssh升级的方法。其中有不少踩坑,请大家仔细阅读:本文仅举例Centos7下操作方法,其他环境自行调整
一、 标准升级方法
标准升级就是使用系统源自动更新最新版本,但是Centos7的rpm包只更新到了7.4版本
#在线升级
yum update openssh
#离线升级
rpm -Uvh openssh-7.4p1-22.el7_9.x86_64.rpm
补充:rpm包离线下载推荐网址:RPM Search
二、 手动下载编译包进行升级
压缩包编译安装是linux系统下软件更新的第二种常用方式,软件厂家只需要提供压缩包的源码或者编译程序,适配各系统由用户自行编译,适合于各类系统安装升级
1、 环境说明
2、 检查升级前openssl和openssh版本
3、 安装telnet,防止ssh升级错误无法连接远程
#在线安装
yum install telnet telnet-server xinetd -y
#离线安装telnet-server
1-在有互联网的机器,提前缓存离线包,执行以下命令
mkdir /home/telnet
yum install telnet telnet-server xinetd --downloadonly --downloaddir=/home/telnet
2-将刚才下载的依赖文件夹的安装包拷贝到内网机器进行安装
yum localinstall ./*.rpm -y
#关闭防火墙和selinux
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sestatus
#启动服务
systemctl start telnet.socket
systemctl start xinetd
systemctl status telnet.socket
systemctl status xinetd
systemctl enable telnet.socket
systemctl enable xinetd
#重启服务
echo 'pts/0' >>/etc/securetty
echo 'pts/1' >>/etc/securetty
systemctl restart telnet.socket
systemctl restart xinetd
systemctl status telnet.socket
systemctl status xinetd
#停止服务
systemctl stop telnet.socket
4、 更新openssl
升级前:OpenSSL 1.0.2k-fips 升级后:OpenSSL 1.1.1s(2022-12)
a) 检查当前版本和路径
openssl version
which openssl
b) 安装依赖
#在线安装依赖
yum -y install gcc gcc-c++ zlib zlib-devel perl pam-devel libXt libstdc++-devel
#离线安装依赖
1-在有互联网的机器,提前缓存离线包,执行以下命令
mkdir /home/yilai
yum install gcc zlib zlib-devel gcc perl --downloadonly --downloaddir=/home/yilai
2-将刚才下载的依赖文件夹的安装包拷贝到内网机器进行安装
yum localinstall ./*.rpm
c) 备份之前的ssl文件
注意:不同版本可能源文件的ssl路径不一样,不用在意,主要备份/usr/bin/openssl下即可
#备份以前的文件
#在/home下创建opensslbak作为备份文件夹
mkdir -p /home/opensslbak
cd /home/opensslbak
ll /usr/bin/openssl
ll /usr/include/openssl
mv /usr/bin/openssl /home/opensslbak/
mv /usr/lib64/libssl.so /home/opensslbak/
mv /usr/include/openssl /home/opensslbak/
d) 下载openssl升级包和编译
#下载官网安装包-2022-12
https://www.openssl.org/source/openssl-1.1.1s.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1s.tar.gz --no-check-certificate
#解压并编译安装
tar -xzvf openssl-1.1.1s.tar.gz
cd openssl-1.1.1s/
./config --shared zlib
make && make install
e) 编译后复制到/bin目录使用
#查看新生成文件夹
ls /usr/local/bin/openssl
ls /usr/local/include/openssl
ls /usr/local/ssl
ls /usr/local/lib64/
ls /usr/local/lib64/libssl.so
ls /usr/local/lib64/libcrypto.so
#测试新命令可能会报错,稍后更新下库依赖路径ldconfig后就正常了
/usr/local/bin/openssl version
/usr/local/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
#挂载新的文件
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl/ /usr/include/openssl
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
echo "/usr/local/lib" >> /etc/ld.so.conf
echo "/usr/local/lib64" >> /etc/ld.so.conf
ldconfig
ldconfig -v
#写入新的依赖库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64" >> ~/.bashrc
echo $LD_LIBRARY_PATH
#测试是否正常更新
bash
openssl version
OpenSSL 1.1.1s 1 Nov 2022
5、 升级openssh
升级前:OpenSSH_7.4p1 升级后:OpenSSH_9.1p1
a) 下载新版和备份老的ssh文件
https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.1p1.tar.gz
cd /home/
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.1p1.tar.gz --no-check-certificate
tar xfz openssh-9.1p1.tar.gz
chown -R root:root openssh-9.1p1
cd ./openssh-9.1p1
#备份ssh文件夹
mkdir -pv /home/sshbak
cp -arp /etc/ssh/ /home/sshbak/ssh
cp /etc/ssh/sshd_config /home/sshbak/sshd_config.backup
cp /etc/pam.d/sshd /home/sshbak/sshd.backup
cp /etc/init.d/sshd /home/sshbak/sshd.old
mv /etc/ssh /etc/ssholdbak
ll /home/sshbak/
b) 设置编译参数和编译安装,注意要更新openssl后才能生效
cd ./openssh-9.1p1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/include/openssl --with-ssl-dir=/usr/local/lib64 --with-zlib --with-md5-passwords --with-pam
#./configure
#--prefix=/usr
#--sysconfdir=/etc/ssh #编译后ssh路径
#--with-openssl-includes=/usr/local/include/openssl #有很多xxx.h的文件目录
#--with-ssl-dir=/usr/local/lib64 #有xxx.so的目录
#--with-zlib
#--with-md5-passwords
#--with-pam
make && make install
#升级完成
ssh -V
c) 修改配置文件/etc/ssh/sshd_config,取消注释以下文件
#根据自己需要调整sshd配置文件,参考如下
vim /etc/ssh/sshd_config
32 PermitRootLogin yes #允许root登录,root用户必须添加
41 AuthorizedKeysFile .ssh/authorized_keys #指定公钥文件的保存位置以及名称
57 PasswordAuthentication yes #允许密码验证
82 UsePAM yes #PAM模块
98 UseDNS no #关闭dns检测
109 Subsystem sftp /usr/libexec/sftp-server #开启SFTP并指定路径
d) 检测文件配置测试
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
e) 修改pam认证文件
cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
cat > /etc/pam.d/sshd << 'EOF'
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session optional pam_keyinit.so force revoke
session include password-auth
EOF
f) 添加互信命令文件ssh-copy-id
#mv /usr/bin/ssh-copy-id /home/sshbak/
cd /home/openssh-9.1p1
install -v -m755 contrib/ssh-copy-id /usr/bin
ll /usr/bin/ssh-copy-id
三、 升级后配置openssh开机自启
开机自启网上有很多配置方法,结合博主实测,建议是自行学习后自定义开机systemd文件
1、 使用openssh-9.1p1安装包下脚本,自动生成开机自启脚本
#进入ssh安装包的文件夹里面自带redhat系统的开机脚本
cd /home/openssh-9.1p1
cp -a contrib/redhat/sshd.init /etc/init.d/sshd.init
chmod +x /etc/init.d/sshd.init
/etc/init.d/sshd.init start
#执行启动之后就会自动生成一个服务文件在run/systemd/generator.late/下
ll /run/systemd/generator.late/sshd.init.service
#修改脚本启动类型为simple,防止启动通知服务过程卡死
vim /run/systemd/generator.late/sshd.init.service
[Service]
#类型修改Type=forking为simple,防止启动通知服务过程卡死
Type=simple
#超时时间可以改短一些
TimeoutSec=30s
2、 修改服务文件,生成systemd托管服务
#修改名称sshd.init.service为sshd9.service
cp /run/systemd/generator.late/sshd.init.service /usr/lib/systemd/system/sshd9.service
systemctl daemon-reload
systemctl restart sshd9.service
systemctl status sshd9.service
systemctl enable sshd9.service
cat /usr/lib/systemd/system/sshd9.service
#配置开机自启,如果没有自启,手动挂载软链接开机自启
ln -s /usr/lib/systemd/system/sshd9.service /etc/systemd/system/multi-user.target.wants/sshd9.service
3、 停掉历史ssh服务,重启操作系统并验证
systemctl status sshd.service
systemctl stop sshd.service
systemctl disable sshd.service
#检查是否配置成功
systemctl list-unit-files | grep sshd9
ls /etc/systemd/system/multi-user.target.wants | grep sshd9
ls /usr/lib/systemd/system/ | grep sshd9
openssl version && ssh -V
#重启服务器
reboot
4、 检查版本
5、 部分漏洞需要关闭scp
#查询scp
whereis scp
#备份scp
mkdir /home/scpbak
cp /usr/bin/scp /home/scpbak
#取消权限
chmod a-x /usr/bin/scp
#重命名scp
mv /usr/bin/scp /usr/bin/scpbak
四、 补充:如何自定义systemd托管ssh文件
● 老版本的服务需要先启动sshd-keygen.service
● 但是新版本编译没有这个服务相关文件,如果直接替换就会报错,需要删除
● 将Type=notify改为Type=simple,防止通知一直卡死系统
1、 9.1版本新编写sshdnew.service
vim /usr/lib/systemd/system/sshdnew.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target
[Service]
Type=simple
ExecStart=/usr/sbin/sshd -D
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2、 7.4版本sshd.service原版文件
cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[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
3、 7.4版本sshd-keygen.service文件
vim /usr/lib/systemd/system/sshd-keygen.service
[Unit]
Description=OpenSSH Server Key Generation
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_rsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ecdsa_key
ConditionFileNotEmpty=|!/etc/ssh/ssh_host_ed25519_key
PartOf=sshd.service sshd.socket
[Service]
ExecStart=/usr/sbin/sshd-keygen
Type=oneshot
RemainAfterExit=yes