Seguridad y endurecimiento
Esta página recopila las decisiones de seguridad para una implementación de Kanera autohospedada. Cubre lo que enfrenta Internet, qué secretos importan, con qué contacta el servidor y qué configuraciones ajustar una vez que la pila se está ejecutando.
Léelo después Empezando. La configuración detallada se encuentra en las otras páginas de autohospedaje, que están vinculadas desde cada sección.
¿Qué enfrenta Internet?
el paquete docker-compose.yml no publica ninguno de los servicios de la aplicación. Tú decides qué publicar, normalmente a través de un compose.override.yml y un proxy inverso. Ver Servicios y enrutamiento.
| Servicio | Exposición | Notas |
|---|---|---|
web | Público, detrás de su proxy HTTPS | El único servicio que necesitan los navegadores. Su nginx reenvía la API de la aplicación y el tráfico en tiempo real a api internamente. |
public-api | Opcional, público | Publíquelo solo para integraciones, referencia de API o agente de IA OAuth. |
mcp | Opcional, público | Publíquelo solo si los clientes de IA remotos deben conectarse. |
api | Solo interno | Nunca le dé a la API principal su propio dominio público. |
worker | Solo interno | Ejecuta programadores y entregas salientes. |
postgres | Solo bucle invertido del host | Atado a 127.0.0.1:5433 por defecto (POSTGRES_BIND_PORT). Utilice un túnel SSH para acceso remoto. |
valkey | Solo interno | Ningún puerto publicado. Se ejecuta sin contraseña en la red Compose, así que nunca lo publiques. |
admin-api | Desactivado de forma predeterminada | Comienza solo con COMPOSE_PROFILES=admin. Colóquelo en su propio dominio si lo habilita. |
| Monitoreo | Desactivado de forma predeterminada | con el monitoring perfil, Prometeo y Grafana se unen a 127.0.0.1 a menos que establezcas MONITORING_BIND_IP, por ejemplo a una dirección VPN. Nunca los ates a 0.0.0.0. |
Cuantos menos servicios publique, menos habrá que atacar. Una implementación que utiliza solo la aplicación web necesita un único dominio público.
TLS y el proxy inverso
Los contenedores de Kanera hablan HTTP simple. Termine TLS en su proxy inverso o balanceador de carga (Caddy, Traefik, nginx o un balanceador de carga en la nube) y proporcione servicios a todos los dominios públicos a través de HTTPS.
- conjunto
COOKIE_SECURE=truey hacerWEB_ORIGINyCOOKIE_DOMAINcoincida con la dirección HTTPS pública. - El contenedor web envía
Strict-Transport-SecurityconincludeSubDomainsy una vida útil de un año. Luego, los navegadores también insistirán en HTTPS para los subdominios del dominio de la aplicación, así que mantenga los subdominios de API, MCP y administrador en HTTPS. - También envía una Política de Seguridad de Contenidos,
X-Frame-Options: SAMEORIGIN,X-Content-Type-Options: nosniff, y un restrictivoPermissions-Policy. No los desnudes en el proxy.
Los límites de velocidad y las limitaciones de inicio de sesión utilizan la IP del cliente. Esa IP sólo es confiable cuando un proxy sobrescribe los encabezados de reenvío:
| Configuración | Redactar por defecto | Establecer en true cuando |
|---|---|---|
API_TRUST_PROXY | false | La aplicación se encuentra detrás de un proxy que establece la IP real del cliente. |
PUBLIC_API_TRUST_PROXY | false | Lo mismo, para la API pública. |
MCP_TRUST_PROXY | true | déjalo true solo mientras se pueda acceder a MCP únicamente a través de dicho proxy. |
ADMIN_TRUST_PROXY | true | déjalo true solo mientras se pueda acceder a la API de administración únicamente a través de dicho proxy. |
Si un servicio confía en los encabezados de proxy pero los clientes pueden acceder a él directamente, pueden falsificar su IP y eludir los límites por IP.
Secretos
Genere cada secreto por separado, por ejemplo con openssl rand -hex 32y guárdelos en un almacén secreto fuera del servidor, así como en .env. En producción, la API se niega a iniciarse mientras los marcadores de posición de desarrollo conocidos todavía estén en uso. También se niega a comenzar cuando SECRETS_ENCRYPTION_KEY falta o es igual a JWT_SECRET, o cuando MCP_INTERNAL_SECRET o ADMIN_JWT_SECRET es igual JWT_SECRET.
| secreto | Protege | si lo cambias |
|---|---|---|
POSTGRES_PASSWORD | El inicio de sesión de la base de datos | Actualice también el usuario de la base de datos en ejecución. |
JWT_SECRET | Sesiones de aplicaciones | Todos han cerrado sesión. Esta es la forma más rápida de finalizar cada sesión después de una sospecha de fuga. |
MFA_ENCRYPTION_KEY | Secretos del autenticador y códigos de recuperación. | Cada autenticador registrado deja de funcionar. |
MEDIA_SIGNING_SECRET | URL de medios firmadas | Los enlaces de medios existentes dejan de resolverse. |
SECRETS_ENCRYPTION_KEY | SMTP almacenado, almacenamiento, webhook, destino de chat y credenciales de la aplicación GitHub | Las credenciales almacenadas ya no se pueden descifrar y se deben ingresar nuevamente. |
MCP_INTERNAL_SECRET | El intercambio privado entre mcp y public-api | Establezca el mismo valor nuevo en ambos servicios. Las solicitudes de MCP en vuelo pueden fallar. |
ADMIN_JWT_SECRET | Sesiones del portal de gestión | Los administradores del portal han cerrado sesión. |
METRICS_TOKEN | /metrics raspando | Actualice Prometheus para que coincida. |
DB_BACKUP_ENCRYPTION_PASSPHRASE | Copias de seguridad cifradas | Las copias de seguridad realizadas con la frase de contraseña anterior aún necesitan la frase de contraseña anterior. |
Kanera no tiene una forma integrada de volver a cifrar los datos almacenados con una nueva clave. tratar MFA_ENCRYPTION_KEY y SECRETS_ENCRYPTION_KEY sea de larga duración y planifique una rotación antes de que la necesite. Ver Secretos que vale la pena guardar.
Las métricas están activadas de forma predeterminada, pero /metrics regresa 404 hasta METRICS_TOKEN está configurado. El perfil de seguimiento se niega a iniciarse sin METRICS_TOKEN y GRAFANA_ADMIN_PASSWORD.
Tráfico saliente
Kanera no tiene verificación de actualización. El análisis de productos está desactivado de forma predeterminada y está destinado únicamente a Kanera Cloud. El servidor solo contacta con destinos que usted, sus administradores o sus usuarios configuren:
- Su servidor SMTP, almacenamiento compatible con S3 y depósito de respaldo.
- Servicios de inserción del navegador, una vez que un administrador de la organización habilita la inserción.
- Webhooks del espacio de trabajo y destinos de chat (Slack, Discord, Telegram, Zulip) configurados por los administradores del espacio de trabajo.
- Canales personales ntfy, Gotify o webhook configurados por los usuarios.
ALERT_WEBHOOK_URLpara alertas operativas, si están configuradas.- Trello, durante una importación que copia archivos adjuntos con
TRELLO_API_KEYy GitHub, cuando una aplicación GitHub está configurada para vistas previas de enlaces. - Cloudflare Turnstile, solo cuando sus llaves están configuradas. Déjelos sin configurar para el autohospedaje normal.
Un destino no está configurado por el operador. Cuando un cliente de IA llama al MCP search.docs herramienta, el servicio MCP descarga el índice de documentación pública de https://www.kanera.app/docs-search.json y lo busca localmente. La consulta de búsqueda no se envía.
Redes privadas
Los webhooks del espacio de trabajo y los destinos de chat deben utilizar direcciones HTTPS públicas. Kanera rechaza metadatos de bucle invertido, privados, CGNAT, de enlace local y de nube, y otras direcciones reservadas. Comprueba la dirección nuevamente en el momento de la entrega y no sigue redirecciones. Esto evita que un webhook o un destino de chat apunte a servicios dentro de su red.
Los canales de notificación personal siguen la misma regla a menos que usted opte por participar:
KANERA_ALLOW_PRIVATE_NOTIFICATION_DESTINATIONS=true
Esto permite a los usuarios enviar notificaciones ntfy, Gotify y webhooks personales a http:// y receptores de redes privadas. Las direcciones de enlace local y de metadatos, la multidifusión y otros rangos reservados permanecen bloqueados. No relaja la regla para los webhooks del espacio de trabajo o los destinos de chat. Actívelo solo si acepta que cualquier usuario pueda hacer que el servidor envíe solicitudes a los hosts de su red interna. Ver Correo electrónico y notificaciones.
Copias de seguridad
el opcional db-backup El servicio cifra cada volcado de PostgreSQL con GPG simétrico AES-256 antes de cargarlo en un almacenamiento compatible con S3. un manual pg_dump no está cifrado, así que cifrelo usted mismo antes de que salga del servidor. Archivos cargados en el kanera_uploads El volumen no está cubierto por db-backup y necesitan su propio respaldo. Mantenga las copias de seguridad y la frase de contraseña de la copia de seguridad fuera del disco principal del servidor. Ver Almacenamiento y copias de seguridad.
Actualizaciones
Se proporcionan correcciones de seguridad para la última versión etiquetada. Ejecute una versión etiquetada en lugar de la main rama, actualice cuando se envíe uno nuevo, lea las notas de la versión y haga una copia de seguridad antes de actualizar. Las imágenes de terceros en el archivo de redacción están ancladas a versiones exactas, por lo que una redistribución de rutina no cambia PostgreSQL o Valkey sin un cambio revisado. Ver Actualizaciones y escalamiento.
Cuentas e inicio de sesión
- Cerrar el registro público. Después de crear su organización, establezca
SIGNUPS_ENABLED=false. Los enlaces de invitación siguen funcionando. - Verificar direcciones de correo electrónico. Una vez que el correo saliente funcione, configure
EMAIL_VERIFICATION_ENABLED=true. - Mantenga activada la aceleración de autenticación.
AUTH_RATE_LIMIT_ENABLEDpor defecto estrue, permitiendo 10 intentos por minuto por IP. - Requerir MFA. Los administradores de la organización pueden exigir un autenticador para todas las personas menores de Configuración -> Organización -> Seguridad. Ver Perfil y seguridad.
- Duración de las sesiones. Los tokens de acceso a la aplicación duran 5 minutos y las sesiones de actualización duran 10 días (
JWT_ACCESS_TTL,JWT_REFRESH_TTL_DAYS). - Portal de gestión. Está desactivado de forma predeterminada y utiliza sus propias cuentas y secretos. Si lo habilita, sus sesiones de soporte actúan como propietario de una organización objetivo. Cada uno se registra en un registro de auditoría y caduca por sí solo, después de 60 minutos de forma predeterminada (
SUPPORT_SESSION_TTL_MINUTES, como máximo 480).
Acceso del agente de IA
exponer mcp y las rutas OAuth en public-api solo si desea clientes de IA remotos. La activación del plan no se aplica a las implementaciones autohospedadas, por lo que una vez que se puede acceder a MCP, cualquier miembro puede conectar un agente que actúe con los permisos de ese miembro.
- conjunto
MCP_SERVER_PUBLIC_URLyPUBLIC_API_OAUTH_ISSUERa tus propios dominios. Los tokens de OAuth están vinculados a esa dirección MCP y son rechazados por/api/v1. - Cualquier cliente puede registrarse en
/oauth/register. El registro no otorga nada hasta que un usuario que haya iniciado sesión apruebe la conexión en la pantalla de consentimiento. - Las solicitudes de API públicas autenticadas y MCP están limitadas a 400 por minuto por credencial de forma predeterminada. Los intentos fallidos de clave se limitan a 10 por minuto por IP. Ver Referencia ambiental.
- El servicio MCP registra el nombre, la duración y el resultado de cada llamada de herramienta, pero no sus argumentos.
Ver Integraciones y API para la configuración y Permisos y seguridad del agente por lo que un agente puede hacer.
Informar una vulnerabilidad
No abra una edición pública por un problema de seguridad. Correo electrónico [email protected] con una descripción, los pasos de reproducción, el componente afectado y si afecta la configuración autohospedada predeterminada. Los informes se acusan recibo dentro de los cinco días hábiles. Ver SECURITY.md en el repositorio de Kanera para el alcance y la divulgación.