服务器安全审计:90%漏洞源于三大配置疏漏
|
文章配图,仅供参考 去年国庆,我蹲在三号机房那个漏风的玻璃隔间里盯审计日志,空调坏了三天,墙上贴着张泛黄的“网络安全责任制”——墨迹被蹭掉一半,剩下“责任”俩字歪着。老张端着保温杯进来,杯子上印着“2018年集团攻防演练先进个人”,他吹了吹热气,没看我,先伸手把机柜顶那台老交换机风扇盖掀开,哗啦掉下三粒灰球,其中一粒弹到我刚拆封的《等保2.0配置基线》扉页上。我说服务器安全审计90%漏洞源于三大配置疏漏,老张当场笑出声,后槽牙都露出来了,还顺手从裤兜掏出半包抽了一半的南京,烟盒角翘得像要起飞。他说你先别急着下结论,我昨天刚看见运维小陈用root连进生产Redis,密码是admin123,还顺手把CONFIG SET requirepass改成了空值——不是他忘了设,是他以为“关掉密码就等于关掉风险”。我听见这话的时候正低头扒拉泡面,叉子卡在红油辣子底下一动不动,汤面浮着层凝固的猪油,像块灰黄色薄冰。 第一个疏漏是TLS协议降级:nginx.conf里写着ssl_protocols TLSv1 TLSv1.1 TLSv1.2;SSL Labs扫出来直接标红,但没人点开那个“details”按钮。我就亲眼见过,产品上线前压测,前端老杨坐在隔壁工位,左手敲键盘右手往嘴里塞奥利奥,咔嚓一声,碎渣掉进键盘缝里。他盯着自己写的webpack构建脚本,忽然抬头说:“你们这TLS为啥不配1.3?我们Vue Dev Server都默认开了。”我答:“因为运维平台镜像模板三年没更新,内核不认ChaCha20。”他哦了一声,转头又去调sourcemap路径去了,嘴里还含着半片饼干,说话带脆响。 第二个疏漏是HTTP头硬编码缺失。Content-Security-Policy字段全靠手工拼接,中间空格多一个少一个都导致白名单失效;而更荒谬的是,有个服务居然在Set-Cookie里写了HttpOnly; Secure; SameSite=None —— 然后SameSite=None后面紧跟了个中文分号,是运维小王复制Excel表格时粘过来的。那个分号,在Chrome里静默失效,在Safari里直接拒收整条Cookie。我原以为是个字符编码问题,结果抓包发现它真就是个UTF-8编码的全角分号(U+FF1B),连Wireshark都没识别出来,愣是在Response Headers里潜伏了七个月。 第三个,也是最他妈恶心的那个:日志权限继承错误。/var/log/nginx/access.log明明属组是www-data,却给了755;logrotate一跑完,新切出来的access.log.1就变成root:root、644。某天夜里监控告警说Nginx子进程崩了,排查两小时,才发现是因为日志文件被父进程写满后自动轮转,新文件因权限过高导致worker进程无法追加——于是所有连接都hang在accept() syscall上。那晚雨下得特别闷,窗玻璃全是水痕,像糊了层毛玻璃;我看时间是凌晨两点十七分,微信里老张发来一句:“你看一眼logrotate.d目录下那个nginx文件”,我没回,只是顺手把桌上冷掉的烤肠撕开锡纸,咬了一口,皮韧得咯牙。 那天之后我查过,全站二十一个Web节点,十六个用了同一套Ansible Playbook模板,但其中有九个playbook.yml文件里copy模块少写了mode: '0644'这一行——它们全是从2019年一个实习生上传的Gist里直接clone下来的,Git log显示最后修改人是“jenkins-bot”,提交信息写着“fix lint”。可lint哪管你日志权限?它只校验YAML格式。这个我敢打包票:那行mode参数删掉与否,根本不会触发任何CI报错。但它会让整个服务链在某个凌晨三点零四分突然失语,没人知道为什么。 对了,说到CI……我们去年上季度末其实上了个叫“ConfigGuard”的东西,能自动比对部署前后配置差异,还能高亮敏感字段。结果第一天就爆出两千多个diff,全堆在nginx的proxy_buffering和fastcgi_read_timeout上——全是开发为了压测临时调的。运营催得紧,他们懒得写rollback脚本,就批量把prod环境的config改成跟staging一样,包括那句“fastcgi_read_timeout 300”。我翻git blame看到提交人是“dev-frontend-2022”,头像还是个猫耳QQ秀,名字下面挂着小字“前端实习岗(已离职)”。我点开他的邮箱,退信提示“该用户不存在”。 说实话,“90%漏洞源于三大配置疏漏”这句话,我不敢说准。百分比都是瞎估的,数字没打过桩。但我知道什么叫“优胜劣汰”——不是指技术淘汰人,是指那些会主动补default_type text/html;的人,活下来了;而那个把location ~ \\.php$ { … } 块写在server{}最底下、以为“放哪儿都一样”的人,现在在做外包项目。上周我去喝喜酒,他坐我旁边,夹菜时手机响了,是钉钉语音,我听见对方吼:“PHP-FPM子进程崩了!快看看是不是超时!”他筷子顿住,没接,而是先掏出烟盒抖了根出来,火机打三次才打着。火焰晃了两秒,照见他眼下的青黑——像画上去的。 机房门口那盆绿萝死了快半年,叶尖焦黄卷曲,茎干倒是硬的,摸起来像根干竹签。保洁阿姨每回擦玻璃都绕着它走,说“那玩意儿不吉利”。可没人拔。就像我们也没动那个nginx的ssl_ciphers那行配置——写的是ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384……中间用冒号连着,一共二十八个加密套件。上个月甲方安全扫描又报高危,理由是“包含弱套件”,我们查了六遍,发现原来是最后一个套件后头多打了个英文逗号,nginx不报错,openssl list -cipher也照常返回——但它会悄悄把整个cipher list解析失败,退化到默认套件,而默认套件里确实混着AES128-SHA。这事现在还没修。我今早出门前试了下,还是那样。你要是真想动手,建议先找老张借他保温杯底下垫着的那张便签纸,背面有他手写的修正命令。不过提醒你一句:别信他写在第三行的那个sed替换,他漏了个-i参数,执行完等于没动。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

