CentOS服务器开发环境与生产环境最大的区别在于组件复杂、开放端口多、人员操作频繁,漏洞专项加固不能只靠“打补丁”这一条路,必须从暴露面、权限、依赖链、审计四个维度同时收紧。很多开发服务器被入侵并不是因为存在某个惊天0day,而是编译工具、调试端口、临时服务、测试账号这些“开发痕迹”长期无人清理,最终变成攻击者的入口。下面直接围绕开发环境常见的高危薄弱点,给出可落地的加固方案。
一、先收紧SSH暴露面,开发机不要裸奔在公网
开发服务器经常需要远程调试,SSH是首先被扫描的目标。第一步要做的是禁止root直接登录,所有运维和开发人员一律使用普通账号,通过sudo提权。修改/etc/ssh/sshd_config:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2
如果团队确实存在密码登录需求,至少要做到限制来源IP,并启用fail2ban。开发环境最容易忽略的是SSH端口暴露在全部网卡上,如果服务器有多块网卡,务必在配置中指定监听内网IP:
ListenAddress 192.168.10.20
同时建议修改默认22端口为高位端口,虽然不算是真正的安全措施,但可以过滤掉大量自动化扫描流量。对于必须从公网访问的开发机,最佳方案是通过堡垒机或跳板机统一入口,不允许开发服务器直接配置公网IP。
二、编译工具链与运行时漏洞专项治理
开发服务器上安装的GCC、GDB、Python、Node.js、OpenJDK、Go等工具链,往往是漏洞重灾区。很多团队只更新业务代码依赖的库,却从不升级编译器和解释器。CentOS 7自带的GCC版本较老,如果业务允许,建议切换到devtoolset或直接升级到CentOS Stream/新版本系统。至少要做到每月执行一次全量安全检查:
yum update --security -y yum check-update --security
对于Python环境,务必区分系统Python和项目Python。系统Python被系统工具依赖,不能随意替换,但开发项目应使用pyenv或virtualenv隔离,并在虚拟环境中单独升级pip、setuptools和wheel。Node.js开发环境要特别注意npm包的间接依赖漏洞,使用npm audit或yarn audit定期扫描,并锁定package-lock.json。Java开发环境要检查OpenJDK小版本,很多安全更新只在小版本号中体现,例如8u292到8u312之间修复了大量TLS和反序列化漏洞。
三、数据库与缓存服务默认配置加固
开发服务器经常本地运行MySQL、Redis、MongoDB等数据库,这些服务默认配置在开发场景下非常危险。Redis如果绑定0.0.0.0且没有密码,等于把内存数据直接暴露给内网任何主机。必须修改redis.conf:
bind 127.0.0.1 protected-mode yes requirepass 一个高强度密码 rename-command FLUSHALL "" rename-command CONFIG ""
MySQL/MariaDB开发实例要删除匿名用户、删除test数据库、禁止远程root登录。即使是开发库,也应为每个开发人员创建独立账号,并只授予对应项目数据库的权限,而不是ALL PRIVILEGES。MongoDB默认无认证的问题在旧版本中非常普遍,必须启用auth并绑定内网IP。开发环境中的数据库不建议直接暴露给办公网,统一走SSH隧道或仅允许跳板机访问。
四、Web中间件与调试端口清理
开发服务器上经常同时运行Tomcat、Nginx、Node、Django、Flask等多个Web服务,调试端口从3000到9000都可能开放。攻击者只要发现一个带调试模式的端口,就可能获取源代码或执行任意命令。重点检查以下内容:
Tomcat要删除默认的manager和host-manager应用,或者修改为强密码并限制访问IP。关闭Tomcat的AJP端口,除非业务明确需要,否则在server.xml中注释掉8009端口。Nginx要隐藏版本号,在http块中加入:
server_tokens off;
Django和Flask的Debug模式绝对不能在非本地环境开启,DEBUG=True会直接暴露堆栈信息和配置变量。Node.js开发服务如果使用nodemon或webpack-dev-server,要确认没有监听0.0.0.0。所有临时启动的服务,用完必须立即停止,不能挂着后台跑一整天。
五、系统服务最小化与防火墙策略
开发服务器的系统服务应该比生产环境更精简,因为开发人员经常安装各种依赖,导致大量服务被自动拉起。使用systemctl list-unit-files --state=enabled查看所有开机自启服务,关闭不需要的:
systemctl disable --now postfix systemctl disable --now rpcbind systemctl disable --now avahi-daemon
防火墙策略要默认拒绝所有入站流量,只放行SSH、Web调试端口和数据库端口,并且数据库端口只对特定内网网段开放。使用firewalld配置示例:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept' firewall-cmd --reload
如果开发服务器上运行Docker,要特别注意Docker会直接操作iptables,绕过firewalld规则。建议在Docker启动参数中限制默认网桥的IP段,并且不要将容器端口映射到0.0.0.0,明确指定宿主机IP,例如-p 127.0.0.1:8080:80。
六、内核参数与文件系统权限加固
开发服务器经常需要测试各种网络功能,但内核参数仍然需要做基础加固。在/etc/sysctl.conf中加入:
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 kernel.randomize_va_space = 2
文件系统权限方面,开发服务器的/tmp目录经常被利用来上传恶意脚本或提权。建议将/tmp挂载为独立分区并加上noexec、nosuid选项。在/etc/fstab中修改:
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
同时检查/var/tmp和/dev/shm,这两个目录也经常被攻击者用作执行目录。开发人员的主目录权限要设置为750,防止其他账号读取源代码或配置文件。项目目录中如果包含.env、config.yml等敏感文件,必须加入.gitignore,并且文件权限设置为600。
七、日志审计与入侵检测
开发服务器不能因为“不是生产”就不做日志审计。至少要做到SSH登录日志、sudo操作日志、关键文件变更日志三类记录。安装并配置auditd:
yum install audit -y systemctl enable auditd systemctl start auditd
添加审计规则,监控敏感文件:
auditctl -w /etc/passwd -p wa -k identity auditctl -w /etc/shadow -p wa -k identity auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config auditctl -w /var/www -p wa -k web_code
对于开发环境,建议部署轻量级的主机入侵检测工具,例如Ossec或Wazuh,重点监控文件完整性变化、异常进程启动和暴力破解行为。如果服务器资源有限,至少配置logwatch定期发送安全日志摘要到管理员邮箱。
八、开发账号与凭据管理
开发服务器上最常见的漏洞不是软件漏洞,而是账号和凭据管理混乱。多人共用同一个开发账号、密码写在代码里、SSH私钥到处拷贝,这些行为都会让前面的加固措施形同虚设。必须做到:
每个开发人员使用独立账号,账号命名规范,离职人员账号立即禁用或删除。使用sudoers文件细化权限,不要把所有开发人员都加入wheel组。例如只允许某个开发人员重启Nginx:
devuser ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
代码仓库中严禁出现任何密码、密钥、token。使用git-secrets或trufflehog在提交前扫描,已经提交的敏感信息要立即轮换。数据库密码、API密钥等敏感配置使用环境变量或配置中心管理,开发环境与生产环境使用完全不同的凭据。
九、容器与虚拟化环境专项加固
现代开发环境大量使用Docker和KVM,容器安全直接关系到宿主机安全。Docker守护进程默认监听Unix socket,不要开启TCP端口2375,如果必须远程管理,使用TLS加密并限制来源IP。容器镜像要从官方或可信源拉取,并在构建时指定具体版本tag,不要使用latest。定期扫描镜像漏洞:
docker scan 镜像名称:tag
运行容器时要加上安全参数,禁止容器获取过多权限:
docker run --read-only --cap-drop=ALL --security-opt=no-new-privileges 镜像名
KVM虚拟机要确保只开启必要的虚拟硬件,关闭不必要的USB重定向和串口设备。虚拟机镜像文件权限设置为600,防止其他用户直接挂载读取。
十、建立周期性漏洞扫描与加固闭环
加固不是一次性动作,开发环境变化快,必须建立周期性的扫描机制。每周执行一次系统漏洞扫描,使用yum-plugin-security或OpenSCAP检查CVE修复情况。每月执行一次端口扫描,确认没有新增的异常监听端口。每季度做一次全面的权限审计,检查账号、sudo规则、文件权限是否仍然合理。
将上述检查项写成脚本,加入crontab自动执行,结果输出到日志文件并发送给安全负责人。只有把漏洞扫描、风险评估、加固实施、复测验证形成闭环,开发服务器的安全状态才能持续保持在可接受的水平。开发环境的安全水位应该向生产环境看齐,而不是因为“只是开发”就放松标准,否则一次入侵就可能导致源代码泄露、数据库被拖库,甚至成为跳板攻击生产环境的桥头堡。
