OpenSSH源码版本升级亲测支持在RHEL4.x,RHEL5.x,RHEL6.x,RHEL7.x,Suse11.x,Suse12.x 可用,配合saltstack可以批量执行大批量设备openssh版本升级。

希望可以对日常运维处理漏洞工作的童靴有些许帮助,提高工作效率,减少无效工作时间。

#!/bin/bash
#################################################################
######    update openssl openssh scirpt                 #########
#####             Author:kl                                 #####
######           Date:2014/07/13                            #####
######        LastModified:2016/06/02                     #######
####  Warning:start telnet service before use the script    #####
#################################################################
####################################################################################
#            update openssh and openssl
                #########
                  #####
                    ##
####################################################################################
#Determine whether the current system installed gcc compiler tools    
# Test list
# redhat6.3,redhat6.5,redhat6.6,suse11
zlib_version="zlib-1.2.11"
openssl_version="openssl-1.0.2r"
openssh_version="openssh-8.0p1"
#gcc_path=`which gcc`
#gcc_name=`basename $gcc_path`
DATE=$(date +%Y%m%d)
if ! rpm -qa|egrep 'which|util-linux' &> /dev/null || ! rpm -qa|grep util-linux &> /dev/null; then
    echo "which is not installed" && exit
fi
# OS TYPE
#Distributor_ID=$(lsb_release -i)
# OS Version
if which lsb_release &> /dev/null; then
    Distributor=`lsb_release -i|cut -c 17-`
else
    echo "please install redhat-lsb package first." && exit
fi
Distributor_VE=$(lsb_release -a|grep Release|tr -cd '[0-9.]'|cut -d'.' -f1)
# Determine whether the root user
userid=`id -u`
if [ "$userid" -ne 0 ]; then
    echo "sorry,only root can execute the script. "
    exit
fi
# SET SELINUX=disabled
if [ "$Distributor" != "SUSE LINUX" ]; then
    sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
    setenforce 0
# pam-devel,tcp_wrappers-devel need be installed, Otherwise, the software will install failure
# Support for tcpwrappers/libwrap has been removed in openssh6.7 
    if ! rpm -qa|grep pam-devel &>/dev/null; then
        echo "pam-devel is not installed" && exit
    fi
fi
#if ! rpm -qa|grep tcp_wrappers-devel &>/dev/null; then
#    echo "tcp_wrappers-devel not installed" && exit
#fi
#  Check whether to open the telnet service
netstat -tnlp | grep -w 23
RETVAL3=$?
if [ $RETVAL3 -eq 0 ]; then
    echo "telnet service is running------------[yes]"
else
    echo "telnet service is not running--------[no]"
    exit
fi
# Determine whether to install gcc package
if which gcc &> /dev/null; then
    echo "gcc is installed----------------[yes]"
else    
    echo "gcc is not installed------------[no]"
    exit 
fi
# stop sshd service 
netstat -tnlp | grep -w 22
RETVAL4=$?
if [ $RETVAL4 -eq 0 ]; then
    service sshd stop
    echo "stop sshd service --------------[yes]"
fi
if [ -e /etc/init.d/sshd ]; then
cp /etc/init.d/sshd /root
fi
# remove openssh*.rpm if exists
if rpm -qa | grep openssh &> /dev/null;    then
rpm -qa | grep openssh > openssh_list.txt
while read line
do
    rpm -e $line --nodeps
    echo "remove $line success------------[yes]"
done < openssh_list.txt
fi
###########install zlib ##################
tar -zxvf "${zlib_version}.tar.gz" > /dev/null
cd $zlib_version
./configure
RETVAL5=$?
if [ $RETVAL5 -ne 0 ]; then
    echo "Configure zlib has encountered an error"
    exit
fi
make
RETVAL6=$?
if [ $RETVAL6 -ne 0 ]; then
    echo "make zlib has encountered an error"
    exit
fi
make install
cd ..
echo "#########################################################"
echo "################                        #################"
echo "################  zlib install success   #################"
echo "################                        #################"
echo "#########################################################"
sleep 2
########## install openssl #############
tar -zxvf "${openssl_version}.tar.gz" > /dev/null
cd $openssl_version
./config shared zlib
RETVAL7=$?
if [ $RETVAL7 -ne 0 ]; then
    echo "Configure openssl has encountered an error"
    exit
fi
make
RETVAL8=$?
if [ $RETVAL8 -ne 0 ]; then
    echo "make openssl has encountered an error"
    exit
