主机系统centos7.3.1161升级openssh到当前最新版7.7p1以后使用root用户无法登陆,一直提示用户名密码错误(实际上用户名密码是对的)。下面对这个坑进行说明。
step 1 、升级前提说明:
1、升级OpenSSH后,原有公钥失效,信任关系需要重新配置;
2、升级过程需要停止sshd服务,会导致ssh和sftp无法使用;
3、升级OpenSSH影响的业务有:QDG同步、Mediation及现场自己写的同步脚本等;
4、升级需要关闭防火墙服务;
5、升级需要关闭selinux服务;
6、升级前需要开启telnet,防止升级失败,系统无法登录,对应的防火墙需要开启23端口,安装需要telnet相关包(推荐通过系统ISO安装)
7、升级过程中需要刷新lib库:ldconfig -v;
8、升级顺序:顺序是zlib库-> openssl -> openssh;
9、升级需要gcc、make、perl、zlib、zlib-devel、pam、pam-devel;
step 2 、版本升级说明
zlib-1.2.3 > zlib-1.2.11
OpenSSL 1.0.1e > OpenSSL 1.0.2o
OpenSSH 5.3p1 > OpenSSH 7.7p1
step 3、关闭防火墙和selinux
systemctl status firewalld.service
检查防火墙状态,如果在运行停掉。
systemctl stop firewalld.service
关闭开机自启动
systemctl disable firewalld
step 4 、验证selinux是否关闭
getenforce
setenforce 0
上面只是临时关闭了,重启后不生效。下面改配置文件,使永久生效。
vi /etc/selinux/config
修改:
SELINUX=disabled
保存退出。
step 5、安装包准备
1、软件包下载地址:
zlib下载地址:
http://www.zlib.net/
zlib-1.2.11.tar.gz
https://www.openssl.org/source/
https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/
openssh-7.7p1.tar.gz
2、创建上传目录
# mkdir /soft/zlib
# mkdir /soft/openssl
# mkdir /soft/openssh
3、bin模式上传介质
step 6、开启telnet
临时开启telnet服务,用于升级ssh,同时方总升级ssh过程中主机无法登录。
1、挂载操作系统镜像
2、安装ftp所需系统包
yum -y install xinetd telnet telnet-server
3、改/etc/pam.d/login配置文件
编辑/etc/pam.d/login,注释掉下面这行,允许root用户通过telnet登陆:
#auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
4、编辑/etc/securetty
备份/etc/securetty文件:
cp /etc/securetty /etc/securetty.bak
echo "pts/1" >> /etc/securetty
echo "pts/2" >> /etc/securetty
echo "pts/3" >> /etc/securetty
echo "pts/4" >> /etc/securetty
echo "pts/5" >> /etc/securetty
echo "pts/6" >> /etc/securetty
echo "pts/7" >> /etc/securetty
echo "pts/8" >> /etc/securetty
echo "pts/9" >> /etc/securetty
echo "pts/10" >> /etc/securetty
echo "pts/11" >> /etc/securetty
5、编辑/etc/pam.d/remote
编辑/etc/pam.d/remote,注释下列这行,开启root用户远程登陆:
vi /etc/pam.d/remote
#auth required pam_securetty.so
6、重启telnet和xinetd服务
PS:telnet服务依赖于xinetd服务。
systemctl start telnet.socket
systemctl start xinetd
PS:如果开启了防火墙,需要将23端口(系统默认23为telnet端口)添加到防火墙允许的端口的列表中。
7、开启telnet和xinetd开机自动启动
systemctl enable xinetd.service
systemctl enable telnet.socket
8、验证开机启动
systemctl list-unit-files |grep telnet
systemctl list-unit-files |grep xinetd
step 7、安装openssh升级依赖包
yum -y install gcc make perl zlib zlib-devel pam pam-devel
检查相关依赖包是否安装
rpm -qa | egrep "gcc|make|perl|zlib|zlib-devel|pam|pam-devel"
step 8、正式开始升级openssh
PS: telnet登录操作,升级顺序:zlib库-> openssl -> openssh。
1、停止sshd服务
systemctl stop sshd
systemctl is-active sshd
2、卸载系统里原有Openssh
查看系统原有openssh包
rpm -qa | grep openssh
根据上面查询出的结果,卸载系统里原有Openssh
rpm -e openssh --nodeps
rpm -e openssh-server --nodeps
rpm -e openssh-clients --nodeps
验证
rpm -qa | grep openssh
3、编译安装zlib
解压安装zlib
cd /soft/zlib
tar -xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make&&make install
验证zlib安装是否成功
cd /usr/local/zlib
ll
要包含include、lib、share上个目录。
编辑配置文件/etc/ld.so.conf.d/zlib.conf
vi /etc/ld.so.conf.d/zlib.conf
/usr/local/zlib/lib
刷新库文件
ldconfig -v,刷新库文件,加载刚才编译安装的zlib生成的库文件
ldconfig -v
4、升级OpenSSL
解压安装openssl包
cd /soft/openssl
tar -xzvf openssl-1.0.2o.tar.gz
编译openssl
cd openssl-1.0.2o
./config shared zlib
make
make test
make install
mv /usr/bin/openssl /usr/bin/openssl.OFF
创建ssl相关软连接
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
编辑配置文件/etc/ld.so.conf.d/ssl.conf
vi /etc/ld.so.conf.d/ssl.conf
/usr/local/ssl/lib
刷新库文件
ldconfig -v,刷新库文件,加载刚才编译安装的ssl生成的库文件
ldconfig -v
查看openssl版本
openssl version -a
5、升级OpenSSH
mv /etc/ssh /etc/ssh.bak
解压openssh
cd /soft/openssh
tar -xzvf openssh-7.7p1.tar.gz
cd openssh-7.7p1
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-ssl-dir=/usr/local/ssl --mandir=/usr/share/man --with-zlib=/usr/local/zlib
上面为一行。
make
make install
验证openssh版本
/usr/local/openssh/bin/ssh -V
设置sshd服务开机自动启动
拷贝配置文件
cp /soft/openssh/openssh-7.7p1/contrib/redhat/sshd.init /etc/init.d/sshd
chmod u+x /etc/init.d/sshd
添加sshd服务
chkconfig --add sshd
验证开机启动
chkconfig --list|grep sshd
替换配置文件
cp /soft/openssh/openssh-7.7p1/sshd_config /etc/ssh/sshd_config
编辑sshd_config文件
将subsystem sftp路径变更为实际路径/usr/local/openssh/libexec/sftp-server
vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server
注释掉,换为如下一句:
Subsystem sftp /usr/local/openssh/libexec/sftp-server
拷贝命令
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
拷贝sshd命令至/usr/bin/
cp /usr/local/openssh/bin/ssh /usr/bin/
ssh -V
拷贝ssh-keygen
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
vi /etc/ssh/sshd_config
PasswordAuthentication yes #取消这一行注释
PermitRootLogin yes #添加PermitRootLogin yes行
PS:如果不允许root用户远程直接登录,这里配置为PermitRootLogin no;
重启sshd服务
service sshd restart
systemctl is-active sshd
查看22端口监听
netstat -an |grep LISTEN|grep :22
本地登录测试
ssh root@ocs1
root@ocsdb1[/data/openssh]#ssh root@ocsdb1
root@ocsdb1's password:
Permission denied,please try again.
root@ocsdb1's password:
使用root用户,其实密码是对的,报错。
如果是用普通用户:
root@ocsdb1[/data/openssh]#ssh wufan@ocsdb1
wufan@ocsdb1's password:
Last login: Sat May 19 12:24:33 2018 from 192.168.254.36
wufan@ocsdb1[/home/wufan]$
是可以的。
下面修改:
vi /etc/init.d/sshd
在$SSHD $OPTIONS && success || failure这句话前面加一句:
OPTIONS="-f /etc/ssh/sshd_config"
配置如下:
echo -n $"Starting $prog:" OPTIONS="-f /etc/ssh/sshd_config" $SSHD $OPTIONS && success || failure RETVAL=$?
保存退出。
重启sshd服务:
systemctl restart sshd
再次登录就可以了。