网站刚上线,流量还没起来,攻击往往先到了。很多人以为初期没啥知名度,黑客看不上,实际上扫描器全天候在网段里随机抓“肉鸡”,根本不在乎你是谁。运营初期最尴尬的地方在于:钱主要花在产品和内容上,服务器配置能省则省,结果访问速度本身就吃紧,再叠加上基础安全策略,CPU和内存直接拉满,页面打开慢两三秒,用户扭头就走。所以这个问题不能分开谈,必须当成一个整体来解,核心思路是“用最小的性能代价,挡住最大概率的攻击”。

把“速度”和“安全”的矛盾点找出来

很多人觉得加了防火墙、装了WAF、开了SSL之后网站变慢,是安全措施必然的代价。其实不完全是。真正拖慢速度的往往不是安全机制本身,而是不合理的部署方式。比如把Web应用防火墙和源站放在同一台服务器上,所有请求都要在本地完成规则匹配和正则解析,单机CPU上下文切换成本极高。再比如SSL握手,如果用的是低版本的TLS和通用RSA证书,每次握手消耗的CPU周期是ECDSA证书的好几倍,在高并发下差别非常明显。所以初期要做的不是削减安全投入,而是把安全能力“外移”和“卸载”。

利用CDN同时解决分发加速和边缘防护

运营初期最值得花的一笔钱,是选一个靠谱的内容分发网络服务商。CDN本质上是一张分布在全球的缓存网络,它天然具备两个能力:静态资源就近分发,降低用户访问延迟;在边缘节点过滤恶意请求,把攻击流量挡在源站之外。配置的时候有几个关键点。第一,把静态资源的缓存时间设长,像图片、CSS、JS文件,直接设7天甚至30天,文件名用哈希版本控制,更新时改名字就行。第二,开启CDN自带的DDoS基础防护和WAF规则集,这些通常提供开箱即用的SQL注入、XSS、跨站请求伪造防护,不需要自己在源站写复杂规则。第三,回源策略一定要做精细化控制,只允许CDN节点IP访问源站的80和443端口,其他所有IP一律在安全组层面拒绝。这样源站对外完全不可见,扫描器根本找不到真实服务器地址。

HTTPS不是可选项,但需要优化TLS配置

现在主流浏览器对所有HTTP网站都会标记“不安全”,用户信任度直接打折。启用HTTPS是基础安全投入里性价比最高的一项,但优化不好确实会拖慢首屏时间。初期配置建议直接上TLS 1.3,它把握手从两次往返压缩到一次,延迟明显降低。证书选择上,优先用ECC证书而不是RSA,256位的ECDSA密钥强度相当于3072位RSA,但计算量小得多,握手速度更快。如果用的是Nginx,可以在配置里把会话复用和OCSP装订打开,减少重复握手的开销。下面是一段典型的Nginx优化配置,兼顾安全和性能:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/ssl/example_ecc.crt;
    ssl_certificate_key /etc/ssl/example_ecc.key;
    ssl_protocols       TLSv1.3;
    ssl_ecdh_curve      X25519:prime256v1;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    ssl_stapling        on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}

这里关闭会话票证是为了避免前向安全性问题,同时用共享缓存和OCSP装订来保证性能。HSTS头则告诉浏览器以后强制走HTTPS,连一次HTTP跳转都省了。

Web应用防火墙做轻量化部署

源站上要不要装WAF,取决于前面有没有CDN。如果已经用了CDN的边缘WAF,源站就不需要再叠加一层全功能WAF,那样等于每个请求做两次规则匹配,纯属浪费。但有一种情况例外:你需要防御的业务逻辑攻击是CDN通用规则覆盖不到的,比如针对特定接口的撞库、薅羊毛、短信轰炸。这时候可以在应用层引入一个极轻量的规则引擎,只对关键接口做校验,而不是全局拦截。具体做法是在Nginx或者OpenResty里用Lua脚本写几个精确匹配规则,比如限制某个登录接口的单IP请求频率,超过阈值直接返回429状态码,连后端应用都不用惊动。这样既不影响整体吞吐,又把最危险的几个口子堵住了。

服务器层面的“零成本”加固