fi
make install 
if [ -e /usr/bin/openssl ]; then
    mv /usr/bin/openssl /usr/bin/openssl.OFF && ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
else
    ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
fi
if [ -e /usr/include/openssl ]; then
    mv /usr/include/openssl /usr/include/openssl.OFF && ln -s /usr/local/ssl/include/openssl /usr/include/openssl
else
    ln -s /usr/local/ssl/include/openssl /usr/include/openssl
fi
## Add "/usr/local/ssl/lib" to /etc/ld.so.conf 
ssl_lib=`grep -w "/usr/local/ssl/lib" /etc/ld.so.conf` 
if [ ! -e "$ssl_lib" ]; then
    echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
fi
ldconfig -v
cd ..
echo "#########################################################"
echo "################                        #################"
echo "################ openssl install sucess  ################"
echo "################                        #################"
echo "#########################################################"
sleep 2
############# install openssh ##############
if [ -e /etc/ssh ]; then
    mv /etc/ssh /etc/ssh_$DATE
fi
tar -zxvf "${openssh_version}.tar.gz" > /dev/null
cd $openssh_version
if [ "$Distributor" != "SUSE LINUX" ]; then
    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-zlib --with-pam --with-ssl-dir=/usr/local/ssl --with-md5-passwords
else
    ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-zlib --with-ssl-dir=/usr/local/ssl --with-md5-passwords
fi
RETVAL9=$?
if [ $RETVAL9 -ne 0 ]; then
    echo "Configure openssh has encountered an error"
    exit
fi
make
RETVAL10=$?
if [ $RETVAL10 -ne 0 -a $RETVAL10 -ne 0 ]; then
        echo "make openssh has encountered an error"
        exit
fi
make install
if [ "$Distributor" == "SUSE LINUX" ]; then
    cd contrib/suse
    cp rc.sshd /etc/init.d/sshd
    chmod +x /etc/init.d/sshd
    chkconfig --add sshd
else
    cd contrib/redhat 
    cp sshd.init /etc/init.d/sshd
    chmod +x /etc/init.d/sshd
    chkconfig --add sshd
fi
#A generic PAM configuration is included as "contrib/sshd.pam.generic",
#you may need to edit it before using it on your system.
cd ..
if [ "$Distributor" != "SUSE LINUX" ]; then
    cp sshd.pam.generic /etc/pam.d/sshd
    sed -i 's/\/lib\/security\///g' /etc/pam.d/sshd
fi
# Modify /etc/ssh/sshd_config
# Backup /etc/ssh/sshd_config
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_bak
# The default set of ciphers and MACs has been altered to
# remove unsafe algorithms. In particular, CBC ciphers and arcfour*
# are disabled by default. 
# Changes since OpenSSH 6.6
echo "KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org" >> /etc/ssh/sshd_config
echo "Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc" >> /etc/ssh/sshd_config
echo "MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha1-96,hmac-md5-96" >> /etc/ssh/sshd_config
# Disable root access via ssh to server
#* The default for the sshd_config(5) PermitRootLogin option has changed from "yes" to "prohibit-password".
#* PermitRootLogin=without-password/prohibit-password now bans all
#interactive authentication methods, allowing only public-key,
#hostbased and GSSAPI authentication (previously it permitted
#keyboard-interactive and password-less authentication if those
#were enabled).
#PermitRootLogin prohibit-password is the default since version 7.0p1
sed -i 's/^#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config
#sed -i '/PermitRootLogin/s/yes/no/' /etc/ssh/sshd_config
sed -i '/PermitRootLogin/s/prohibit-password/no/' /etc/ssh/sshd_config
# Set 'UsePAM no' to 'UsePAM yes' to enable PAM authentication, account processing, 
# and session processing
if [ "$Distributor" != "SUSE LINUX" ]; then
    sed -i '/^#UsePAM no/a UsePAM yes' /etc/ssh/sshd_config
fi
# Start sshd process
service sshd start
# Disable telnet service
if netstat -tnlp | grep -w 22 &> /dev/null; then
    if [[ "$Distributor" =~ "RedHat" && "$Distributor_VE" -eq 7 ]]; then 
        systemctl stop telnet.socket        
    else
        sed -i '/disable/s/no/yes/' /etc/xinetd.d/telnet
                service xinetd restart
    fi
fi
echo "#########################################################"
echo "################                        #################"
echo "################ openssh install sucess  ################"
echo "################                        #################"
echo "#########################################################"
echo "###############   ssh version     ################################################# "
echo "################################################################################### "
sshd -v
echo "#################################################################################### "
echo "#################################################################################### "