博客
远程 AI 编程安全最佳实践
当 AI 智能体拥有代码库的写权限,而你通过网络控制它时,安全决策至关重要。以下是做出正确决策的方法。
继续查看该栏目下的产品与工程更新。
浏览此分类远程运行 AI 编程智能体会引入桌面使用时不存在的安全考量。智能体可以访问你的代码库、执行命令、修改文件。手机到 Mac 之间的网络路径可能跨越不受信任的区域。
这不是避免远程 AI 编程的理由,而是理解威胁模型并做出明智决策的理由。大多数风险都可以通过简单直接的实践来管理。
威胁模型
在深入了解缓解措施之前,先明确你要保护什么:
资产:
- 你的源代码(知识产权、配置文件中的密钥)
- 你的开发环境(执行命令的能力)
- Mac 上的 git 凭据和 SSH 密钥
- 你的代码使用的服务 API Key
威胁源:
- 扫描互联网寻找暴露服务的机会主义攻击者
- 共享 WiFi 上的网络窃听者
- 捡到或偷走你手机的人
- 你使用的工具的供应链攻击
攻击面:
- 手机与 Mac 之间的网络连接
- 认证机制
- AI 智能体在文件系统上的权限
- Mac 上运行的服务器进程
第 1 层:网络安全
使用加密连接
局域网模式(ws://): 流量未加密。在你的家庭 WiFi 上这是可以接受的,因为流量不会离开本地网络。在共享或公共网络上则不可接受。
Cloudflare Tunnel(wss://): 流量使用 TLS 加密。任何跨越互联网的连接都应使用此方式。隧道在你的手机和 Cloudflare 边缘之间加密,也在 Cloudflare 和你的 Mac 之间加密。
经验法则: 如果你在自己控制的网络上(家庭、办公室),局域网模式就够了。其他任何地方,使用 Cloudflare Tunnel。
不要暴露原始端口
永远不要在路由器上将端口 8765(或任何端口)转发到你的 Mac 来进行 Tactic Remote 访问。这会将你的服务器直接暴露在互联网上,没有任何中间保护。
Cloudflare Tunnel 完全避免了这个问题——Mac 主动向 Cloudflare 发起出站连接,无需入站端口。
Mac 应用包含防火墙检测功能,会警告你防火墙配置问题。保持 Mac 防火墙启用并开启隐身模式。
第 2 层:认证
API Key 配置
Tactic Remote 使用 API Key 认证 WebSocket 连接:
- 局域网连接: API Key 可选。你的本地网络充当信任边界。
- Cloudflare Tunnel 连接: API Key 必须设置。服务器会拒绝未认证的连接。
API Key 在 WebSocket 握手期间通过 Sec-WebSocket-Protocol 头传输。在 wss:// 下,此过程是加密的。
API Key 最佳实践
- 使用生成的密钥。 Mac 应用会生成一个 32 字符的随机密钥。这比你手动选择的任何密码都更强。
- 安全传输。 使用 QR 码功能将密钥当面传输到你的 iPhone。不要通过邮件、Slack 或短信发送。
- 定期轮换。 如果你怀疑密钥可能已泄露,在 Mac 应用中生成新密钥并更新你的 iPhone。
- 不要重复使用。 不要将 Tactic Remote 的 API Key 用于其他服务。它是单一用途的凭据。
速率限制
服务器包含速率限制中间件,会减慢重复的认证失败尝试。这可以防止对 API Key 的暴力破解攻击。使用 32 字符的随机密钥,暴力破解在计算上是不可行的,但速率限制增加了纵深防御。
第 3 层:访问控制
路径限制
Tactic Remote 支持 CLAUDE_REMOTE_ALLOWED_PATH 环境变量,用于限制 Claude Code 可以访问的目录。将其设置为你的代码目录:
如果不设置,Claude Code 可以访问你的整个主目录(其默认行为)。路径限制可以在出现问题时缩小影响范围。
Claude Code 权限
Claude Code 本身有权限系统。Tactic Remote 中有两种模式可用:
- 标准模式:
claude—— Claude Code 在执行危险操作前会请求审批(文件删除、运行不熟悉的命令) - 跳过权限模式:
claude --dangerously-skip-permissions—— Claude Code 无需询问直接执行。更快,但没有安全网。
远程使用建议: 始终使用标准模式。审批提示在远程使用时尤其有价值,因为你可以从手机上查看建议的操作并点击 Y/N。跳过权限意味着 Claude 可以在你不知情的情况下做任何事——在你不在旁边时很危险。
服务端校验
Tactic Remote 服务器会校验所有传入的命令。lib/validators.js 模块检查:
- 命令格式正确性
- 路径遍历尝试
- 输入长度限制
lib/execSafe.js 模块用安全检查包装命令执行。这些不能替代 Claude Code 自身的权限系统,但在服务器层面增加了一道防御。
第 4 层:物理和设备安全
Mac 安全
你的 Mac 是执行引擎。如果有人获得物理访问权限:
- 他们可以访问你所有的代码
- 他们可以直接控制 Claude Code
- 他们可以从 Mac 应用中读取 API Key
缓解措施:
- 启用 FileVault(全盘加密)
- 使用强登录密码
- 启用自动锁屏(5 分钟或更短)
- 如果在离开 Mac 时运行服务器,确保 Mac 位于物理安全的位置
iPhone 安全
你的 iPhone 是控制界面。如果有人访问了你解锁的手机:
- 他们可以通过 Tactic Remote 向你的 Mac 发送命令
- 他们可以读取你的连接设置,包括 API Key
缓解措施:
- 启用 Face ID 或强密码
- 保持 iOS 更新
- 不要将手机解锁后放在无人看管的地方
第 5 层:操作安全
提示中不要包含什么
从手机向 Claude Code 发送指令时,请记住你的提示会成为对话上下文的一部分。不要包含:
- 提示中的密码或 API Key("使用 API Key abc123 来...")
- 数据库凭据
- 用户或客户的个人信息
改为通过环境变量名引用密钥:"使用 STRIPE_SECRET_KEY 环境变量中的 API Key。"
审批前先审查
当 Claude Code 请求审批(Y/N 提示)时,在点击 Y 之前先阅读它想要做什么。这在远程使用时尤为重要,因为你可能正在分心。常见的审批请求:
- 文件删除
- 运行 shell 命令
- 安装软件包
- 修改配置文件
快速审查只需几秒钟,就能防止意外操作。
监控事件日志
Mac 应用维护着所有 hook 事件的事件日志。定期查看它,确认只有你的会话和命令出现在日志中。意外的活动可能表示未授权的访问。
威胁场景与响应
场景:手机丢失或被盗
风险: 攻击者使用你保存的连接设置访问 Tactic Remote。
响应:
- 从你的 Mac 上立即生成新的 API Key(这会使旧密钥失效)
- 可选择停止服务器,直到情况解决
- 如果无法找回手机,远程擦除手机
场景:API Key 泄露
风险: 有人获得了你的隧道 URL 和 API Key。
响应:
- 在 Mac 应用中生成新的 API Key
- 如果隧道 URL 也暴露了,重启 cloudflared(它会获得一个新的随机 URL)
- 检查事件日志中是否有未授权的会话活动
- 查看最近的 git 历史是否有意外的提交
场景:不受信任的 WiFi 网络
风险: 网络窃听、中间人攻击。
响应: 这在设计上已被处理。Cloudflare Tunnel 使用 TLS,因此流量是加密的。即使在被攻破的网络上,攻击者看到的也是加密的 WebSocket 帧,而不是你的终端内容。
场景:Claude Code 进行了意外修改
风险: AI 智能体修改了你没有预期的内容。
响应:
- 从手机上使用
Ctrl+C中断 Claude - 查看更改:在会话中运行
git diff - 如需回退:
git checkout .或git reset - 这就是 git 版本控制存在的意义——它是你的安全网
安全检查清单
出发远程工作前:
- Cloudflare Tunnel 已启用(用于互联网访问)
- API Key 已设置(32+ 字符随机字符串)
- API Key 通过 QR 码传输(不通过互联网)
- Mac 防火墙已启用
- Mac FileVault 已启用
- Mac 已设置自动锁屏
- iPhone 密码/Face ID 已启用
- Claude Code 运行在标准模式(非
--dangerously-skip-permissions) -
CLAUDE_REMOTE_ALLOWED_PATH已设置以限制文件系统访问 - 开始工作前有近期的 git commit 作为恢复点