操作系统和Web服务器本身的加固,基本不消耗额外性能,但能挡住一大半自动化扫描。首先是SSH,不要用22默认端口,改成一个高位端口号,禁止密码登录,只允许密钥认证。这不会影响网站访问速度,但能让那些用字典暴力破解的脚本直接失效。其次是Web服务器的版本信息隐藏,Nginx里把server_tokens设为off,Tomcat里重写错误页面的Server头,不让攻击者轻易判断你的技术栈版本。再就是文件上传目录,一定要禁止脚本执行权限。很多人图省事把上传目录设在Web根目录下,结果被人传了一个PHP后门直接拿到shell。正确做法是在Nginx里对这个目录单独配置,只允许静态文件读取,任何脚本请求都返回403。

location /uploads/ {
    location ~* \.(php|jsp|asp|aspx|cgi|pl|py)$ {
        deny all;
    }
}

这些配置几乎不占CPU和内存,写进配置文件里就是永久生效的防护层。

数据库和运行环境的最小权限原则

初期开发为了方便,经常用root账户连接数据库,或者给Web应用分配了ALL PRIVILEGES。这在速度上确实没影响,但安全风险极大。一旦出现SQL注入漏洞,攻击者直接就能拖库或者删表。正确做法是给每个应用单独建一个数据库用户,只赋予SELECT、INSERT、UPDATE、DELETE权限,禁止DROP、ALTER、CREATE这类结构变更操作。连接数据库时,如果应用和数据库在同一台服务器上,用Unix Socket而不要用TCP连接,省去网络协议栈的开销,还避免了把数据库端口暴露在公网上。Redis也是重灾区,默认配置无密码、绑定0.0.0.0,扫到就是肉鸡。必须设置requirepass,绑定内网IP,禁用FLUSHALL和CONFIG这类高危命令。

日志和监控做到“按需开启”

安全日志很重要,但全量记录访问日志对磁盘I/O和CPU是实打实的消耗。初期可以只记录错误日志和关键接口的访问日志,正常静态资源的访问日志直接关闭或者采样记录。Nginx里用access_log off关掉不需要的日志输出,或者用map指令做条件记录,只把特定状态码和特定URI的请求写进日志。安全监控方面,推荐用轻量级的主机入侵检测工具,比如Osquery或者Falco,它们在内核层面做事件采集,对应用性能影响极小,但能实时发现异常进程、异常网络连接和文件篡改。告警通道直接对接企业微信或者钉钉机器人,不需要额外搭建监控中台。

备份策略不能影响在线业务性能

很多新手会在白天业务高峰期做全量数据库备份,结果mysqldump一跑,锁表加上大量磁盘读取,网站直接卡死。备份本身是安全体系里兜底的一环,但执行时机必须避开高峰。数据库用主从架构的话,在从库上做备份,主库完全不受影响。如果只有单机,就用Percona XtraBackup这种热备份工具,它不锁表,对在线业务影响很小。文件备份用rsync做增量同步,只传差异部分,带宽和I/O占用都低。备份文件一定要异地存储,同机备份等于没备,硬盘一坏全丢。对象存储服务现在都很便宜,设置生命周期策略自动清理过期备份,成本几乎可以忽略。

用HTTP/2和Brotli压缩把性能找回来

前面加了不少安全措施,虽然单个消耗不大,但叠加起来还是会吃掉一些性能余量。这时候需要在传输层面做优化把速度补回来。HTTP/2多路复用能在一个TCP连接上并发传输多个文件,减少握手次数,对HTTPS场景下的小文件加载提升尤其明显。Brotli压缩算法比Gzip压缩率高20%左右,文本类资源体积更小,传输更快。Nginx开启Brotli需要编译模块,但编译一次长期受益,值得花这个时间。压缩只对文本类资源开启,图片和视频不要压缩,它们本身已经是压缩格式,再压一遍纯属浪费CPU。

初期投入的优先级排序

如果预算有限,按这个顺序来花:先搞定CDN加HTTPS,这两项把速度和安全的基础框架搭起来;然后做服务器基础加固和最小权限配置,这些不花钱,只需要花时间;接着给关键接口加频率限制,防止撞库和扫描;最后再考虑主机入侵检测和日志监控。每一步做完都跑一下压力测试,确认响应时间没有明显劣化。安全是一个持续叠加的过程,不是一次性买齐所有设备就能高枕无忧。初期用轻量、分布式的思路把防御阵线推到离用户最近的地方,源站只做最核心的业务逻辑处理,这样速度和安全的平衡点自然就找到了。