Saltar al contenido principal

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.

ServicioExposiciónNotas
webPúblico, detrás de su proxy HTTPSEl ú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-apiOpcional, públicoPublíquelo solo para integraciones, referencia de API o agente de IA OAuth.
mcpOpcional, públicoPublíquelo solo si los clientes de IA remotos deben conectarse.
apiSolo internoNunca le dé a la API principal su propio dominio público.
workerSolo internoEjecuta programadores y entregas salientes.
postgresSolo bucle invertido del hostAtado a 127.0.0.1:5433 por defecto (POSTGRES_BIND_PORT). Utilice un túnel SSH para acceso remoto.
valkeySolo internoNingún puerto publicado. Se ejecuta sin contraseña en la red Compose, así que nunca lo publiques.
admin-apiDesactivado de forma predeterminadaComienza solo con COMPOSE_PROFILES=admin. Colóquelo en su propio dominio si lo habilita.
MonitoreoDesactivado de forma predeterminadacon 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 hacer WEB_ORIGIN y COOKIE_DOMAIN coincida con la dirección HTTPS pública.
  • El contenedor web envía Strict-Transport-Security con includeSubDomains y 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 restrictivo Permissions-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ónRedactar por defectoEstablecer en true cuando
API_TRUST_PROXYfalseLa aplicación se encuentra detrás de un proxy que establece la IP real del cliente.
PUBLIC_API_TRUST_PROXYfalseLo mismo, para la API pública.
MCP_TRUST_PROXYtruedéjalo true solo mientras se pueda acceder a MCP únicamente a través de dicho proxy.
ADMIN_TRUST_PROXYtruedé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.

secretoProtegesi lo cambias
POSTGRES_PASSWORDEl inicio de sesión de la base de datosActualice también el usuario de la base de datos en ejecución.
JWT_SECRETSesiones de aplicacionesTodos 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_KEYSecretos del autenticador y códigos de recuperación.Cada autenticador registrado deja de funcionar.
MEDIA_SIGNING_SECRETURL de medios firmadasLos enlaces de medios existentes dejan de resolverse.
SECRETS_ENCRYPTION_KEYSMTP almacenado, almacenamiento, webhook, destino de chat y credenciales de la aplicación GitHubLas credenciales almacenadas ya no se pueden descifrar y se deben ingresar nuevamente.
MCP_INTERNAL_SECRETEl intercambio privado entre mcp y public-apiEstablezca el mismo valor nuevo en ambos servicios. Las solicitudes de MCP en vuelo pueden fallar.
ADMIN_JWT_SECRETSesiones del portal de gestiónLos administradores del portal han cerrado sesión.
METRICS_TOKEN/metrics raspandoActualice Prometheus para que coincida.
DB_BACKUP_ENCRYPTION_PASSPHRASECopias de seguridad cifradasLas 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_URL para 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_ENABLED por defecto es true, 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_URL y PUBLIC_API_OAUTH_ISSUER a 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.