0

    5分钟让你的老旧网站支持IPv6、HTTPS、HTTP/2,不能再多了

    2023.07.29 | admin | 105次围观

    领导让我一个月部署100台服务器,我刚花了一天时间写了个自动化脚本,我现在占着工位吹着空调喝着咖啡刷着抖音看Ansible帮我敲命令,我是不是很没有人性?我接下来29天只能这样玩了我该不该告诉领导?

    注:Ansible不是某个同事的英文名,是一个自动化部署工具,同类型的还有Puppet、Chef、Salt等等。有兴趣以后再介绍。

    本Git代码适用范围

    假设你有一个老旧的Web站点 ,IP地址为IPv4 1.2.3.4 ,你再提供一台配置了IPv6的Ubuntu 18.04 LTS服务器,Clone我的代码,跑一条命令,会帮你把HTTPS和HTTP/2全部配置完毕,然后你测试正常后,修改下DNS,把 dog.xmu.edu.cn 指向新的IPv4和IPv6地址即可。

    中间是无缝的,干净的,测试完备的。时间在5分钟。

    具体步骤

    ● 安装一台Ubuntu 18.04 LTS,配置好IPv6地址。

    ● Clone代码 ,最后会PR到 。

    ● cp hosts.template hosts.real,配置你的服务器IP地址、控制机IP、域名、上游原始IP等信息

    ● 跑一下 ansible-playbook site.yml -i hosts.real --ask-become-pass,5分钟安装完毕

    ● 跑一下 certbot --nginx certonly ,申请一个免费的Lets Encrypt证书。

    ● 再跑下 Ansible脚本,加入HTTPS支持。因为Ansible脚本是幂等的,所以你跑几千次都没问题。

    ● 跑下curl测试,强制域名指向新的IP地址和测试IPv6。curl --resolve dog.xmu.edu.cn:443:2001:da8:e800::42 -I --http2 -6 -v

    ● 如果curl正确,则更改DNS即可。再保险点,本地更改DNS,使用浏览器测试。

    ● 可以考虑提交网站到张焕杰的测试网站 ,肯定是100分以上。

    代码

    代码fork自中科大张焕杰的 ,PR暂时未提交,张焕杰老师的文档对Nginx进行了加固,对系统进行了配置优化,可做为一步步操作手册,了解内部的具体配置机制,张焕杰也带了个sh自动化部署脚本,依赖较少。ansible目录为我编写的无脑自动化部署脚本,依赖Python3,可重复运行,幂等,会不定期同步张焕杰的配置。

    5分钟让你的老旧网站支持IPv6、HTTPS、HTTP/2,不能再多了

    Ansible跑起来类似这样子:

    具体看README.md文档吧,如果真有人用,我考虑再更新,加个GoAccess统计啥的。。。

    如果你问我反代要怎么做,比较政治正确的说法我会告诉你去买大厂的应用交付设备,启用一键断网,并购买完善的维保服务,接收厂商定期的更新和威胁情报,并最终在出安全问题后甩锅给设备和厂商,以避免你在余生中为自己的抠门和不专业而后悔。

    为什么?以我的repo为例,如果你真的反代了你全校的网站,那这个服务器一定要三级等保合规,你需要在上面安装防病毒、恶意代码检测、完整性检查、监控、资源限制、审计,你的日志需要到远程保留3个月,你必须时时更新安全补丁防止CVE漏洞,在Nginx新版发布后必须检查changelog并关闭不必要的功能。为了防止单点故障,你应该需要2台反代,上面安装Keepalived做高可用。为了方便分析,你还需要分析日志。

    这些我改改代码都可以在10分钟内让你完成,但是我的代码你自己审计了么?我是否了解了所有的坑?我是否会偷偷插入一些控制你全部站点的代码?就比如更新免费的HTTPS证书,你在反代上去下载一个.sh文件就跑,安全么?如果为了隔离这个风险,我会使用一台不可变服务器,3个月定期部署他并让他跑起来,使用DNS challenge,在最后得到证书后scp到反代上并且销毁那个服务器。这么折腾为什么不直接花几千元买个一年有效期更高等级的EV证书?

    就算你信任我,但是我也不是铁板一块,如果我被黑了呢?

    所以除非你有足够的自信,否则不推荐,当然张焕杰和我的文档、repo也不是毫无用处,至少你可以借此揭开反代后面神秘的面纱。

    泼了冷水,让我们继续来学习一下其他坑吧。写的比较散,想到哪写到哪web网站重置后打不开,争取这个系列就完结了。

    部署反代不是无创的

    IP地址传递

    部署反代是一定需要的,反代的工作原理导致了你的应用无法得到真实客户端IP地址,所以反代一般会把X-Forwarded-For、X-Real-IP等参数往应用后面传web网站重置后打不开,又由于这个参数是放在Header里的,所以必须应对伪造问题。

    而且反代有时候是多级的,所以反代一定要找到自己的定位,在何时重置X-Forwarded-For、X-Real-IP字段,何时接受信任上级的字段。而应用必须更改自己实现获取客户端IP地址的机制,只接收信任反代发送的Header。这个去年底我写了个案例,就是根据伪造X-Forwarded-For字段来欺骗应用突破IP地址授权验证的。

    应用的Web服务器日志配置也必须修改,否则只能得到反代的地址。有些关于X-Forwarded-For 的网上配置是错误的。有些是简单粗暴用X-Forwarded-For替换掉%h,比如

    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common

    但是这样子也不能解决伪造X-Forwarded-For的问题,所以为了统计分析方便,不建议你直接去更改Log格式,建议你应当生成2个日志,一个是%h的,一个是%{X-Forwarded-For}i。各自分析。

    而如果你在系统里面配置了诸如fail2ban、安全软件等根据IP来封禁的全部必须做相应调整。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论