安全与加固
本页面收集了自托管的 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存储库 范围和披露。