服务启动时冻结部署策略:进程环境变量优先,其次为启动时发现的 MCP 配置,最后为默认值。 运行期间修改环境变量或 .mcp.json 不会改变该策略。修改部署策略后须由管理员重启服务。 部署上限不是启动 session 的只读默认值;需要“部署允许写、session 暂时只读”时, 先配置可写部署上限,再通过 session 工具收紧。
策略比较规则:
| 类型 | 收紧 | 扩大 |
|---|---|---|
IOTDB_ENABLE_* | true → false | false → true |
*_ALLOWED_USERS | 删除用户,* → 指定集合 | 添加用户,指定集合 → * |
IOTDB_SQL_DRIVER_MODE | full → ddl → readonly | readonly → ddl → full |
*CONFIRM* | false → true | true → false |
空用户白名单表示拒绝所有用户。readonly 预设也关闭模型管理。 预设与部署上限取交集,例如部署只允许 alice 时,full 不会把用户白名单改成 *。 显式 policy 中任何一项超过部署上限,整个请求都会被拒绝;不会应用其余项。 混合收紧和扩大的请求作为整体审批,在批准之前不应用其中任何一项。
以下内容仅由管理员配置,普通 MCP 工具不能设置或 reset:
IOTDB_STRICT_PERMISSION_ENFORCEMENTTIMESEEK_MCP_PERMISSION_ENFORCEMENTIOTDB_SQL_DRIVER_EXTRA_READONLY_PREFIXESIOTDB_SQL_DRIVER_EXTRA_DDL_PREFIXESIOTDB_SQL_DRIVER_EXTRA_FULL_PREFIXESSQL 分类扩展项可能把写语句划为只读,因此也不能交给 agent 修改。 关闭严格检查、扩大部署上限或修改 SQL 分类规则的管理员通道是: 在受保护的宿主配置中修改相应项,然后重启 MCP。session 审批命令不具备这些能力。
IOTDB_SESSION_POLICY_APPROVAL_MODE 由管理员在启动时设置:
require(默认):收紧立即生效;扩大需由独立管理员通道批准。allow:允许上限内扩大权限,无需逐次审批。仍不能越过部署上限或修改管理员专属项。set_iotdb_session_policy、replace=true、reset_iotdb_session_policy 均遵循此规则。 重置只读 session 通常会恢复更宽权限,所以也需要审批。 未配置审批目录时,扩大请求返回 approval_unavailable、applied=false,原权限保持不变。 无变化的请求不需要审批。
管理员在 agent 沙箱之外创建目录,并在 MCP 启动环境中配置:
mkdir -m 700 /absolute/protected/iotdb-policy-approvals export IOTDB_SESSION_POLICY_APPROVAL_DIR=/absolute/protected/iotdb-policy-approvals export IOTDB_SESSION_POLICY_APPROVAL_MODE=require export TIMESEEK_MCP_PERMISSION_ENFORCEMENT=strict
目录需由服务运行用户拥有;POSIX 上禁止 group/other 权限。管理员命令在可信终端中 以能访问该目录的服务用户身份运行。Windows 部署需用 ACL 和宿主沙箱落实等效隔离。 不要把目录设在 agent 可写工作区、SQL 结果导出目录或其他工具可写路径中。
agent 请求扩大 session 权限。返回 status=approval_required、applied=false、 request_id、变更前后值和过期时间;此时策略尚未改变。
管理员从可信界面查看请求:
iotdb-policy-admin show REQUEST_ID --directory /absolute/protected/iotdb-policy-approvals
核对具体变更后,从独立管理终端批准或拒绝:
iotdb-policy-admin approve REQUEST_ID --directory /absolute/protected/iotdb-policy-approvals # 或:iotdb-policy-admin deny REQUEST_ID --directory /absolute/protected/iotdb-policy-approvals
agent 重试原始 MCP 调用。服务校验对应审批后才应用变更,返回 applied=true。
源码运行可用 PYTHONPATH=src python3 -m iotdb_mcp_server.policy_approval 替代命令名。 管理命令不会注册为 MCP tool;MCP 调用没有 approved 或 confirm 提权参数。 批准绑定具体变更、部署指纹、策略修订号和运行实例;有效期 5 分钟,仅可消费一次。 策略发生变化、服务重启或请求过期后,旧审批不能用于新的变更。最多保留 32 个待审批请求; 在新申请时清理本实例已过期或旧修订请求。重启遗留文件不会被新实例采纳,可由管理员清理。 审批文件是授权凭据,不是不可篡改审计日志;生产环境可由管理平台另行记录审批者身份。
宿主的 full permission 不会自动改变服务端审批模式。人工审批流程应由宿主在独立权限域 执行,不应把上述审批命令直接交给 agent 自动运行。
同一 OS 用户下,若 agent 具有未受限制的 shell/文件访问,0700 不能隔离它与 MCP。 部署者必须通过沙箱、容器、独立服务身份或可信管理平台,阻止 agent 读写审批目录、 修改部署配置、替换服务代码或自行重启为更宽权限。若这些能力已授权给 agent, 它拥有管理员通道的能力,服务端不能再保证人工审批。普通工具自动批准不能代替此授权。
advisory;要让只读、工具开关和用户白名单成为硬限制,管理员必须启用 TIMESEEK_MCP_PERMISSION_ENFORCEMENT=strict 或 IOTDB_STRICT_PERMISSION_ENFORCEMENT=true。 在 advisory 模式下,session 配置收紧不会提供 SQL 执行隔离保证。confirm_destructive 等布尔值仍是调用者声明,不是可验证的人工审批。 本变更的独立审批针对 session 权限扩大,不是每条危险 SQL 的审批服务。payload.applied 和 payload.status。IoTDB 主仓库的威胁模型补充草案见 iotdb-threat-model-proposal.md。