晓波的站站

争做优秀原创个人博客。

安全的升级openssh且不用卸载openssl

前提要求:
一、安装前做好失败后远程链接的准备,可以安装vnc或者telnet的。注意如果防火墙是开着的这一定要关闭或者放通相应的端口。建议最好直接关闭。本升级适用于系统的openssl包正常安装又不想卸载原先的openssl.
二、系统里面要有个可以登录使用的普通账户。防止root用户登录不了,并且用户能提权到root权限。
新建用户方法:
useradd -m ptuser
echo ptuser@2019 | passwd ptuser --stdin
#创建用户密码
三、关闭selinux。
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
getenforce
sestatus 
#查看selinux的状态
四、本次操作基于centos7系列,其他不通系统可能某些命令不一样,请自行更改。
五、开始之前需要确定是否具备编译环境,如果不具备需要安装下面安装包(自行配置源。):
yum install -y gcc gcc-c++ xinetd telnet telnet-server vim lrzsz  zlib-devel pam-devel xorg-x11-xauth
这里依赖包都是我安装的时候需要的功能,有点多因为用到了X11转发的功能,所以要把所有xorg-x11的包都装上,如果不装ssh就没办法使用X11转发的功能。
六、开启telnet:
#编辑xinetd下面的telnet配置文件:
vim /etc/xinetd.d/telnet
#把disable = yes改成no。
systemctl restart xinetd
#重启xinetd服务,xinetd是telnet的守护进程,如果xinetd则telnet也会停止。
如果没有telnet这个文件就新建,内容如下:
# default: yes
# description: The telnet server servestelnet sessions; it uses \
# unencrypted username/password pairs for authentication.
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server =/usr/sbin/in.telnetd
log_on_failure += USERID
disable = no
}
#然后重启xinetd
systemctl restart xinetd
安装好后测试下远程(注意telnet默认不能root登录,需要一个普通用户切换):
telnet localhost
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Kernel 3.10.0-862.el7.x86_64 on an x86_64
xb-ser login: test
Password:
Last login: Sun Jan 27 14:14:15 on pts/0
[test@xb-ser ~]$
七、先执行备份:
cp -r /etc/ssh/ /etc/ssh_bak
cp /usr/sbin/sshd /usr/sbin/sshd.bak
cp /etc/init.d/sshd /etc/init.d/sshd.bak
八、安装前准备三个升级包openssl openssh8.1,如果zlib-devel没装可能就要手动编译了。这里不多做叙述。
九、先安装openssl
tar -xvf openssl-1.0.2o.tar.gz
cd 到openssl目录
cd openssl-1.0.2o
./config --prefix=/usr/local/openssl --shared
#检查配置,必须要加的--shared要不然/usr/lib64/目录下会缺少连接库
echo $? 
#返回0表示上个命令没有异常,其他数字就是有异常需要检查。
make -j4 && make install
#编译,-j4是表示同时执行几个进程,大部分情况下越多越快。
echo $?
#把编译的ssl加入到系统的动态库中
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig
十、开始升级ssh(在此之前一定要确认已经安装zlib-devel的rpm包如果不行就要编译安装一下zlib):
tar -xvf openssh-8.1p1.tar.gz
cd ../openssh-8.1p1
./configure --prefix=/usr/local/openssh  --with-ssl-dir=/usr/local/openssl/ --sysconfdir=/etc/ssh/ --with-ssl-engine --with-md5-passwords --with-pam  --with-xauth=/usr/bin/xauth
#这里的--prefix指的是openssh编译到那个目录,--with-ssl指定的就是刚才编译的openssl位置。--with-xauth是X11转发用到的。
echo $?
make -j4
#上面结果返回0,就执行编译。
echo $?
rpm -e `rpm -qa|grep openssh` --nodeps
#没有问题开始卸载openssh
make install 
echo $? 
#返回0表示安装成功,开始准备下一步工作。
十一、如果做过安全基线的可能需要用到pam认证,就要加上--with-pam。如果用不到就在./configure的时候去掉支持。
创建sshd的pam认证文件,如果加了--with-pam选项就要加上去,不加可能导致所有用户登录不了,切记!!
如果系统有就不需要更改,没有就创建,不想使用pam安全认证就去掉--with-pam。因为每个项目组不一样,有些加固过的机器使用了这个可能导致root或者所有用户都登录不上,需要修改这个试试。
vim /etc/pam.d/sshd
写入如下内容
#%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
十二、创建软连接和开机启动项:
cp contrib/redhat/sshd.init /etc/init.d/sshd
cp contrib/ssh-copy-id /usr/sbin/
cp contrib/ssh-copy-id /usr/bin/
cp -p /etc/ssh_bak/* /etc/ssh/
十三、复制ssh认证密钥和配置文件,可以直接替换。
chmod +x /usr/bin/ssh-copy-id
chmod +x /usr/sbin/ssh-copy-id
chkconfig sshd --add
#添加到chkconfig启动项
chkconfig sshd on
#设置2345级别的开机启动
十四、链接相关可执行文件
ln -s /usr/local/openssh/bin/* /usr/bin/
ln -s /usr/local/openssh/sbin/sshd /usr/sbin/sshd
mkdir /usr/libexec/openssh
ln -s /usr/local/openssh/libexec/* /usr/libexec/openssh/
十五、重启sshd,不重启可能不生效,这步很关键有可能sshd会启动失败,所以开启telnet备用登录很重要。
systemctl restart sshd
如果是centos6的系统就用这种方式,因为6的系统重启不管失败还是成功都会断开所以开启telnet很重要。
service sshd restart &
完成后执行:

ssh -V

看到如下版本信息表明升级完成:

OpenSSH_8.1p1, OpenSSL 1.0.2o 27 Mar 2018

完成升级后,需要用重启sshd服务,并用终端工具远程链接一下,测试是否可用。或者telnet localhost 22查看返回的ssh版本号。
重启之前如果需要恢复之前的配置,可以复制之前的sshd_config配置文件:
cp -p /etc/ssh_bak/sshd_config /usr/local/openssh/etc/sshd_config 
systemctl reload sshd
#重载ssh
注意升级确认没有问题后请关闭telnet即停止xinetd服务。23端口是明文传输所以会被扫描到漏洞。另外如果ssh连接后普通用户无法使用ssh sftp scp等命令的话请确认环境变量优先在/usr/bin/
如果是的话则改变编译目录权限:
chmod 755 -R /usr/local/openssh/
然后使用普通用户重试。

相关问题:

解决ssh的root无法登陆或者更改配置加载缺无法生效的问题(可能是因为检查配置时没有指定--sysconfigdir):
升级后如果sshd_config的配置文件已经允许root用户登录,但是root还是登录不了可以看下面:
首先检查/etc/pam.d/login是不是限制了root的登录,还有就是/etc/ssh/sshd_config配置文件Permitrootlogin yes有没有打开。passwordauthentication yes是否打开。都打开root还是无法直接登陆看下面:
编辑/etc/init.d/sshd
vim /etc/init.d/sshd
找到 $SSHD $OPTIONS && success || failure 在这句话上方加上:(一定要在上面加,其实就是指定了配置文件的环境变量)
OPTIONS="-f /etc/ssh/sshd_config"
如下图:

然后重新启动sshd
systemctl restart sshd

本文由 xiaobo 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

添加新评论