CentOS服务器的高可用与安全运维,核心不是堆砌多少工具,而是先理清“故障转移”和“安全基线”这两条主线。高可用解决的是服务持续在线的问题,安全架构解决的是谁能访问、访问了什么、出事后能不能追溯的问题。很多团队把精力花在装监控、配防火墙,却忽略了最基础的SSH访问控制和文件完整性校验,导致服务器裸奔在公网上。下面直接拆解一套可落地的架构方案,从系统层、网络层、应用层到数据层逐级加固,同时保证在单点故障时业务能快速切换。

系统层加固:先关掉所有不必要的入口

CentOS安装完成后,第一件事不是装业务软件,而是最小化系统暴露面。检查当前监听的端口,只保留SSH和业务必须的端口,其余全部关闭。使用ss命令查看监听状态:

ss -tulnp | grep LISTEN

对于不需要的服务,比如postfix、chronyd之外的rpcbind、avahi-daemon,直接停止并禁用:

systemctl stop rpcbind.socket
systemctl disable rpcbind.socket
systemctl stop avahi-daemon
systemctl disable avahi-daemon

SSH登录必须禁用root直接登录,改用普通用户加sudo提权。修改/etc/ssh/sshd_config:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

密钥登录要强制使用ed25519或RSA 4096位以上密钥,禁止使用空密码。同时配置fail2ban来防止暴力破解,安装后新建/etc/fail2ban/jail.local,针对sshd设置封禁策略:

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
findtime = 600

内核参数也需要调整,开启SYN cookie防护、禁止ICMP重定向、限制core dump。在/etc/sysctl.conf中追加:

net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
fs.suid_dumpable = 0
kernel.core_uses_pid = 1

执行sysctl -p使其生效。这些配置能显著降低系统被扫描和利用的风险。

网络层隔离与防火墙策略

高可用架构中,网络层要做两件事:一是用防火墙限制东西向流量,二是用虚拟IP实现故障漂移。CentOS 7/8默认使用firewalld,建议直接使用iptables或nftables做精细控制。对于生产环境,最好在云控制台的安全组和本机防火墙做双重限制,只放行业务端口和运维跳板机的IP。

如果业务需要多台服务器组成集群,可以使用Keepalived实现VIP漂移。安装Keepalived后,主节点配置/etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass yourpassword
    }
    virtual_ipaddress {
        192.168.1.100/24 dev eth0
    }
}

备节点将state改为BACKUP,priority改为90。这样当主节点宕机时,VIP会自动漂移到备节点,业务无需修改连接地址。对于数据库等高可用场景,还可以配合MHA或Orchestrator做主从切换,但Keepalived解决的是入口层的高可用。

防火墙策略要明确默认拒绝,只放行必要端口。以iptables为例:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
service iptables save

注意SSH只允许内网或指定跳板机IP访问,不要对全网开放22端口。如果必须远程运维,先通过堡垒机或VPN进入内网,再连接服务器。

应用层高可用:负载均衡与服务健康检查

单台CentOS服务器即使配置再高,也有物理故障的风险。应用层高可用通常采用Nginx或HAProxy做反向代理和负载均衡,后端挂多台应用服务器。Nginx的upstream模块可以配置健康检查:

upstream backend {
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
    keepalive 32;
}
server {
    listen 80;
    server_name yourdomain.com;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 5s;
        proxy_read_timeout 60s;
    }
}

健康检查依赖max_fails和fail_timeout参数,当后端连续3次请求失败,Nginx会将该节点摘除30秒。对于更精细的健康检查,可以使用nginx_upstream_check_module模块,或者用HAProxy的httpchk选项主动探测。

应用层安全还要关注Web应用的漏洞防护。如果运行的是PHP、Java等应用,务必在Nginx层配置请求大小限制、超时限制和过滤规则。例如限制请求体大小防止上传攻击:

client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;

同时配置limit_req模块做请求频率限制,防止CC攻击:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
    limit_req zone=api_limit burst=20 nodelay;
    proxy_pass http://backend;
}

这些配置能有效缓解常见的应用层DDoS和暴力接口调用。

数据层高可用与备份策略

