Autenticación y seguridad del transporte

CoyIM siempre se conectará a servidores XMPP usando TLS. Esto significa que el transporte de datos desde su máquina al servidor siempre estará protegido por al menos una capa de cifrado. En la mayoría de los casos, esta conexión se realizará utilizando la extensión STARTTLS específica para XMPP, que está documentada en el capítulo 5 de RFC6120. CoyIM negociará qué versión de TLS y qué suites de cifrado se utilizarán, como es normal para las conexiones TLS. La versión mínima aceptable de TLS siempre será TLS 1.2 y, 1.3 será preferida. Sólo es posible utilizar un conjunto muy restringido de suites de cifrado. Específicamente, para las versiones de Golang 1.12 o superiores, estas son las posibles suites que se ofrecen, en este orden:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
  • TLS_AES_256_GCM_SHA384
  • TLS_AES_128_GCM_SHA256
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305

Todas estas suites ofrecen un secreto directo y proporcionan un alto nivel de seguridad.

La extensión STARTTLS a veces puede causar demasiados viajes de ida y vuelta y también existe el riesgo de varios ataques de degradación con este tipo de sistema. Por esta razón, CoyIM también implementa XEP-0368 que permite la búsqueda de un puerto de conexión TLS sobre entradas SRV de DNS. Esto evita la conexión inicial de texto sin cifrar necesario para STARTTLS.

TLS proporciona una capa de seguridad en el transporte, pero si Tor está activado, esto proporciona otro nivel. Y si el servidor en cuestión es un servidor conocido con una Dirección Cebolla (OnionAddress) versión 3 publicada, CoyIM intentará conectarse automáticamente a este, otorgando otro nivel de seguridad en el transporte además de autenticación del servidor.

La mayoría de las aplicaciones que utilizan TLS confiarán automáticamente en los certificados que son válidos y que se pueden validar con las raíces de confianza que se envían con tu sistema operativo. Sin embargo, muchos tipos de ataques al sistema de la autoridad de certificación han demostrado que esto podría no ser suficiente para las personas en riesgo. Por esta razón, CoyIM utilizará la fijación de certificados como una medida de seguridad adicional. Lo que esto significa es que cada vez que CoyIM ve un nuevo certificado para un servidor, esto puede ser rechazado o aceptado, según tu política de fijación. De forma predeterminada, CoyIM siempre preguntará antes de usar un certificado nunca antes visto. Pero también puedes configurar CoyIM para que rechace automáticamente cualquier certificado nuevo. De esta manera, incluso si un atacante logra obtener un certificado válido para un servidor XMPP, aún puedes estar protegido.

Autenticación

Para autenticarse con el servidor XMPP, existen dos métodos estándar. Uno es proporcionar una contraseña de algún tipo, y el otro es obtener primero un token OAUTH y luego usarlo para autenticarse con el servidor. Si bien OAUTH puede ser extremadamente potente, también trae consigo mucha maquinaria adicional. Específicamente, en general necesitaráx utilizar un navegador o una vista web interna donde el usuario pueda autenticarse en el proveedor OAUTH. Nuestra experiencia ha sido que hacer esto en un entorno de alta seguridad simplemente no es viable. Por esta razón, CoyIM sólo admite autenticación basada en contraseñas con el servidor XMPP.

XMPP utiliza el estándar SASL para proporcionar una negociación flexible de los mecanismos de autenticación. CoyIM utilizará el método más fuerte disponible para autenticarse con el servidor, pero en el peor de los casos recurrirá al método PLAIN. CoyIM admite estos mecanismos:

  • SCRAM-SHA-512-PLUS
  • SCRAM-SHA-512
  • SCRAM-SHA-256-PLUS
  • SCRAM-SHA-256
  • SCRAM-SHA-1-PLUS
  • SCRAM-SHA-1
  • DIGEST-MD5
  • PLAIN

Sin embargo, si la conexión con el servidor está usando TLS 1.3, las variantes -PLUS no están disponibles debido a limitaciones en la biblioteca estándar de Golang.