跳至主要內容
hs-sql-agent
3.0.0
文件 3.0.0
文件 維運

設定參考

設定獨立 Docker、標準 HsSqlAgent.Hosting 或模組化 HsSqlAgent.Server Host。

必要的秘密保護設定

啟動 Docker 或註冊執行階段前,請設定三組獨立、隨機產生的 32-byte Base64 秘密。所有節點須使用相同金鑰,重新啟動後也須保留。HMAC_KEY 與 JWT_KEY 仍為獨立的簽署秘密。請分別執行三次 openssl rand -base64 32。

Docker 環境變數ASP.NET Core 設定
DB_ENCRYPTION_KEYSecretProtection:DatabasePasswords:Keys:db-1
DML_ENCRYPTION_KEYSecretProtection:DmlPayloads:Keys:dml-1
DML_FINGERPRINT_KEYSecretProtection:DmlFingerprintKey

將 SecretProtection:DatabasePasswords:ActiveKeyId 設為 db-1,SecretProtection:DmlPayloads:ActiveKeyId 設為 dml-1。缺少、無效或重複使用的金鑰會使啟動失敗;範例佔位值刻意設為無效。

HsSqlAgent.Hosting 會自動繫結 SecretProtection;模組化主機須明確繫結:

hs.AddHsSqlAgentRuntime(options =>
{
    builder.Configuration.GetSection("SecretProtection").Bind(options.SecretProtection);
});

新 bootstrap MCP 金鑰須明確提供 Bootstrap:Databases:*:McpKeys:*:Key,啟動時不再產生或記錄金鑰。既有加密資料庫密碼須重新輸入。變更既有部署前,請閱讀升級指南。

憑證儲存與金鑰輪替

資料庫密碼以 AES-256-GCM 加密,並繫結用途與可信紀錄的 SecretBindingId;持久化執行內容則繫結 RequestId。不提供舊加密格式的解密備援。ICryptoService 改為接收情境字串,而非呼叫端提供的金鑰位元組。

輪替加密金鑰環時,先將新舊金鑰以不同 ID 分發到所有節點,再切換 ActiveKeyId 並重新儲存密碼。只要待核准或歷史內容仍需檢查,就須保留舊 DML 金鑰。獨立的 fingerprint key 沒有版本化;輪替前須清空未決核准,並保留舊秘密供歷史 witness 檢查。

ExtraSettings 只接受 JSON 布林欄位 Encrypt 與 TrustServerCertificate。未知或重複欄位、字串值及無效 JSON 都會被拒絕。連線測試與健康探測回傳通用 DB_CONNECTION_FAILED 訊息,不暴露驅動程式細節。

Doctor 的 security.secret-protection 檢查金鑰 ID、Base64 格式、長度與獨立性,不回傳秘密。公開範例金鑰在非正式環境顯示警告,在 Production 顯示錯誤,包含非作用中的保留金鑰。無效佔位值在所有環境都是錯誤;設定無效時可能在 Doctor 可用前就啟動失敗。

hs-sql-agent 有三種使用方式,但安全邊界一致。

方式設定模型
Docker / ToolBox.env.example 定義的完整獨立服務環境設定
HsSqlAgent.Hosting透過 ASP.NET Core configuration 使用相同的標準第一方組合
HsSqlAgent.ServerHost 明確選擇各 Capability 自己的 Options

DML 核准

MCP Elicitation 是第一方預設 Provider。獨立 Docker 與 HsSqlAgent.Hosting 可切換成官方通用 Webhook adapter,而不改變 SQL 執行 primitive。

環境變數用途
DML_APPROVAL_PROVIDERMcpElicitation 或 Webhook
DML_APPROVAL_WEBHOOK_ENDPOINT外部核准服務 endpoint
DML_APPROVAL_WEBHOOK_CALLBACK_URL完成 pending approval 的公開 callback URL
DML_APPROVAL_WEBHOOK_SIGNING_SECRETWebhook 簽章 secret,至少 32 UTF-8 bytes

ASP.NET Core 對應設定:

{
  "DmlApproval": {
    "Provider": "Webhook",
    "Webhook": {
      "Endpoint": "https://approval.example.com/hssqlagent/requests",
      "CallbackUrl": "https://sql-agent.example.com/api/hs-sql-agent/approvals/webhook",
      "SigningSecret": "replace-with-a-unique-secret-at-least-32-bytes"
    }
  }
}

未知 Provider 名稱會在啟動時 fail。非同步 Provider 可回傳 Pending;Durable Resume 需要 Admin Store,才能保存受保護的 Resume Intent 與 Approval Fingerprint。

模組化 HsSqlAgent.Server 可註冊 HsSqlAgent.Approvals.Webhook 或自己的 IDmlApprovalProvider。核准 Provider 不會取得 Database Connection、Transaction、已驗證 Plan 或 commit primitive。

應用程式與 Control Plane

獨立服務設定涵蓋 Application Hosting、Admin Database、MCP HMAC/Public Endpoint、內建 Admin JWT、SMTP/Password Reset、OIDC/MFA、Bootstrap、Audit、Health、Delivery,以及 Cache、Rate Limit、Policy Sync、Outbound Delivery Sync、SQL Concurrency、Prometheus 與 OTLP。

HMAC_KEY 與 JWT_KEY 必須使用不同且至少 32 bytes 的 secrets。啟用受保護身分狀態時請持久化 DATA_PROTECTION_KEY_PATH。

單機與分散式 Provider

單機可使用 SQLite Admin Database 與 process-local Memory Provider。多 Instance 時,改用共享 Admin Database,並以 Redis-backed Provider 處理 Cache、Rate Limiting、Security Policy Sync、Outbound Delivery Sync 與 SQL Concurrency。

Observability

Prometheus 使用 PROMETHEUS_ENABLED、PROMETHEUS_HOST、PROMETHEUS_PORT 的獨立 Listener;OTLP 使用 OTLP_ENDPOINT 與 OTEL_SERVICE_NAME。

Embedded .NET Host

HsSqlAgent.Hosting 掌握完整標準組合;HsSqlAgent.Server 從 AddHsSqlAgentCore() 開始,只驗證實際選取 Capability 的 Options。Host Authorization 可取代內建 Identity,DML 核准 Provider 也可獨立替換。

另見 部署、ASP.NET Core 整合與 Safe DML。