为什么写这篇

让 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的折腾,加油!