# 面板安全自检 —— 说明 ## 新服务器:不用手动做任何事 `install.sh` 在装完面板后**会自己**完成下面全部步骤: 1. 从镜像下载 `check_btpanel.sh` 到 `/root/security-check/` 2. 建立基线 3. 跑一次完整自检并打印结果 4. 安装 `/etc/cron.d/btpanel-security-check`(每日 04:17 自动巡检) 所以你只需要跑一条命令: ```bash curl -sSL https://bt.kajiejie.com/install/install.sh | bash ``` 装完留意最后几行输出 —— 会显示 `首次安全自检通过。`;如果显示 **发现问题**,立即人工检查,别继续用。 ## 已有面板的机器:手动装 ```bash mkdir -p /root/security-check && cd /root/security-check curl -sSLO https://bt.kajiejie.com/tools/check_btpanel.sh curl -sSLO https://bt.kajiejie.com/tools/install-notes.txt chmod 700 check_btpanel.sh bash check_btpanel.sh # 先确认干净 bash check_btpanel.sh --init-baseline # 再建基线 # 装定时巡检 cat > /etc/cron.d/btpanel-security-check <<'EOF' SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 17 4 * * * root /bin/bash /root/security-check/check_btpanel.sh --quiet >> /var/log/btpanel-security-check.log 2>&1 EOF chmod 644 /etc/cron.d/btpanel-security-check ``` ## 检查的 6 项 | # | 检查内容 | 说明 | |---|---|---| | 1 | `requests/api.py` 是否被注入 URL 劫持 | 已知后门就藏在这里 | | 2 | pyenv 全目录是否含 `bt.sb` / `bash.moe` | 该团伙的域名特征 | | 3 | 面板代码是否有新的 URL 重写型注入 | 判断行 + 紧接硬编码 URL 赋值 | | 4 | `install/` `data/` 是否指向非官方源 + `public.sh` md5 | md5 不匹配会导致去外站下载 | | 5 | pip 源是否可信 | pip 源被换 = 后门可复活 | | 6 | 关键文件是否相对基线漂移 | 升级后需重新 `--init-baseline` | ## 常用命令 ```bash bash check_btpanel.sh # 完整输出 bash check_btpanel.sh --quiet # 干净时零输出(cron 用) bash check_btpanel.sh --init-baseline # 建/重建基线 cat /var/log/btpanel-security-check.log # 巡检历史(只在有问题时有内容) ``` ## 注意事项 1. **面板升级后要重新建基线**(`--init-baseline`)—— 升级会覆盖 `class/system.py`、`class/panelPlugin.py` 等,属预期变更。 2. **这些是"已知后门特征"检查,不是完整审计。** 它能发现 `bt.sb` / `bash.moe` 这一族的手法,以及关键文件被改动;但面板自身代码(尤其插件生态)无法用这种方式审计。 3. **第 1 或第 2 项告警 = 后门回归或被变种植入**,立即人工介入,不要继续用面板。 4. 脚本放 `/root/security-check/` 而**不是**面板目录 —— 面板升级会覆盖面板自身文件,放外面才活得下来。 5. 面板入口访问需要正确的 `Host` 头,否则会返回 404(属正常安全设计,排查时别误判)。 --- ## ⚠️ 这个拓扑下的一个致命坑:WAF 会把「隧道源地址」封掉 如果面板前面挂了**反向代理 / 内网穿透**(公网流量经中继转发进来),那么在本机 nginx 看来,**所有公网请求的源 IP 都是同一个**(这里是 `192.168.31.64`)。 面板的网站防火墙(btwaf)**CC 攻击防护**会因此把它当成攻击者,自动加进 `bt_ip_filter` 封锁列表: ``` ipfilter.log: 添加IP:192.168.31.64,过期时间: 7200秒,到封锁列表[bt_ip_filter] iptables: 900 DROP tcp dpt:443 match-set bt_ip_filter src ``` **后果:整个网站的公网访问全断**(连 ICMP 都通、只有 TCP 80/443 被丢包,很容易误判成"中继挂了")。 ### 症状识别 - `https://域名` 超时,但 `ping 中继IP` 正常、`http://本机内网IP` 正常(200) - `ipset list bt_ip_filter` 里有那个隧道源 IP ### 修复 ```bash # 1) 解除封锁 ipset del bt_ip_filter <隧道源IP> echo "-,-" > /dev/shm/.bt_ip_filter # 2) 加进 WAF 白名单(格式:长整数区间) python3 - <<'PY' import json, ipaddress p='/www/server/btwaf/rule/ip_white.json' d=json.load(open(p)); n=int(ipaddress.IPv4Address('<隧道源IP>')) if [n,n] not in d: d.append([n,n]) json.dump(d, open(p,'w')) PY # 3) 加进面板防火墙白名单 # /www/server/panel/data/firewall/whitelist.txt 里追加 # {"ips":["<隧道源IP>"],"remark":"隧道/反代源地址"} # 4) 让 WAF 重新加载 /www/server/nginx/sbin/nginx -s reload ``` ### 为什么必须加白名单 不加白名单,只删封锁列表,**WAF 会立刻重新封**(我实测过:删掉几秒后又回来)。 **装完面板、配好反向代理后,第一件事就是加这个白名单。**