CentOs7.2升级版本为ssh服务版本 openssh10.5p1,openssl3.6.4 , sudo 1.9.18rc1
服务器版本太老了,有很多漏洞,必须升级openssh10.5p1,openssl3.6.4 , sudo 1.9.18rc1
升级版本为 openssh10.5p1,openssl3.6.4 , sudo 1.9.18rc1
一.环境准备
1.1禁用selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
下载源码包和rpm依赖包:openssh-10.5p1.tar.gz,openssl-3.6.4.tar.gz,sudo-1.9.18rc1.tar.gz,yumRPM7.2.tar.gz
yumRPM7.2.tar.gz包制作是用虚拟机联网下载的
命令:yum install --downloaddir=/root/temp --downloadonly gcc make pam-devel zlib-devel perl-Time-Piece perl-core perl-IPC-Cmd openssl-devel
然后打包压缩temp目录。
二.编译OpenSSL
在 CentOS 7.2 上升到 OpenSSH 10.5p1 + OpenSSL 3.6.4,只能走源码编译
2.1备份:
cp -a /etc/ssh /etc/ssh.bak.$(date +%F)
cp -a /etc/pam.d/sshd /etc/pam.d/sshd.bak
cp -a /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service.bak 2>/dev/null
cp /usr/sbin/sshd /usr/sbin/sshd.orig.bak
cp /usr/bin/ssh /usr/bin/ssh.orig.bak
2.2安装编译依赖:
上传文件 yumRPM7.2.tar.gz
tar -zxvf yumRPM7.2.tar.gz
cd temp
rpm -ivhU * --nodeps --force
2.3编译 OpenSSL 3.6.4(独立目录)
cd /usr/local/src
上传 openssl-3.6.4.tar.gz
tar zxf openssl-3.6.4.tar.gz
cd openssl-3.6.4
# 设置 CFLAGS 环境变量后重新配置
export CFLAGS="-std=gnu99"
./config --prefix=/usr/local/openssl-3.6.4 \
--openssldir=/usr/local/openssl-3.6.4/ssl \
shared zlib
make -j$(nproc)
make install
建统一软链和动态库配置(不要动 /usr/lib64 下的 libssl.so.1.0.2/libcrypto.so.1.0.2):
ln -sf /usr/local/openssl-3.6.4 /usr/local/openssl
echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl-3.6.4.conf
ldconfig
/usr/local/openssl/bin/openssl version
查看输出的版本号:OpenSSL 3.6.4
三.编译 OpenSSH 10.5p1
cd /usr/local/src
上传openssh-10.5p1.tar.gz
tar zxf openssh-10.5p1.tar.gz
cd openssh-10.5p1
mkdir -p /var/empty
./configure \
--prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-pam \
--with-zlib \
--with-ssl-dir=/usr/local/openssl \
--with-sandbox=no \
--with-privsep-path=/var/empty \
--with-privsep-user=sshd
make -j$(nproc)
make install
可能报权限错误;
# 修复权限
chmod 600 /etc/ssh/ssh_host_*_key
chown root:root /etc/ssh/ssh_host_*_key
# 验证
ls -l /etc/ssh/ssh_host_*_key
# 应该看到类似:-rw------- 1 root root ... ssh_host_rsa_key
重新install一次
make install
去掉不支持的功能
sed -i '/^GSSAPIAuthentication/s/^/#/' /etc/ssh/sshd_config
sed -i '/^GSSAPICleanupCredentials/s/^/#/' /etc/ssh/sshd_config
验证二进制链接的是新 OpenSSL:
ldd /usr/local/openssh/sbin/sshd | grep crypto
/usr/local/openssh/bin/ssh -V
查看输出的版本号:OpenSSH_10.5p1, OpenSSL 3.6.4
三.接 systemd 并替换服务
CentOS 7 原 rpm 的 sshd.service 可复用,但要把二进制指到新路径。
id sshd || useradd -r -M -s /sbin/nologin -d /var/empty sshd
chmod 755 /var/empty
vi /usr/lib/systemd/system/sshd.service(覆盖前已备份):
[Unit]
Description=OpenSSH server daemon
After=network.target
[Service]
Type=notify
Environment=LD_LIBRARY_PATH=/usr/local/openssl/lib64
ExecStart=/usr/local/openssh/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
PAM 用原系统文件即可(已备份 /etc/pam.d/sshd)。然后:
# 保留主机密钥:不要 rm /etc/ssh/*,只让新配置覆盖需要的
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" -f /etc/ssh/ssh_host_ed25519_key <<<y 2>/dev/null
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N "" <<<y 2>/dev/null
ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key -N "" <<<y 2>/dev/null
# 确保 sshd_config 关键项
grep -E '^HostKey|^UsePAM|^Subsystem' /etc/ssh/sshd_config
# 没有就补,编辑/etc/ssh/sshd_config:
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePAM yes
Subsystem sftp /usr/local/openssh/libexec/sftp-server
重启系统服务
systemctl daemon-reload
sshd -t -f /etc/ssh/sshd_config
systemctl restart sshd
systemctl status sshd
新建立一个非root用户,如果有非root用户则跳过此步骤,新配置默认禁止root远程登录
useradd zhouxj
passwd zhouxj
visudo 授权zhouxj
新开一个终端验证能登录,再确认版本和服务端口:
ssh -V
/usr/local/openssh/sbin/sshd -V
ss -tlnp | grep :22
五.让系统默认 ssh/sshd 用新版
cp /usr/bin/ssh /usr/bin/ssh.rpm.bak
cp /usr/sbin/sshd /usr/sbin/sshd.rpm.bak
ln -sf /usr/local/openssh/bin/ssh /usr/bin/ssh
ln -sf /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
ln -sf /usr/local/openssh/sbin/sshd /usr/sbin/sshd
六.回滚
如果新 sshd 起不来且无法登录:
systemctl stop sshd
cp /usr/sbin/sshd.rpm.bak /usr/sbin/sshd
cp -a /etc/ssh.bak.* /etc/ssh # 或按需恢复 sshd_config、host keys、pam
systemctl daemon-reload
systemctl restart sshd
七.升级sudo
sudo -V
7.1 备份系统 sudo 相关文件(很重要,出问题可回滚)
cp -a /usr/bin/sudo /usr/bin/sudo.bak.$(date +%F)
cp -a /etc/sudoers /etc/sudoers.bak.$(date +%F)
cp -a /etc/sudoers.d /etc/sudoers.d.bak.$(date +%F)
7.2安装依赖,前面已经安装过了,跳过
7.3编译
cd /usr/local/src
上传文件sudo-1.9.18rc1.tar.gz
tar xzf sudo-1.9.18rc1.tar.gz
cd sudo-1.9.18rc1
# 重新 configure,显式禁用 OpenSSL
./configure \
--prefix=/usr/local/sudo \
--libexecdir=/usr/local/sudo/libexec \
--with-pam \
--with-selinux \
--with-secure-path \
--with-env-editor \
--without-openssl \
--disable-log-server
make -j$(nproc)
make install
7.4装完验证:
/usr/local/sudo/bin/sudo -V | head -1
# 用绝对路径测试提权
/usr/local/sudo/bin/sudo id
测试没问题再做系统切换:
# 软链覆盖(保守)
ln -sf /usr/local/sudo/bin/sudo /usr/local/bin/sudo
# 把 /usr/local/sudo/bin 放到 PATH 最前面,避免用到旧 /usr/bin/sudo
echo 'export PATH=/usr/local/sudo/bin:$PATH' > /etc/profile.d/sudo-rc1.sh
source /etc/profile.d/sudo-rc1.sh
hash -r
sudo -V
查看输出的版本号:sudo 1.9.18rc1
7.5有问题,回滚sudo
cp -a /usr/bin/sudo.bak.$(date +%F) /usr/bin/sudo
cp -a /etc/sudoers.bak.$(date +%F) /etc/sudoers
cp -a /etc/sudoers.d.bak.$(date +%F) /etc/sudoers.d
浙公网安备 33010602011771号