快速开始
从一台干净的 Linux 主机到一个太一实例拦截真实 OWASP CRS 攻击,只需要五分钟。我们会安装签名二进制、启动 tiyi run、创建一个站点,并看 WAF 干活。
前置条件
- Linux amd64 或 arm64。Windows 与 macOS 不是目标主机。
- 用于运行公开二进制安装器的 curl。
- 一个空闲的后端 —— 任何会说 HTTP 的都行。下方示例用 Python 的
http.server。
1. 安装签名二进制
使用权威公开安装器。它会选择匹配的 Linux 发行包、校验 SHA-256 manifest,并把 tiyi 安装到 /usr/local/bin:
$ curl -fsSL https://www.tiyisec.com/install.sh | bash
$ tiyi --version
版本固定、安装目录覆盖与 Gitee 镜像用法见安装。
已有 v3.4.0 或更早安装?不要继续执行新安装流程,也不要在通用 update 后直接重启。必须先完成并验证完整备份,再按 v3.5.3 完整卸载升级指引操作。
2. 运行太一
按你的权限选择一种方式。以 root 运行时默认值即可 —— 状态写入 /var/lib/tiyi,代理绑定 80/443 端口:
$ sudo tiyi run
以普通用户运行(不用 sudo)时,把太一指向可写路径并使用高端口:
$ tiyi run \
--state-db /tmp/tiyi.db \
--caddy-admin-socket /tmp/tiyi-caddy.sock \
--admin-socket /tmp/tiyi-admin.sock \
--proxy-http-addr 127.0.0.1:18080 \
--proxy-https-addr 127.0.0.1:18443
太一会打印一行包含 API 地址、引导管理员密码(仅首次启动显示一次)与 Caddy 管理 socket 路径的 banner:
tiyi v3.5.3 run
api http://127.0.0.1:8080
proxy http://127.0.0.1:18080 https://127.0.0.1:18443
state /tmp/tiyi.db
bootstrap admin password: <random-shown-once>
浏览器打开 http://127.0.0.1:8080/,用 admin 与上面的密码登录。控制台会进入总览。稳定任务区为总览、应用交付、防护策略、节点、事件与日志、检测与响应、监控、系统管理;权限过滤会隐藏空分组,但不会改变深链地址。
引导密码只显示一次。请从终端复制。若丢失,不要删除 state.db:在太一主机通过本地管理 socket 运行 tiyi user list,再运行 tiyi user reset-password <user-id> --password <new>。
自定义管理员密码(可选)
用于自动化、容器镜像或 CI 时,跳过自动生成的密码:在首次启动前设置 TIYI_AUTH_BOOTSTRAP_ADMIN_PASSWORD,太一会原样采用且不打印任何 banner。用户名默认 admin;仅当尚不存在任何用户时才会自动生成密码,因此重启都是空操作。
$ mkdir -p /tmp/waf
$ TIYI_AUTH_BOOTSTRAP_ADMIN_PASSWORD='admin123@xxxxxxm' \
tiyi run \
--addr 0.0.0.0:8080 \
--state-db /tmp/waf/state.db \
--caddy-admin-socket /tmp/waf/caddy.sock \
--proxy-http-addr 0.0.0.0:8180 \
--proxy-https-addr 0.0.0.0:18443 \
--admin-socket /tmp/waf/admin.sock
3. 准备一个后端
在第二个终端启动一个太一可以代理的服务。任何 HTTP 都行 —— 演示用 Python:
$ python3 -m http.server 9000
4. 创建第一个站点
UI 与 CLI 都行。CLI 使用本地管理 socket,无需 token:
# 1. 创建站点并指向演示后端
$ tiyi site create \
--name demo \
--host demo.local \
--upstream-url http://127.0.0.1:9000 \
--tls none
# 创建后站点立即生效。
一步式路径会创建上游池、使用内置 Standard 策略、把站点翻译成 Caddy JSON,并通过管理 socket 热重载 Caddy。任何失败都会保留旧配置并恢复站点行。
5. 验证 WAF 拦截攻击
在第三个终端,向代理端口发出一次基线请求与三个经典攻击:
# 基线 —— 应该通过
$ curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: demo.local" http://127.0.0.1:18080/
200
# SQL 注入
$ curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: demo.local" \
"http://127.0.0.1:18080/?id=1'%20OR%20'1'='1"
403
# XSS
$ curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: demo.local" \
"http://127.0.0.1:18080/?q=<script>alert(1)</script>"
403
# 目录穿越
$ curl -sS -o /dev/null -w "%{http_code}\n" -H "Host: demo.local" \
"http://127.0.0.1:18080/../../../../etc/passwd"
403
在 http://127.0.0.1:8080/#/logs/security 的 dashboard 上,三次拦截请求会立即出现,附带 Coraza 规则 ID、严重等级、攻击标签与匹配的 CRS 消息。Dashboard 的流量曲线实时展现 1:3 基线-拦截比。