web服务器运维及安全监控实训报告
web服务器运维及安全监控实训报告
实训第一天,及安我把Nginx装在一台2核4G的全监阿里云ECS上,跑了个静态页面。控实看着浏览器里跳出"Welcome to nginx",训报觉得这活儿挺简单。及安三天后我就不这么想了——日志里翻出两万多条恶意扫描记录,全监Apache的控实access.log被SQL注入payload塞得密密麻麻。那台机器当时还开着22端口的训报弱密码,我现在想起来后背发凉。及安
环境搭建:别小看基础配置
我们的全监实训环境是CentOS 7.9 + Nginx 1.20 + MySQL 8.0 + PHP 7.4,典型的控实LNMP架构。装完之后我做的训报第一件事不是部署应用,而是及安改SSH配置。把PermitRootLogin设成no,全监端口从22换到59222,控实再配合fail2ban。这三步花了我不到十分钟,但后来看日志发现,光是22端口每天就被爆破上千次。如果没改,root密码再强也扛不住。
Nginx的配置我踩了个坑。默认的worker_connections是512,我照着教程改成10240,结果忘了调worker_processes和系统的ulimit。压测的时候502哗哗地冒,查了半天才定位到文件描述符限制。这类问题不亲手撞一次,光看文档记不住。
监控体系:从"裸奔"到有感知
最开始我只看Nginx自带的stub_status,能拿到活跃连接数和请求数。但这玩意儿太粗了。服务器CPU飙到90%的时候,它不会告诉你是什么进程在吃资源,更不会告诉你哪个IP在疯狂请求。
后来上了Prometheus + Grafana + node_exporter的组合。node_exporter采集系统指标,Nginx这边用nginx-prometheus-exporter抓stub_status,再加上mysqld_exporter。Grafana面板一拉出来,CPU、内存、磁盘IO、连接数、QPS全在一张图里。有天晚上十一点多,面板上QPS突然从200跳到3000,我顺着Nginx日志一查,是个爬虫在扫目录。直接在Nginx层加了limit_req,两分钟搞定。
日志分析用的是GoAccess,实时解析access.log,终端里就能看到状态码分布、访客IP排名、请求路径TOP10。比grep+awk手动统计舒服太多。
安全加固:被攻击后才明白的事
实训第五天,我故意把一台测试机暴露在公网,不开任何防护。不到四个小时,MySQL的3306端口就收到了来自荷兰、俄罗斯、巴西的爆破尝试。有个IP用root账户试了六千多次密码,字典里全是"123456""password""admin888"这类。我赶紧把MySQL的bind-address改成127.0.0.1,又加了防火墙规则只允许内网访问。
Web层的防护我做了几件事:Nginx里禁用不必要的HTTP方法,只留GET/POST/HEAD;给敏感目录加deny all;配置CSP头防XSS;用ModSecurity加OWASP规则集拦SQL注入和XSS。ModSecurity的误杀率不低,我调了两天才把正常业务请求放行。但上线之后,日志里每天都能拦下几十次注入尝试,值了。
还有一个容易被忽略的点:文件权限。Nginx的运行用户是nginx,网站根目录的属主是root,权限设成755。上传目录单独挂载,设成noexec。这样就算有人传了webshell上去,也没法执行。
一点个人体会
运维这活儿,纸上谈兵没用。我背过"最小权限原则",但真到配MySQL远程访问的时候,图省事直接grant all on *.*,后来被扫到才后悔。安全监控也一样,工具装了一堆,不盯着看等于没装。Prometheus的告警规则我调了三次才找到合适的阈值,太敏感了半夜被叫醒,太迟钝了出事都不知道。
实训结束那天,我把所有配置整理成Ansible playbook,下次再搭环境一条命令搞定。这大概是我这次最大的收获——把踩过的坑变成可复用的东西,比写一篇漂亮的报告实在得多。