安全與加固
本頁面收集了自託管的 Kanera 部署的安全決策,包括面向網際網路的內容、哪些機密重要、伺服器與哪些內容進行接觸以及堆疊執行後應該加強哪些設定。
讀完後 快速入門。詳細設定位於其他自託管頁面上,這些頁面從每個部分連結。
面臨網際網路
捆綁 docker-compose.yml 您可以決定要釋出什麼,通常透過釋出服務。 compose.override.yml 一個反向代理。 見 服務與路由.
| 服務 | 暴露 | 筆記 |
|---|---|---|
web | 公共,在您的 HTTPS 代理後面 | 唯一的服務瀏覽器需要. 其nginx轉發應用程式API和實時流量 api 內部。 |
public-api | 任擇、公共 | 僅為整合、API 參考或 AI 代理 OAuth 釋出。 |
mcp | 任擇、公共 | 僅在遠端 AI 客戶端應連線時釋出。 |
api | 僅內部 | 永遠不要給主 API 自己的公共域。 |
worker | 僅內部 | 執行排程程式和出站交付。 |
postgres | 僅限主機迴路 | 繫結到 127.0.0.1:5433 預設值()POSTGRES_BIND_PORT)。使用 SSH 隧道進行遠端訪問。 |
valkey | 僅內部 | 未釋出埠。 它在 Compose 網路上執行時不需要密碼,因此不要釋出它。 |
admin-api | 預設關閉 | 只開始於 COMPOSE_PROFILES=admin。如果您啟用它,請將其放在自己的域中。 |
| 監測 | 預設關閉 | 與 monitoring 配置檔案,Prometheus和Grafana繫結到 127.0.0.1 除非你設定 MONITORING_BIND_IP,例如 VPN 地址。永遠不要將它們繫結到 0.0.0.0. |
您釋出的服務越少,攻擊的機會就越小。 僅使用 Web 應用程式的部署需要一個公共域。
TLS 和反向代理
Kanera 的容器使用純 HTTP。 在您的反向代理或負載平衡器(Caddy、Traefik、nginx 或雲負載平衡器)上終止 TLS,並透過 HTTPS 為每個公共域提供服務。
- 集合
COOKIE_SECURE=true,並使WEB_ORIGIN以及COOKIE_DOMAIN與公共 HTTPS 地址匹配。 - 網路容器傳送
Strict-Transport-Security與includeSubDomains瀏覽器將堅持對應用域的子域也使用 HTTPS,因此請將 API、MCP 和管理子域保持在 HTTPS 上。 - 它還會傳送內容安全策略,
X-Frame-Options: SAMEORIGIN,X-Content-Type-Options: nosniff,以及限制性的Permissions-Policy。不要在代理處剝離它們。
速率限制和登入限制使用客戶端 IP。 只有在代理覆蓋轉發報頭時,該 IP 才是可信的:
| 設定 | 預設編寫 | 設定為 true 當 |
|---|---|---|
API_TRUST_PROXY | false | 應用程式位於設定真實客戶端 IP 的代理後面。 |
PUBLIC_API_TRUST_PROXY | false | 對於公共 API 也是如此。 |
MCP_TRUST_PROXY | true | 別管了 true 只要 MCP 僅透過此代理可訪問。 |
ADMIN_TRUST_PROXY | true | 別管了 true 只要管理 API 僅透過此代理可訪問。 |
如果服務信任代理報頭,但客戶端可以直接訪問它,它們可以偽造其 IP 並繞過每個 IP 的限制。
秘密
分別生成每個秘密,例如: openssl rand -hex 32,並將它們儲存在伺服器外部以及內部的秘密儲存中 .env。在生產中,API 拒絕啟動,而已知的開發佔位符仍在使用中。它也拒絕啟動時 SECRETS_ENCRYPTION_KEY 是缺失或等於 JWT_SECRET,或者當 MCP_INTERNAL_SECRET 或 ADMIN_JWT_SECRET 等於 JWT_SECRET.
| 秘密 | 保護 | 如果你改變它 |
|---|---|---|
POSTGRES_PASSWORD | 資料庫登入 | 更新執行的資料庫使用者。 |
JWT_SECRET | 應用程式會話 | 每個人都登出。 這是發生疑似洩露後結束每個會話的最快方法。 |
MFA_ENCRYPTION_KEY | 驗證器秘密和恢復程式碼 | 每個註冊的身份驗證器都停止工作。 |
MEDIA_SIGNING_SECRET | 已簽名媒體URL | 現有媒體連結停止解析。 |
SECRETS_ENCRYPTION_KEY | 儲存的 SMTP、儲存空間、webhook、聊天目標和 GitHub 應用憑據 | 儲存的憑據無法再解密,必須重新輸入。 |
MCP_INTERNAL_SECRET | 私人交流 mcp 以及 public-api | 對兩個服務設定相同的新值。 流中 MCP 請求可能會失敗。 |
ADMIN_JWT_SECRET | 管理門戶會議 | 門戶管理員已登出。 |
METRICS_TOKEN | /metrics 刮 | 更新Prometheus以匹配。 |
DB_BACKUP_ENCRYPTION_PASSPHRASE | 加密備份 | 使用舊密碼進行的備份仍然需要舊密碼。 |
Kanera 沒有內建的方法來使用新金鑰重新加密儲存的資料。 Treat MFA_ENCRYPTION_KEY 以及 SECRETS_ENCRYPTION_KEY 您需要一個,並計劃輪換之前。 見 值得保守的秘密.
預設情況下,指標處於開啟狀態,但 /metrics 回返 404 直至 METRICS_TOKEN 監控配置檔案在沒有設定的情況下拒絕啟動。 METRICS_TOKEN 以及 GRAFANA_ADMIN_PASSWORD.
出站流量
Kanera 沒有更新檢查功能。 預設情況下,產品分析功能關閉,僅用於 Kanera Cloud。 伺服器僅與您、管理員或使用者配置的目標連線:
- 您的 SMTP 伺服器、S3 相容儲存和備份池。
- 一旦組織管理員啟用推送,瀏覽器推送服務即可。
- 工作區 webhook 和聊天目標(Slack、Discord、Telegram、Zulip)由工作區管理員設定。
- 使用者設定的個人 ntfy、Gotify 或 webhook 通道。
ALERT_WEBHOOK_URL用於操作警報,如果設定。- Trello,在匯入過程中,複製附件與
TRELLO_API_KEY和 GitHub(當 GitHub 應用程式配置為連結預覽時)。 - Cloudflare Turnstile,只有在其金鑰設定時才會使用。 對於正常的自託管,請將其保持未設定。
當 AI 客戶端呼叫該目標時,它會將該目標的 MCP search.docs 工具,MCP服務從下列位置下載公共文件索引 https://www.kanera.app/docs-search.json 並在本地搜尋它。 搜尋查詢不會傳送。
私人網路
工作區 webhook 和聊天目標必須使用公共 HTTPS 地址。 Kanera 拒絕迴環、私有、CGNAT、連結本地和雲後設資料以及其他保留地址,在交付時再次檢查地址,並且不遵循重定向,這樣就可以防止 webhook 或聊天目標指向您網路內的服務。
個人通知渠道遵循相同的規則,除非您選擇:
KANERA_ALLOW_PRIVATE_NOTIFICATION_DESTINATIONS=true
這允許使用者向下列使用者傳送 ntfy、Gotify 和個人 webhook 通知: http:// 連結本地地址和後設資料地址、多播和其他保留範圍將被阻止。 對於工作區 webhook 或聊天目標,它不會放鬆規則。 只有在您接受任何使用者都可以讓伺服器向內部網路上的主機傳送請求時才能開啟此選項。 電子郵件與通知.
Backups
任擇議定書 db-backup 服務在將每個 PostgreSQL 轉儲檔案上傳到 S3 相容儲存之前,使用 GPG 對稱 AES-256 加密。 pg_dump 您的檔案沒有加密,所以在離開伺服器之前,您需要自己對其加密。 kanera_uploads 數量不包括 db-backup 將備份和備份密碼短語儲存在伺服器的主磁碟之外。 參見 儲存與備份.
最新情況
為最新的標記版本提供了安全修復。 執行標記版本而不是標記版本 main 您可以在新版本釋出時更新,閱讀釋出說明,並在更新前進行備份。 compose 檔案中的第三方映像會被固定到確切的版本,因此,例行重新部署不會在未經審查的情況下改變 PostgreSQL 或 Valkey。 更新與擴充套件.
帳戶和登入
- 關閉公共註冊。 建立組織後,設定
SIGNUPS_ENABLED=false。邀請連結繼續有效。 - 驗證電子郵件地址。 當出站郵件工作後,設定
EMAIL_VERIFICATION_ENABLED=true. - 保持auth 限制開啟。
AUTH_RATE_LIMIT_ENABLED未付款額true,每個 IP 每分鐘允許 10 次嘗試。 - 需要 MFA。 組織管理員可以要求為以下每個人提供身份驗證器: 設定 -> 組織 -> 安全。參見 個人資料與安全.
- 會話壽命。 應用程式訪問令牌持續 5 分鐘,重新整理會話持續 10 天(
JWT_ACCESS_TTL,JWT_REFRESH_TTL_DAYS). - 管理門戶。 預設情況下,它處於關閉狀態,並使用自己的帳戶和金鑰。 如果啟用此功能,則其支援會話將作為目標組織的所有者。 每個會話都會記錄在稽核日誌中,並在預設情況下 60 分鐘後自行過期(
SUPPORT_SESSION_TTL_MINUTES,最多 480)。
AI代理接入
暴露 mcp 並且在上面的OAuth路徑 public-api 計劃門不適用於自託管部署,因此一旦 MCP 可訪問,任何成員都可以連線使用該成員許可權行事的代理。
- 集合
MCP_SERVER_PUBLIC_URL以及PUBLIC_API_OAUTH_ISSUER您自己的域名。 OAuth 令牌是繫結到那個 MCP 提出並被否決的/api/v1. - 任何客戶都可以在以下位置註冊:
/oauth/register。在登入使用者在同意螢幕上批准連線之前,註冊不會授予任何內容。 - 預設情況下,經過身份驗證的公共 API 和 MCP 請求限制為每個憑證每分鐘 400 個。每個 IP 每分鐘失敗的金鑰嘗試次數限制為 10 次。參見 環境變數參考.
- MCP 服務會記錄每個工具呼叫的名稱、持續時間和結果,但不會記錄其引數。
海 整合與 API 用於設定和 代理許可權與安全 對於代理可以做什麼。
報告漏洞
不要為安全問題開啟公共問題。 電子郵件 [email protected] 報告將包含描述、複製步驟、受影響的元件以及是否影響預設自託管配置。 報告將在五個工作日內確認。 安全.md 在Kanera儲存庫 範圍和披露。