很多站长把安全理解成“装个防火墙”,结果主机层一破,防火墙形同虚设。网站安全防护措施真正有效的做法是从主机到程序分层设防,每一层都堵一部分,攻击者任何一层卡住就进不来。下面按四层来讲,每层都给能直接照做的动作。
一、主机层:先守住大门
主机是被忽略的第一道防线。第一,SSH 改成密钥登录、禁用密码登录,并把默认 22 端口换掉,能挡掉绝大多数暴力破解。第二,用防火墙只开放必要端口(80、443、以及你需要的 SSH 端口),其余一律拒绝,数据库端口绝不对外。第三,系统和组件及时打补丁,很多入侵利用的是系统层已知漏洞,不是程序层。第四,关掉用不到的服务和账号,少一个入口少一分风险。主机层做好了,后面程序层即使有小漏洞,攻击者也可能连不上。
二、Web 服务层:挡在程序前面
Web 服务层能拦掉一大批常见攻击。Nginx 里建议做几件事:关目录列表(autoindex off),避免别人遍历你的文件;隐藏版本号(server_tokens off),不告诉攻击者你用的什么版本好对症下手;加上安全响应头,防点击劫持和 MIME 嗅探;限制请求体大小(client_max_body_size),挡大文件上传类攻击。下面这段直接加进站点 server 块,逐项都有注释,照搬后把域名相关部分确认一下即可,效果是对外暴露的攻击面明显变小。
# Nginx 安全响应头与基础加固(加到站点 server 块)
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
server_tokens off; # 隐藏 Nginx 版本号
autoindex off; # 关闭目录列表,防文件遍历
client_max_body_size 8m; # 限制请求体,挡大文件上传
三、程序层:收敛权限与输入
程序层是挂马和跳转最高发的位置。第一,框架和依赖保持更新,第三方库漏洞是入侵主力。第二,所有外部输入做校验和过滤,数据库操作用参数化查询,从根上防注入。第三,上传目录禁止执行脚本,在 Nginx 里对该目录返回 403,上传的图片绝不能被当程序跑。第四,在 php.ini 用 disable_functions 关掉非必要的危险函数(exec、system、passthru 等)。第五,后台路径改掉默认名、加两步验证、限制登录 IP。程序层的要诀是“最小权限”:程序能做的越少,被利用的空间越小。
四、运维层:备份与监控兜底
前三层再扎实,也要假设有一天会失守,所以运维层是兜底。第一,定期备份并异地保存,备份要能真的恢复——光有备份不演练,出事才发现备份是坏的等于没备。第二,上监控告警,文件被改动、流量异常、出现陌生进程都能收到通知。第三,保留并定期审计访问日志和安全日志,出事能追溯。第四,跑最小权限账号,程序不要用 root 跑。下面这段帮你查站点里权限过松的文件:把 ROOT 改成你的目录,它列出“其他用户可写”的文件,这类文件最容易被挂马利用,应当收紧成 644。
# 找出站点目录下权限过松(其他用户可写)的文件,这类文件最容易被挂马利用
import os
ROOT = "/www/example.com" # 改成你的站点根目录
for root, _, files in os.walk(ROOT):
for f in files:
fp = os.path.join(root, f)
try:
mode = os.stat(fp).st_mode & 0o777
except OSError:
continue
if mode & 0o002: # 其他用户可写
print("权限过松:", oct(mode), fp)
四层防护不是装完就完,要定期复查:主机端口有没有多余开放、Nginx 配置有没有被改、程序依赖是不是最新、备份能不能恢复。把这份清单排进月度运维,站点被攻破的概率会低一大截。安全防护的本质不是某一招多厉害,而是每层都堵一点,让攻击者算下来不划算。
相关阅读:
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