数据是服务器上最核心的资产,高可用架构必须包含数据冗余和可恢复能力。对于MySQL或MariaDB,建议至少配置主从复制,主库写入,从库读和备份。主库配置/etc/my.cnf:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
sync_binlog=1
innodb_flush_log_at_trx_commit=1

从库配置server-id=2,并执行CHANGE MASTER TO指向主库。主从复制虽然不能自动故障切换,但配合MHA或Orchestrator可以实现自动提升从库为主库。对于关键业务,建议至少一主两从,其中一个从库专门用于备份,避免备份影响业务。

备份策略要遵循3-2-1原则:至少3份副本,2种不同介质,1份异地存放。使用Percona XtraBackup做物理热备,配合mysqldump做逻辑备份。每天凌晨执行全量备份,每小时执行增量备份。备份脚本示例:

#!/bin/bash
BACKUP_DIR=/data/backup/mysql
DATE=$(date +%Y%m%d_%H%M%S)
xtrabackup --backup --target-dir=$BACKUP_DIR/full_$DATE --user=backup --password=yourpass --parallel=4
xtrabackup --prepare --target-dir=$BACKUP_DIR/full_$DATE
tar -czf $BACKUP_DIR/full_$DATE.tar.gz -C $BACKUP_DIR full_$DATE
# 上传到异地存储,如对象存储或另一台服务器
rsync -avz $BACKUP_DIR/full_$DATE.tar.gz backup@remote-server:/backup/mysql/

文件系统层面,对于静态文件和配置文件,使用rsync或lsyncd做实时同步,同时配合快照功能。如果是云服务器,定期创建磁盘快照,快照恢复速度远快于文件级备份。

日志审计与入侵检测

安全架构的最后一环是审计和检测。没有日志,出了问题无法追溯。CentOS上必须配置auditd审计系统,记录关键文件和系统调用。安装audit后,配置/etc/audit/rules.d/audit.rules:

-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /var/log/lastlog -p wa -k logins
-w /etc/sudoers -p wa -k sudoers
-w /usr/bin/passwd -p x -k passwd_modification
-a always,exit -F arch=b64 -S execve -k command_exec

重启auditd服务使规则生效。同时安装AIDE做文件完整性校验,初始化数据库:

aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

每天定时执行aide --check,比对文件哈希值,发现异常变动立即告警。对于实时入侵检测,可以部署OSSEC或Wazuh,监控日志中的异常登录、提权行为、可疑命令执行。Wazuh的安装相对简单,配置agent上报到管理端,规则库会自动分析SSH暴力破解、root登录、敏感文件修改等事件。

日志集中管理也很重要。使用rsyslog将多台服务器的日志发送到中央日志服务器,避免单机日志被篡改或删除。在客户端配置/etc/rsyslog.conf:

*.* @192.168.1.200:514

日志服务器上使用Logrotate做日志轮转,保留至少90天。对于关键安全事件,可以配置邮件或企业微信告警,确保第一时间响应。

自动化运维与配置管理

手动运维多台CentOS服务器效率低且容易出错。引入Ansible做配置管理和批量操作,将所有安全基线、软件安装、配置变更写成playbook,确保每台服务器配置一致。例如一个基础安全加固的playbook片段:

- name: Harden SSH configuration
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: "{{ item.regexp }}"
    line: "{{ item.line }}"
  with_items:
    - { regexp: '^PermitRootLogin', line: 'PermitRootLogin no' }
    - { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
    - { regexp: '^MaxAuthTries', line: 'MaxAuthTries 3' }
  notify: restart sshd

通过Ansible Tower或AWX做任务调度和审计,所有变更都有记录。同时将服务器配置纳入Git版本控制,实现基础设施即代码。这样新服务器上线时,一条命令即可完成基础加固,避免人为遗漏。

高可用安全运维架构不是一次性搭建完就结束了,而是一个持续迭代的过程。定期做漏洞扫描、渗透测试、配置复查,根据业务变化调整防火墙策略和资源配额。CentOS 7已经停止维护,建议尽快迁移到Rocky Linux或AlmaLinux,它们与CentOS兼容,且继续提供安全更新。架构的核心是让每一层都有冗余和防护,同时保证运维操作可审计、可回滚,这样才能在故障和安全事件发生时从容应对。