为什么写这篇
让 AI 自动定投,技术上不难——脚本调 API,定时跑就完了。
但真正折腾的是: 怎么安全地买。
API Key 怎么存?怎么传?谁能碰?每个环节出问题都可能丢钱。
好在有OpenClaw带我跑:怎么搭一条相对安全的自动定投链路。
全流程
每天 8 点定时触发(或 TG 手动触发) ↓ 家里电脑 SSH 到云服务器 ↓ 云服务器从 1Password 实时读取 API Key(内存中,不存文件) ↓ 云服务器直连anan API 执行买入(固定 IP,在白名单里) ↓ 结果回传,推送到 TG
简单点就是电脑只负责发一个指令:”去买”。真正干活的是云服务器——它自己去保险柜拿钥匙,自己开门买东西,买完把收据传回来。钥匙从头到尾没离开过云服务器,但也不保存在云服务器,不经过任何网络传输。
三层设计
第一层:密钥零落盘
问题: API Key 存哪?
大多数教程把 Key 明文写配置文件。电脑被黑、误传 GitHub、别人借电脑——都会泄露。
方案: Key 存 1Password 保险柜,脚本每次通过 op read 临时读取,只在内存存在几秒,用完即弃,磁盘零明文。
白话版:以前钥匙藏花盆下面,现在锁银行保险柜。每次开门去银行取,开完就还。花盆下面永远没钥匙。
关键设计:独立保险库隔离。
我专门为定投创建了一个独立的 1Password 保险库(Vault),里面只放 API Key 这一条数据。云服务器上的访问凭证(Service Account Token)只能打开这一个保险库,看不到我其他任何密码。
第二层:服务器加固
云服务器是整套系统的核心节点,安全尽量做到极致:
SSH 高位端口 + 密钥登录 + 仅内网可达
- 端口从默认 22 改到 5 位数高位端口,避开 99% 的自动扫描
- 禁用密码登录,只认密钥——暴力猜密码彻底失效
- SSH 端口只对 Tailscale 内网开放,公网完全看不到
防火墙零端口暴露
- 整台服务器对公网暴露的端口数量: 零
- 所有管理端口都只允许 Tailscale 内网(100.0.0.0/8)访问
- Fail2Ban 自动封禁恶意 IP,3 次错误锁 1 小时
API Key 每 90 天轮换
- 去重新生成 Key,更新到 1Password 即可
- 脚本从 1Password 实时读取,换 Key 不用改任何代码
这台服务器就像一个隐形的保险箱——公网上看不到它的任何入口,只有通过专属加密通道(Tailscale)才能管理它。
第三层:权限最小化(终极兜底)
就算前两层全部失守,还有最后一道防线:
API 只开”现货交易”,不开”提现”。
如果Key 泄漏能做什么?最多用你的钱买大饼(现货可以设置白名单交易对)。不能API提走。
三层总览
| 层级 | 措施 | 一句话 |
|---|---|---|
| 密钥 | 1Password 零落盘 + 独立保险库 | 钥匙在保险柜,还是单独的保险柜 |
| 服务器 | 高位端口 + 密钥登录 + 零端口暴露 + Fail2Ban | 隐形保险箱,公网看不到 |
| 权限 | 只交易不提 | 信用卡只能消费,不能取现 |
攻击者需要同时:突破 Tailscale 进入内网 → 拿到 SSH 密钥登录服务器 → 找到 1Password 凭证读出 Key → 然后发现……提不了。
架构演进:为什么从五层砍到三层
第一版方案有五层防护:密钥零落盘、Tailscale 加密传输、Nginx 固定 IP 代理、服务器加固、权限最小化。听起来很安全,但实际跑起来问题不少:
- Mac 上的 代理拦截了内网请求,定投失败
- Tailscale 隧道偶尔断连,链路中断
- Nginx 代理配置出错,API 请求被拒
- 五个环节排查问题像在破案
后来想通了一个问题: API Key 为什么要从家里电脑传到云服务器?直接让云服务器自己读不就完了?
于是把脚本搬到了云服务器上。Key 从 1Password 直接读到内存,直连 API。不经过网络传输,不需要加密隧道中转,不需要 Nginx 代理。
链路从 5 个环节缩到 2 个,砍掉了传输层和代理层——不是因为它们不安全,而是 不再需要 。最安全的网络传输,就是不传输。
仍然存在的风险
没有绝对的安全,只能满足自己需求的情况下,尽量提高。
1. 云服务器被入侵/本地Macmini = 全链路失守 所有东西都在这台服务器上——1Password 凭证、脚本、直连。好在:SSH 仅内网可达 + 密钥登录 + Fail2Ban + 公网零端口,被入侵概率极低。
本地Macmini被入侵,就更是失守了,但要记得Macmini依然不要放私密的东西,我是Claude和OpenClaw装在Macmini上,日常用MBP远程调用它们。
2. 有一个凭据仍是明文 1Password 的 Service Account Token 存在服务器本地文件里。总得有一把”开保险柜的钥匙”存在某处。但这把钥匙只能开一个独立保险库,里面只有一条数据。
3. 定期换Key 建议 90 天换一次 API Key。
底线:就算以上全部被利用,攻击者也只能帮你买,提不走。
实际效果
- 磁盘零明文,密钥只在内存存在 3 秒
- 公网零端口暴露
- API Key 不经过任何网络传输
- 搭建成本:已有电脑 + 服务器,额外 0 元
最后
还要注意定投的部分积累到一定程度要转移到硬件。
当然最重要的还是需求导向,定投我是需要的,确定了标的,投入总额,买入时间区间之后,不应该有太多的精力耗费,所以自动化定投也是需要的,之前crcl没买够,现在也是计划这样的方式进行买入。
不准备好最低精力损耗的执行方案的话,很有可能执行打折扣。
链路相关:1Password CLI(感谢远明总的方案) + Tailscale + UFW + Fail2Ban 适用于:任何需要安全调用第三方 API 的自动化场景
一起体验小龙虾OpenClaw的折腾,加油!