
1. 当 Agent 开始“碰”真实数据安全就不再是选修课AI Agent Harness Engineering 说白了就是给 Agent 套上一套“缰绳和护具”让它能跑、能干活但不会把不该碰的数据带出去。我见过太多团队在本地跑 demo 时一切正常一旦把 Agent 接到真实业务数据上问题立刻暴露日志里明文打印用户手机号、工具调用把整段身份证号塞进 prompt、向量库落盘时没有任何加密。这些不是危言耸听而是 Harness 层缺少统一数据安全策略的典型症状。这篇文章聚焦一个非常具体的落地场景在 TaoToken 统一 Key/API 通道下给 AI Agent 工具链补齐传输加密、存储加密、脱敏处理三层配置。适合正在用 Agent 做 coding、数据分析、客服自动化的开发者尤其是那些已经把 Agent 接进生产数据流、但还没系统梳理过安全边界的团队。读完之后你能拿到可复制的settings.json/config.toml骨架知道每一层该配什么、怎么验证、报错怎么排。需要先明确一点TaoToken 在这里扮演的是统一模型调用通道的角色所有 Agent 对模型的请求都走同一个入口这样加密、脱敏、审计才有统一的施加点。如果每个 Agent 各自直连不同服务安全策略会碎成一地根本没法维护。2. 为什么要在 TaoToken 通道上做三层加固2.1 Agent 数据流的三个暴露面一个典型的 Harness Engineering 场景里数据会经过三个位置Agent 进程与模型服务之间的网络传输、Agent 本地或远端持久化的会话与向量数据、以及进入模型上下文之前的 prompt 组装。这三个位置分别对应传输加密、存储加密、脱敏处理。传输层如果只走明文 HTTP中间任何一个环节都能看到完整请求体包括你塞进去的业务数据。存储层如果会话历史、工具返回结果直接落盘成 JSON磁盘被拿走或者备份泄露就是全量泄露。脱敏层如果缺失用户的手机号、邮箱、订单号会原封不动进入模型上下文既违反最小必要原则也容易被模型“记住”并在后续输出里复现。2.2 TaoToken 统一通道带来的收敛点把模型调用收敛到 TaoToken 之后你只需要在一个地方配置 TLS 校验、在一个地方注入脱敏中间件、在一个地方统一存储格式。这比每个 Agent 自己实现一套要可靠得多。TaoToken 的 API 入口是https://taotoken.net/api本身走 HTTPS但客户端侧的证书校验、超时、重试策略仍然需要你显式配置不能默认信任。注意统一通道的价值在于“策略集中”不是“自动安全”。客户端不校验证书、不脱敏、明文落盘通道再统一也救不了。2.3 三层保障的职责边界传输加密解决“路上不被看”存储加密解决“落地不被读”脱敏处理解决“进模型前不被滥用”。三者不能互相替代。只做传输加密落盘数据依然裸奔只做存储加密prompt 里的敏感字段依然会进模型只做脱敏网络和磁盘依然可被截获。三层同时到位才构成完整闭环。3. 前置准备Key、环境与依赖3.1 获取统一 Key 与接入信息先到 TaoToken 控制台创建 API Key建议按 Agent 用途分 Key比如agent-coding、agent-analytics各一个方便后续按 Key 做审计和限流。创建入口在控制台的 API Keys 页面。拿到 Key 之后不要写进代码仓库用环境变量注入。export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用的是 Claude Code 这类编码 Agent可以参考 ClaudeCodeAnthropic 的接入说明把 base URL 指向统一通道。需要长期跑编码或 Agent 任务的可以了解 Coding Plan它更适合高频调用场景。3.2 依赖安装传输层用httpx或requests都行这里用httpx因为它对 TLS 配置更细。脱敏用presidio-analyzer加自定义规则存储加密用cryptography的 Fernet 做对称加密。pip install httpx cryptography presidio-analyzer presidio-anonymizer python-dotenv3.3 目录结构约定建议把安全相关配置集中到一个目录避免散落各处agent-harness/ config/ settings.json config.toml security/ transport.py storage.py redact.py data/ sessions/ vectors/4. 可复制配置三层加固骨架4.1 settings.json传输与存储总开关{ taotoken: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 60, max_retries: 3, verify_tls: true, ca_bundle: null, min_tls_version: TLSv1.2 }, storage: { session_dir: ./data/sessions, vector_dir: ./data/vectors, encryption: { enabled: true, algorithm: Fernet, key_env: HARNESS_STORAGE_KEY, rotate_days: 30 } }, redaction: { enabled: true, mode: mask, entities: [PHONE_NUMBER, EMAIL_ADDRESS, CREDIT_CARD, ID_CARD, IP_ADDRESS], custom_patterns: [ {name: order_id, regex: ORD-\\d{10}, mask: ORD-**********} ] } }verify_tls必须为true这是传输加密的底线。min_tls_version显式写死避免客户端协商到旧版本。存储加密的 key 从环境变量读绝不落配置文件。4.2 config.toml脱敏与审计细则[redaction] enabled true mode mask # mask | hash | replace fail_closed true # 脱敏失败时拒绝发送而不是放行 log_redacted true # 记录脱敏命中但不记录原文 [redaction.hash] salt_env HARNESS_REDACT_SALT algorithm sha256 [audit] enabled true log_path ./data/audit/agent.log include_prompt_hash true include_response_hash true never_log_raw true [transport] http2 true keepalive_expiry 30fail_closed true是关键。很多脱敏实现遇到解析异常会直接放行原文这在安全上是灾难。宁可拒绝请求也不能把未脱敏数据送出去。4.3 传输加密客户端实现import os import httpx def build_client() - httpx.Client: return httpx.Client( base_urlos.environ[TAOTOKEN_BASE_URL], headers{Authorization: fBearer {os.environ[TAOTOKEN_API_KEY]}}, timeouthttpx.Timeout(60.0, connect10.0), verifyTrue, http2True, limitshttpx.Limits(max_keepalive_connections10, max_connections20), )verifyTrue会使用系统 CA 校验服务端证书。如果你在内网环境有自签 CA把ca_bundle指向你的 CA 文件而不是关掉校验。4.4 存储加密实现import os from cryptography.fernet import Fernet def get_fernet() - Fernet: key os.environ[HARNESS_STORAGE_KEY].encode() return Fernet(key) def save_session(session_id: str, payload: bytes) - None: f get_fernet() token f.encrypt(payload) path f./data/sessions/{session_id}.enc with open(path, wb) as fp: fp.write(token) def load_session(session_id: str) - bytes: f get_fernet() with open(f./data/sessions/{session_id}.enc, rb) as fp: return f.decrypt(fp.read())生成 key 用Fernet.generate_key()然后存进密钥管理服务或环境变量。轮换时保留旧 key 一段时间用于解密历史数据新写入用新 key。4.5 脱敏中间件from presidio_analyzer import AnalyzerEngine from presidio_anonymizer import AnonymizerEngine analyzer AnalyzerEngine() anonymizer AnonymizerEngine() def redact(text: str) - str: results analyzer.analyze(texttext, languageen) if not results: return text return anonymizer.anonymize(texttext, analyzer_resultsresults).text在把用户输入拼进 prompt 之前调用redact()在把工具返回结果写回上下文之前也调用一次。两处都不能漏。5. 验证请求与成功结果5.1 验证传输加密生效用openssl s_client检查 TLS 版本和证书链openssl s_client -connect taotoken.net:443 -tls1_2 -servername taotoken.net /dev/null 2/dev/null | grep -E Protocol|Cipher|Verify期望看到Protocol : TLSv1.2或更高Verify return code: 0 (ok)。如果返回非零说明证书链有问题先解决再继续。5.2 验证存储加密生效写入一条会话后直接读文件应该看到密文而不是明文python -c from security.storage import save_session, load_session save_session(test-001, bphone13800001111) print(open(./data/sessions/test-001.enc,rb).read()[:40]) print(load_session(test-001)) 输出里第一行应该是gAAAAA开头的 Fernet token第二行才是原始明文。如果第一行直接能看到phone说明加密没生效。5.3 验证脱敏生效python -c from security.redact import redact print(redact(联系我 13800001111 或 testexample.com)) 期望输出类似联系我 PHONE_NUMBER 或 EMAIL_ADDRESS。如果原文还在检查entities配置和语言参数。5.4 端到端验证把三层串起来跑一次完整请求确认发往 TaoToken 的 payload 里没有敏感字段落盘文件是密文网络走的是 HTTPS。可以用模型对话页面做一次手动验证观察返回是否正常。6. 本篇常见错排查6.1 TLS 校验失败报错SSLCertVerificationError通常有三种原因系统 CA 过期、代理拦截证书、ca_bundle路径写错。先确认verifyTrue且没有误设ca_bundle。如果是企业内网把正确的 CA 文件路径填进去不要用verifyFalse绕过。6.2 Fernet key 格式错误ValueError: Fernet key must be 32 url-safe base64-encoded bytes说明 key 不是Fernet.generate_key()生成的。不要自己随便写字符串当 key必须用库生成。轮换时新旧 key 要分开管理别混用。6.3 脱敏漏字段Presidio 默认只识别英文实体中文手机号、身份证号需要自定义 recognizer。在custom_patterns里加正则或者注册PatternRecognizer。另外注意fail_closed要打开解析异常时拒绝发送。6.4 请求超时但无报错Agent 场景下 prompt 可能很长默认超时太短会静默重试。把timeout_seconds调到 60 以上max_retries设 3并在日志里记录每次重试的原因。如果持续超时检查是不是脱敏中间件在大文本上耗时过高。6.5 审计日志泄露原文never_log_raw true必须生效。检查日志实现里有没有把prompt或response原文写进去。只记录 hash 和长度不记录内容。这一条踩过坑的团队不少日志系统往往是最容易被忽视的泄露渠道。7. 把三层加固固化进 Agent 工具链三层配置写完只是开始真正难的是让它成为 Agent 工具链的默认行为而不是每次手动记得调用。我的做法是把build_client()、save_session()、redact()封装成 Harness 的基础设施层所有工具调用必须经过这一层不允许绕过。具体来说在 Agent 的 tool wrapper 里统一做三件事出站请求前脱敏、入站响应后脱敏、落盘前加密。任何新增工具只要走 wrapper 就自动获得三层保护。审计日志单独走一条通道只记 hash 和元数据。如果你还在用多个 Key 直连不同服务建议先收敛到 TaoToken 统一通道再按这篇的骨架逐层加固。接入文档里有完整的 API 说明API Keys 页面可以管理你的 Key 轮换。需要验证模型行为是否受脱敏影响时用模型对话做对照测试最直接。长期跑编码和 Agent 任务的Coding Plan 在配额和稳定性上更适合生产使用。最后留一个实用技巧把HARNESS_STORAGE_KEY和HARNESS_REDACT_SALT放进密钥管理服务本地开发用.env但加进.gitignore。每次 CI 跑安全测试时断言落盘文件不含明文关键词、断言发往 TaoToken 的 payload 不含敏感实体。这两条断言能挡住绝大多数回归问题。