在Linux服务器运维中,保持关键服务组件的最新版本是基础安全工作之一。最近我在处理一批CentOS服务器的安全加固时,发现系统自带的OpenSSH版本存在已知漏洞,需要进行版本升级。同时,作为常见的Java应用容器,Tomcat的安全配置也不容忽视。下面我将详细记录整个操作过程,包括CentOS 6.6和7.4两个主要版本的OpenSSH升级步骤,以及Tomcat的安全配置要点。
在进行SSH服务升级前,我们必须建立一个备用的远程连接方式,以防升级失败导致服务器无法访问。Telnet是最简单的选择,虽然它本身不够安全,但作为临时应急方案是可行的。
bash复制# 安装telnet服务套件
yum -y install telnet-server*
# 临时关闭防火墙
service iptables stop
chkconfig iptables off
# 启用telnet服务
sed -i 's/\(.*\)disable\(.*\)/\ \ \ \ \ \ \ \ disable\ \ \ \ \ \ \ \ \ =\ no/g' /etc/xinetd.d/telnet
# 允许root通过telnet登录(仅临时)
mv /etc/securetty /etc/securetty.old
# 启动服务
service xinetd start
chkconfig xinetd on
重要提示:完成SSH升级后,务必立即关闭Telnet服务。长期开启Telnet会带来严重安全风险。
OpenSSH 7.9p1对系统环境有以下要求:
检查当前系统环境:
bash复制openssl version
rpm -q zlib
rpm -q zlib-devel
如果输出显示版本符合要求,可以直接进行升级。如果不符合,需要先升级这些依赖库。
bash复制# 安装编译依赖
yum install -y gcc openssl-devel pam-devel rpm-build pam-devel
# 下载源码包
wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.9p1.tar.gz
# 卸载旧版本(强制卸载不检查依赖)
rpm -e `rpm -qa | grep openssh` --nodeps
# 编译安装
cd /usr/local/src/ && tar zxvf openssh-7.9p1.tar.gz && cd openssh-7.9p1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-zlib --with-md5-passwords --with-tcp-wrappers
make && make install
安装完成后,需要对SSH配置进行安全加固:
bash复制# 允许root登录(根据实际安全需求决定)
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin\ yes/g' /etc/ssh/sshd_config
# 禁止空密码登录
sed -i 's/#PermitEmptyPasswords\(.*\)/PermitEmptyPasswords\ no/g' /etc/ssh/sshd_config
# 禁用SELinux(否则可能导致登录失败)
sed -i 's/^SELINUX\(.*\)/SELINUX=disabled/g' /etc/selinux/config
# 添加支持的密钥交换算法
echo 'KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1' >> /etc/ssh/sshd_config
# 初始化脚本处理
cp contrib/redhat/sshd.init /etc/init.d/sshd
chkconfig --add sshd
chkconfig sshd on
service sshd start
升级完成后,验证新版本:
bash复制ssh -V
确认SSH工作正常后,关闭Telnet服务:
bash复制# 恢复securetty设置
mv /etc/securetty.old /etc/securetty
# 停止telnet服务
service xinetd stop
chkconfig xinetd off
# 重新启用防火墙
service iptables start
chkconfig iptables on
CentOS 7的升级过程与6.x版本类似,但服务管理方式有所不同。
bash复制yum -y install telnet telnet-server xinetd
systemctl enable xinetd.service
systemctl enable telnet.socket
systemctl start telnet.socket
systemctl start xinetd
在编译过程中可能会遇到权限问题:
bash复制# 解决密钥文件权限过宽的问题
cd /etc/ssh/
chmod 600 ./*
如果需要修改SSH监听端口或配置多端口监听:
bash复制vi /etc/ssh/sshd_config
# 示例配置:
ListenAddress 172.17.1.23:22
ListenAddress 0.0.0.0:8030
使用root用户运行Tomcat存在严重安全风险。正确做法是创建专用用户:
bash复制# 创建无法登录的系统用户
useradd tomcat -s '/sbin/nologin'
# 设置目录权限
chown -R tomcat:tomcat /deploy/apache-tomcat-7.0.91-qjxm/
chmod -R 744 /deploy/apache-tomcat-7.0.91-qjxm
改造启动脚本以实现普通用户运行:
bash复制# 重命名原始脚本
mv /deploy/apache-tomcat-7.0.91-qjxm/bin/startup.sh /deploy/apache-tomcat-7.0.91-qjxm/bin/startup_.sh
mv /deploy/apache-tomcat-7.0.91-qjxm/bin/shutdown.sh /deploy/apache-tomcat-7.0.91-qjxm/bin/shutdown_.sh
新建startup.sh脚本内容:
bash复制#!/bin/bash
usermod -s /bin/bash tomcat
su - tomcat -c /deploy/apache-tomcat-7.0.91-qjxm/bin/startup_.sh
usermod -s /sbin/nologin tomcat
在tomcat-users.xml中配置管理账号:
xml复制<tomcat-users>
<role rolename="manager"/>
<user username="tomcat" password="t0m@Dog" roles="manager"/>
</tomcat-users>
在web.xml中配置:
xml复制<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在server.xml中配置线程池:
xml复制<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="25"
minSpareThreads="75"/>
备份优先:在进行任何系统级修改前,务必做好完整备份,包括配置文件和数据。
Telnet风险:Telnet会话是明文的,在使用期间应避免传输敏感信息。完成SSH升级后应立即关闭。
SELinux问题:如果系统启用了SELinux,可能需要额外配置才能让新版SSH正常工作。最简单的方案是临时禁用,但生产环境建议学习正确的SELinux策略配置方法。
版本兼容性:不同版本的OpenSSH可能有不同的配置项,升级后应检查所有自定义配置是否仍然有效。
回退方案:准备好旧版本的安装包和配置备份,以便在出现问题时快速回退。
防火墙规则:升级完成后,检查防火墙规则是否会影响新SSH服务的正常运行。
监控检查:升级后应密切监控系统日志,确保没有异常登录尝试或服务故障。
多节点协调:如果是对集群中的服务器进行升级,应采用滚动升级策略,避免同时影响所有节点。
通过以上步骤,我成功将多台服务器的OpenSSH升级到了安全版本,并对Tomcat服务进行了安全加固。整个过程虽然有些复杂,但通过合理的规划和准备,可以最大限度地降低风险。