目标:升级目前操作系统的openssh到7.6p1版,升级openssl到1.0.2k版,以提升系统安全性。
当前服务器系统环境:操作系统CentOS 6.8 x64,openssl和openssh都是yum源里最新的版本。
参考文章
1、《linux /centos 中OpenSSL升级方法详解》www.111cn.net/sys/CentOS/61326.htm
2、《升级openssl和openssh》www.cnblogs.com/doomsword/p/3654131.html
3、《OpenSSH平滑升级到6.1操作步骤》www.linuxidc.com/Linux/2014-12/110467.htm
4、《使用最新openssl 1.0.1h 编译安装 openssh 6.6p1》zjwsk.blog.163.com/blog/static/598306132014313112351
较新版本dropbear:https://matt.ucc.asn.au/dropbear/releases/dropbear-2016.74.tar.bz2
较新版本openssl:https://www.openssl.org/source/openssl-1.0.2k.tar.gz
较新版本openssh:http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz
线上服务器可以先用dropbear替代一下ssh以免升级出现错误不能访问,记得防火墙里要放行dropbear所使用的端口。
mkdir /root/tmp && cd /root/tmp && wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2016.74.tar.bz2 && wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz && wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz
简单以5022为dropbear的端口为例,如下操作:
1)下载dropbear源码包,解压
2) ./configure && make && make install
3)生成密钥
mkdir /etc/dropbear && /usr/local/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key && /usr/local/bin/dropbearkey -t rsa -s 4096 -f /etc/dropbear/dropbear_rsa_host_key
4)启动之,dropbear -R -p 5022,这就使用5022端口建立好通道了,iptables里放行一下5022端口就可以测试连接了。推荐先设置成开机自启动,以防openssh升级出现问题连不上了,反正升级成功以后随时都可以去掉并且卸载dropbear。
echo "/usr/local/sbin/dropbear -R -p 5022" >>/etc/rc.local
一些心得:
1、虽然openssl有更新的版本,但是在CentOS 6系列操作系统里,可能有不少相关的软件需要使用源码装高版本的,yum源里的太低,比较麻烦,所以就使用了1.0.2k版本的openssl,在编译前先yum install -y gcc gcc-c++ glibc openssl-devel perl pam pam-devel然后我执行./config --prefix=/usr/local/ssl_102k --openssldir=/usr/local/ssl_102k zlib shared ,其中prefix是库文件存放路径,openssldir是配置文件存放路径,不需要zlib的可以写no-zlib。make后,执行一下make test看到最后停下来,有pass和路径,说明make通过了,再make install。不用考虑卸载旧版的openssl,比如执行rpm -e `rpm -qa |grep openssl` --nodeps定会让你后悔不已!除非你能解决所有的依赖关系(yum等重要工具都是依赖openssl的)不要说我没提醒你哦。
CentOS 5系列甚至4系列,要升级openssl难度会更大。所有依赖的软件都需要源码升级才能正常安装openssl的新版本。比如perl需要新版本,perl-devel需要装的,perl-Test-Simple,还有很多其他的依赖都需要更新,太麻烦了。
make install后,备份旧可执行文件并创建新链接。
要做的动作有重命名原来的openssl执行文件、重命名原来的openssl目录、将新安装的openssl命令创建快捷方式到/usr/bin/openssl、将新安装的openssl目录创建快捷方式到/usr/include/openssl、在/etc/ld.so.conf文件中加入openssl库文件的搜索路径以及修改系统自带的openssl库文件,如/usr/local/lib64/libssl.so(根据机器环境而定,32位系统,就把lib64换成lib)软链到升级后的libssl.so。下面这串儿走起!
mv /usr/bin/openssl /usr/bin/openssl.old && mv /usr/include/openssl /usr/include/openssl.old && ln -s /usr/local/ssl_102k/bin/openssl /usr/bin/openssl && ln -s /usr/local/ssl_102k/include/openssl /usr/include/openssl && echo "/usr/local/ssl_102k/lib" >> /etc/ld.so.conf && ln -s /usr/local/ssl_102k/lib/libssl.so /usr/local/lib64/libssl.so
加载新ssl库文件并查看之
ldconfig -v |grep ssl
查看新ssl版本
openssl version
2、编译openssh。我这样编译的
./configure --prefix=/usr/local/ssh_76p1 --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-ssl-dir=/usr/local/ssl_102k --without-openssl-header-check,否则在不卸载旧openssl的情况下可能会提示openssl的header和library不匹配或者找不到之类的问题。make以后,走下面这串儿,即先备份再make install。
cd /usr/bin ; rm -fr slogin ; mv ssh ssh.old ; mv scp scp.old ; mv sftp sftp.old ; mv ssh-add ssh-add.old ; mv ssh-agent ssh-agent.old ; mv ssh-keygen ssh-keygen.old ; mv ssh-keyscan ssh-keyscan.old ; mv /etc/ssh /etc/ssh.old ; mv /usr/sbin/sshd /usr/sbin/sshd.old ; mv /etc/init.d/sshd /etc/init.d/sshd.old ; cd - && make install
不要卸载老版本的openssh,那可能导致后面/etc/init.d/sshd restart出问题。如果非要卸载,那就用rpm -e `rpm -qa |grep openssh`吧,但是有可能存在依赖关系,挺麻烦的。
3、可执行文件就位
cp /usr/local/ssh_76p1/bin/* /usr/bin/ && cp /usr/local/ssh_76p1/sbin/sshd /usr/sbin/
4、添加服务并设置开机自启sshd服务
进入openssh安装包解压后的目录,cp contrib/redhat/sshd.init /etc/init.d/sshd && chkconfig --add sshd
5、openssh 7.x默认不支持version 1.x协议,所以vim /etc/init.d/sshd,找到/sbin/restorecon /etc/ssh/ssh_host_key.pub,注释掉吧。这个pub文件是不存在的。否则启动服务时候会出现这个报错,/sbin/restorecon: lstat(/etc/ssh/ssh_host_key.pub) failed: No such file or directory。
6、配置文件,7.x跟6.x不同。请vim /etc/ssh/sshd_config,找到#PermitRootLogin prohibit-password,改为PermitRootLogin yes。再找到PasswordAuthentication yes去掉前面的注释。不改就不能用密码登root了。
7、openssh升级完毕了,无论执行/etc/init.d/sshd start|restart|reload,哪个都有风险,可能断开当前连接,然后就连不上了。可以成功连接dropbear的情况下,可以试试service sshd restart
8、sshd服务重启成功了,那恭喜你,已经升级成功;服务起不来了,ssh连接断开了,那就用dropbear连吧,上去再整整。实在不行,确定dropbear已在/etc/rc.local里了,就重启系统试试。
本文转自 朱科强 51CTO博客,原文链接:http://blog.51cto.com/zhukeqiang/1650914,如需转载请自行联系原作者