🔒 网络安全
CSRF vs SSRF 区别
CSRF(跨站请求伪造)
- 攻击目标:服务端 — 让服务器误以为是用户本人发的请求
- 用户已登录网站 A,攻击者诱导用户访问恶意网站 B,网站 B 偷偷向网站 A 发请求,浏览器自动带上 cookie
- 典型场景:已登录银行时点恶意链接 → 转账
- 防御: CSRF Token、SameSite Cookie、检查 Referer/Origin
SSRF(服务器端请求伪造)
- 攻击目标:内网/本地服务 — 让服务器去访问攻击者指定的内部资源
- 服务器本身可以访问内网资源,攻击者通过输入框(URL 上传、webhook)让服务器发起请求
- 典型场景:上传图片时 fetch URL,填
http://169.254.169.254读取云元数据密钥 - 防御: 禁止访问内网 IP(白名单)、禁用 file:// 等协议、内网服务加认证
一句话对比
- CSRF = "借你的手做事"(借用浏览器身份)
- SSRF = "让服务器当跳板"(服务器被诱导访问内网)
fail2ban 入侵防御系统
核心机制
- 本质:日志监控 + 动态防火墙规则系统
- 工作流:监控日志 → 正则匹配 → 触发封禁 → 自动解封
- 架构:server(核心进程)→ filter(正则过滤)→ action(封禁动作)→ jail(策略容器)
关键参数
maxretry:允许的最大失败次数findtime:滑动窗口统计时间(默认600秒)bantime:封禁时长(默认3600秒,负值=永久)ignoreip:白名单(永不封禁的IP/网段)
目录结构
/etc/fail2ban/jail.conf— 默认模板(不要直接改)/etc/fail2ban/jail.local— 自定义配置写这里/etc/fail2ban/filter.d/— 正则过滤器库/etc/fail2ban/action.d/— 动作定义库
安装要点
- Debian/Ubuntu:
apt install fail2ban - RHEL/CentOS:需先装 EPEL,再
dnf install fail2ban - 铁律:自定义配置写在
jail.local或jail.d/,不要改jail.conf
部署步骤(实际操作)
1. 安装 fail2ban
bash
apt install fail2ban -y2. 创建自定义配置文件
bash
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local⚠️ 铁律:不要直接改 jail.conf,自定义配置写 jail.local
3. 编辑 jail.local 配置 SSH 防护
ini
[sshd]
enabled = true
port = ssh
filter = sshd
backend = systemd # 用 systemd 日志后端,不用 logpath
maxretry = 3 # 失败3次就封(默认5次太宽松)
bantime = 86400 # 封禁24小时(默认1小时太短)其他默认值保持:
ignoreip = 127.0.0.1/8 ::1(白名单本机)findtime = 600(10分钟滑动窗口)banaction = iptables-multiport
4. 语法检查 + 启动
bash
fail2ban-client -t # 语法检查
systemctl enable fail2ban # 开机自启
systemctl start fail2ban # 启动服务5. 验证状态
bash
fail2ban-client status # 查看总体状态
fail2ban-client status sshd # 查看 sshd jail 详情高级策略
- recidive jail:对惯犯加码(被封3次以上 → 封7天)
- 递增封禁:bantime 逐次翻倍
- 防火墙兼容:iptables →
iptables-multiport,firewalld →firewallcmd-ipset
管理命令速查
bash
fail2ban-client status # 总状态
fail2ban-client status sshd # sshd jail 详情
fail2ban-client set sshd unbanip <IP> # 手动解封
fail2ban-client set sshd banip <IP> # 手动封禁
fail2ban-client reload # 重载配置
journalctl -u fail2ban -f # 实时日志最佳实践
- 先测后上,用
-t和-n干跑模式 - 白名单别漏(内网、监控、VPN出口)
- 日志路径要对(Debian=auth.log,RHEL=secure)
- 配合防火墙静态规则使用
- 定期检查
/var/log/fail2ban.log防误杀
1Panel 防火墙兼容方案
- 1Panel 底层:Debian 用 UFW,RHEL 用 firewalld
- fail2ban action:Debian 系配
banaction = ufw,RHEL 系配banaction = firewallcmd-ipset - 两者并存:1Panel 管端口静态规则,fail2ban 管 IP 动态封禁,互不干扰
- 配置关键:
jail.local中banaction = ufw(Debian 系)
容器公网暴露的安全评估
场景
Docker 容器把 0.0.0.0:8765:80 暴露在公网,PID 1 跑的是 busybox httpd,根目录 /public/,全是 SVG 静态资源(光伏空调模拟器元件图一类)。
真实风险等级
对服务器/容器本身被攻陷:基本为 0。原因:
- 纯静态文件服务,没有 CGI / FastCGI / 反代 / 数据库 / 接口可注入
- 容器没挂载、无环境变量(连 API key 都没有),容器受损也污染不到宿主
- 用的是 busybox httpd,没有 CGI、没有 SSI、连 directory listing 都没开,攻击面极小
- 容器在 default bridge 网段(172.17.0.2),其他容器要隔离还得靠网络策略
仍然存在的"软风险"
- SVG 内嵌
<script>—— SVG 文件本身支持 JS,公开文件如果哪天被替换了内容,访问者浏览器会被钓鱼/挖矿 - 被爬虫镜像抓走 —— 公开资源站常被卷带宽、内容,对个人项目影响小,对核心资源就是泄漏
- 招来扫描器 —— 1panel 防火墙里已经有公网 IP 被 REJECT,说明这台机长期被全网扫;多开一个端口等于告诉"这有货",增加攻击面感知
- 无访问控制 / 无水印 —— 别人能直接抓你的 SVG 资源、复用、调接口(如果有的话)
判定套路(以后遇到类似问题的快速判断)
- 看 PID 1 的进程类别:busybox httpd / nginx static /
python3 -m http.server→ 静态风险最低 - 看挂载/环境变量:没挂载 + 没 env → 容器翻车污染不到宿主机
- 看端口有没有可注入面:开放 CGI / PHP-FPM / FastCGI / 反代到内网 → 风险高
- 看扫描器流量:INPUT 链 DROP 计数非 0 → 机器已经在被扫,开放端口会放大被人扫的概率
行动建议
- 公开/作品集 → 留着
0.0.0.0暴露,但配合 fail2ban 日志盯异常 - 学习/内部项目 → 改
127.0.0.1:8765:80+ 1panel 反代 + Basic Auth,不走公网直连 - 任何容器:挂载只能给不得不给的,环境变量不要带 secret,PID 1 别用 root 跑复杂进程