CentOS服务器数据泄露,往往不是因为黑客用了多么高深的0day漏洞,而是最基础的配置项被忽略。默认服务端口敞开着,弱口令年久未改,防火墙规则形同虚设,备份文件就放在网站可访问目录下。这些低级错误每天都在让大量服务器沦陷。解决数据安全问题,必须从这些最容易被攻破的环节入手,把防线建立在每一个具体操作上。
SSH访问控制是第一道闸门绝大多数CentOS服务器的入侵起点都是SSH服务。默认22端口被全网扫描已经是常态,一旦存在弱口令,几分钟内就会被自动攻击程序拿下。修改默认端口是最直接有效的缓解措施。编辑/etc/ssh/sshd_config文件,找到Port 22这一行,改为一个高位端口号,比如49221。同时务必确认PasswordAuthentication设置为no,只允许密钥登录。如果业务场景必须保留密码登录,至少配合fail2ban使用,设置短时间内多次失败即封禁IP的策略。
# 修改SSH端口前先备份配置文件 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 编辑配置文件 vim /etc/ssh/sshd_config # 关键配置项修改 Port 49221 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes
修改完成后执行systemctl restart sshd重启服务,不要关闭当前连接,另开一个终端测试新端口和密钥登录是否正常。很多管理员改完配置直接断开,结果发现连不上了,只能去机房或者通过控制台救援。密钥对管理同样要规范,私钥文件权限必须是600,禁止多人共用同一密钥,离职人员的公钥必须从authorized_keys文件中及时清理。
防火墙策略要精确到端口和来源IPCentOS 7和8默认使用firewalld,但很多运维人员装完系统第一件事就是systemctl stop firewalld然后disable掉,理由是“调试不方便”。这种图省事的做法等于把服务器赤裸裸暴露在公网上。正确的做法是根据业务需求逐条放行。使用firewall-cmd --permanent --add-rich-rule可以指定来源IP访问特定端口,而不是一股脑把端口对全网开放。数据库端口3306、Redis端口6379这类服务,绝对不应该绑定在0.0.0.0上,更不应该对公网放行。如果应用和数据库在同一台服务器,让这些服务只监听127.0.0.1即可。
# 仅允许特定IP访问SSH端口 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.5" port protocol="tcp" port="49221" accept' # 禁止数据库端口对外 firewall-cmd --permanent --remove-port=3306/tcp # 重载规则使其生效 firewall-cmd --reload # 查看当前生效的规则 firewall-cmd --list-all
除了firewalld层面的防护,在应用配置文件里也要做绑定限制。MySQL的my.cnf中设置bind-address=127.0.0.1,Redis的redis.conf中设置bind 127.0.0.1,并且给Redis设置requirepass强密码。每年都有大量因为Redis未授权访问导致服务器被写入SSH公钥或计划任务,进而被完全控制的案例,这种损失完全可以避免。
系统更新与漏洞修补不能拖延CentOS 7已经在2024年6月30日停止维护,CentOS 8更早在2021年底就结束了生命周期。继续运行这些已停更的系统,意味着新发现的漏洞永远不会得到官方补丁。还在使用这些版本的服务器,应该尽快迁移到Rocky Linux、AlmaLinux或者直接转向Ubuntu Server等持续维护的发行版。如果短期无法迁移,至少要把yum源切换到vault.centos.org,确保已发布的补丁都能打上。
# 对于仍在使用CentOS 7的服务器,检查当前内核和系统版本 uname -r cat /etc/centos-release # 更新所有已安装的软件包 yum update -y # 安装安全更新 yum install yum-plugin-security -y yum update --security -y
内核层面的漏洞尤其危险,Dirty Pipe、Dirty COW这类本地提权漏洞,一旦攻击者通过Web应用漏洞获得了低权限shell,就能利用内核漏洞直接提权到root。保持内核版本在较新状态,定期用uname -r检查,配合漏洞扫描工具如lynis进行自动化审计,能大幅降低这类风险。
数据加密要覆盖传输和存储两个维度数据泄露的途径分两种,一种是传输过程中被截获,一种是存储介质被窃取或误配置导致直接暴露。传输层面,全站HTTPS已经是基本要求,但很多内网服务之间还是明文通信。数据库连接、API调用、消息队列通信,在内部网络也应该启用TLS加密。Let's Encrypt提供的免费证书配合certbot工具可以实现自动续签,不存在成本问题。存储层面,敏感数据在数据库中不能明文存放,密码类字段必须使用bcrypt或argon2这类专门设计用于密码哈希的算法,而非简单的MD5或SHA1。对于身份证号、手机号这类需要可逆查询的敏感信息,使用AES-256-GCM模式加密存储,密钥通过环境变量注入而非硬编码在配置文件中。
# 使用openssl生成AES-256密钥 openssl rand -base64 32 > /etc/app/encryption.key # 设置密钥文件权限,仅应用用户可读 chmod 400 /etc/app/encryption.key chown appuser:appuser /etc/app/encryption.key
磁盘加密同样不可忽视。如果服务器托管在IDC机房,物理访问是可能发生的。使用LUKS对数据分区进行加密,即使硬盘被拔走也无法读取数据。CentOS安装时可以选择加密磁盘的选项,对于已上线的服务器,cryptsetup-reencrypt工具可以在线加密,但操作前务必做好全量备份。
备份策略决定数据安全的底线数据泄露之外,数据丢失同样是安全事件。勒索病毒加密文件后,如果没有可用备份,要么支付赎金赌对方会解密,要么彻底失去数据。3-2-1备份原则必须严格执行:至少保留3份数据副本,使用2种不同存储介质,其中1份存放在异地。rsync配合cron可以实现自动化增量备份,但要注意备份目标目录的权限设置,不能放在Web可访问路径下。备份文件本身也应该加密,尤其是传输到云存储时。
# 使用rsync进行增量备份并排除无关目录 rsync -avz --delete \ --exclude='/proc' \ --exclude='/sys' \ --exclude='/tmp' \ --exclude='/dev' \ /data/ /backup/data/ # 对备份进行加密压缩 tar czf - /backup/data/ | openssl enc -aes-256-cbc -salt -out /backup/encrypted_backup.tar.gz.enc
定期验证备份的可用性同样关键。很多运维人员每天看备份脚本运行成功就放心了,结果真到恢复时发现备份文件损坏或者不完整。每月至少做一次恢复演练,在隔离环境中把备份完整还原出来,确认业务能正常启动。
日志审计与入侵检测构建感知能力没有日志,被入侵了都不知道。rsyslog默认配置下日志保存在本地,攻击者拿到root权限后第一件事就是清理日志。把关键日志实时转发到独立的日志服务器上,能保留入侵证据并触发告警。auditd可以监控敏感文件的访问行为,比如/etc/shadow、/etc/passwd的读取操作。当检测到异常进程访问这些文件时,说明很可能已经发生了提权行为。
# 安装并配置auditd监控敏感文件 yum install audit -y systemctl enable auditd systemctl start auditd # 添加监控规则 auditctl -w /etc/shadow -p r -k shadow_access auditctl -w /etc/passwd -p rw -k passwd_modify auditctl -w /root/.ssh/authorized_keys -p rw -k ssh_key_modify # 使规则永久生效,写入配置文件 echo "-w /etc/shadow -p r -k shadow_access" >> /etc/audit/rules.d/audit.rules echo "-w /etc/passwd -p rw -k passwd_modify" >> /etc/audit/rules.d/audit.rules
对于Web应用,分析Nginx或Apache的访问日志能发现大量攻击尝试。使用goaccess或ELK套件对日志进行聚合分析,设置异常频率告警。某个IP在短时间内请求大量不同URL,或者请求路径中包含SQL注入特征字符串,这些都应该触发告警通知到运维人员。
应用层安全加固容易被忽视系统层面做得再完善,应用代码存在漏洞一样会导致数据泄露。SQL注入、文件上传漏洞、不安全的反序列化,这些OWASP Top 10里的老问题至今仍然普遍存在。运维层面能做的是部署WAF进行虚拟补丁,ModSecurity配合OWASP核心规则集可以拦截大量已知攻击模式。对于PHP应用,php.ini中的危险函数必须禁用,比如exec、system、passthru、shell_exec等,除非业务确实需要,否则一律在disable_functions中列出来。
# PHP安全配置示例 # 编辑/etc/php.ini expose_php = Off display_errors = Off log_errors = On allow_url_fopen = Off allow_url_include = Off disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
文件权限遵循最小化原则。Web目录的所有者不应是运行Web服务的用户,这样即使应用存在上传漏洞,攻击者也无法直接修改已有文件。上传目录单独设置,禁止执行脚本权限。使用chattr +i给关键配置文件加不可修改属性,防止攻击者篡改。
容器化环境下的额外考量越来越多的CentOS服务器上运行着Docker容器。容器逃逸是真实存在的威胁,使用root用户运行容器、挂载docker.sock到容器内部、使用privileged模式,这些操作都大幅增加了逃逸风险。容器内应用应以非root用户运行,Dockerfile中使用USER指令指定。宿主机上启用SELinux可以显著增加逃逸难度,CentOS默认的enforcing模式不要关闭。很多人遇到权限问题第一反应就是setenforce 0,这是极其危险的习惯。应该通过ausearch查看SELinux拒绝日志,用semanage和chcon正确配置上下文策略。
# 检查SELinux状态,确保为Enforcing getenforce # 查看SELinux拒绝日志 ausearch -m avc -ts recent # 为Docker数据目录设置正确上下文 semanage fcontext -a -t container_file_t "/data/docker(/.*)?" restorecon -Rv /data/docker
容器镜像的来源也必须受控,只从可信仓库拉取,定期对运行中的容器进行漏洞扫描。docker scan命令可以检测镜像中的已知漏洞,或者集成Clair、Trivy这类开源扫描工具到CI/CD流程中。
权限管理与访问控制细化到人多人管理同一台服务器时,共用root账号是常态,但出了事故无法追溯是谁操作的。应该为每个管理员创建独立账号,通过sudo分配最小必要权限。sudo配置可以精确到具体命令,而不是简单给ALL权限。visudo编辑/etc/sudoers文件,记录每个账号可以执行的操作范围。所有sudo操作都会记录到/var/log/secure中,配合日志审计可以追溯到具体责任人。
# 为管理员创建独立账号 useradd -m -s /bin/bash zhang_admin mkdir -p /home/zhang_admin/.ssh cp authorized_keys /home/zhang_admin/.ssh/ chown -R zhang_admin:zhang_admin /home/zhang_admin/.ssh chmod 700 /home/zhang_admin/.ssh chmod 600 /home/zhang_admin/.ssh/authorized_keys # 配置sudo权限,仅允许执行特定命令 echo "zhang_admin ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx, /usr/bin/tail -f /var/log/nginx/*" >> /etc/sudoers.d/zhang_admin
定期审查服务器上的账号列表,清理已不再需要的账号。检查/etc/passwd中UID为0的账号,正常情况下应该只有root一个。检查空密码账号和过期未使用的账号,用last命令查看登录历史,发现异常登录记录立即排查。
网络隔离与纵深防御架构单台服务器上做再多加固,一旦网络层面没有隔离,攻击者拿下边缘服务器后就能在内网横向移动。通过VLAN划分、安全组规则、iptables主机防火墙,把不同业务、不同安全等级的服务器隔离开。数据库服务器不分配公网IP,仅允许应用服务器通过内网访问。管理端口统一通过堡垒机跳转,堡垒机本身做双因素认证和全程操作录像。这种纵深防御架构下,即使外层Web服务器被攻破,核心数据服务器仍有层层防护。
数据安全防护没有一劳永逸的方案。系统在变化,业务在迭代,攻击手法也在演进。今天做好的加固配置,明天可能因为新部署的应用而出现新的暴露面。把安全巡检纳入日常运维流程,每周检查开放端口变化、账号变更、异常登录记录,每月进行漏洞扫描和备份恢复演练。这些重复性的基础工作,才是杜绝数据泄露最可靠的保障。
