Antes de SASL, la autenticacion en IRC era un chiste. Te conectabas, tu IP real era visible para todo el mundo durante unos segundos, y luego enviabas /msg NickServ IDENTIFY contrasena en texto plano por un canal que — si no tenias TLS — cualquiera podia interceptar. Si alguien era rapido, podia capturar tu contrasena antes de que NickServ aplicara el cloaking. No era un escenario teorico. Pasaba.
El problema de la autenticacion en IRC
El protocolo IRC original no tiene autenticacion de usuarios. El RFC 1459 define un comando PASS que se envia antes de NICK/USER, pero se usa para la contrasena del servidor, no para identificacion de usuarios. NickServ fue un parche: un bot que gestiona un sistema de registro completamente fuera del protocolo. El usuario se conecta, el servidor le muestra a todos con su IP real, y luego el usuario se identifica manualmente con un mensaje privado a NickServ.
Los problemas de este modelo son evidentes:
- Tu IP real es visible antes de identificarte (y del cloaking).
- La contrasena viaja como un PRIVMSG normal — si no tienes TLS, es texto plano en la red.
- Hay una ventana de tiempo entre la conexion y la identificacion donde puedes ser kickeado de canales +R (solo registrados).
- Si NickServ esta caido o lento, no puedes identificarte y tu nick no esta protegido.
SASL resuelve todos estos problemas integrando la autenticacion en el proceso de conexion, antes de que tu presencia sea visible en la red.
SASL: que es y como funciona
SASL (Simple Authentication and Security Layer) es un framework de autenticacion definido en el RFC 4422. No es especifico de IRC — se usa en SMTP, LDAP, XMPP, y otros protocolos. IRCv3 definio como integrar SASL en la negociacion de capacidades (CAP) del protocolo IRC.
La secuencia es asi:
# 1. Cliente solicita capacidades:
CAP LS 302
# 2. Servidor lista capacidades disponibles:
:servidor CAP * LS :sasl multi-prefix ...
# 3. Cliente solicita SASL:
CAP REQ :sasl
# 4. Servidor confirma:
:servidor CAP * ACK :sasl
# 5. Cliente inicia autenticacion:
AUTHENTICATE PLAIN
# 6. Servidor pide datos:
:servidor AUTHENTICATE +
# 7. Cliente envia credenciales (base64):
AUTHENTICATE bWFyY28AbWFyY28AcGFzc3dvcmQ=
# (base64 de: marco\0marco\0password)
# 8. Servidor confirma (o rechaza):
:servidor 903 marco :SASL authentication successful
# O: :servidor 904 marco :SASL authentication failed
# 9. Cliente finaliza CAP:
CAP END
# 10. Registro normal:
NICK marco
USER marco 0 * :Marco Pellegrini
# El usuario aparece en la red YA autenticado y con cloaking aplicado
Lo clave: todo pasa antes del registro (NICK/USER). Cuando el usuario aparece en los canales, ya esta identificado con NickServ, el cloaking esta aplicado, y los modos de usuario (+R, etc.) estan activos. No hay ventana de exposicion.
SASL PLAIN: usuario y contrasena
SASL PLAIN es el mecanismo mas simple: envias usuario y contrasena codificados en base64. Es el equivalente a /msg NickServ IDENTIFY pero integrado en la conexion.
La seguridad de SASL PLAIN depende enteramente de TLS. Las credenciales van en base64, que no es cifrado — es codificacion reversible. Sin TLS, un sniffer ve tu contrasena igual que antes. Con TLS, la conexion esta cifrada y SASL PLAIN es seguro.
# Base64 de las credenciales PLAIN:
# Formato: authzid\0authcid\0password
# authzid = identidad de autorizacion (normalmente vacio o igual a authcid)
# authcid = nombre de usuario (tu nick registrado)
# password = tu contrasena
# Ejemplo: marco\0marco\0mipassword
# En base64: bWFyY28AbWFyY28AbWlwYXNzd29yZA==
# Generar base64 desde shell:
echo -n "marco\0marco\0mipassword" | base64
# O en Python:
import base64
base64.b64encode(b"marco\x00marco\x00mipassword")
CertFP: certificados de cliente
CertFP (Certificate Fingerprint) es un metodo de autenticacion basado en certificados TLS de cliente. En vez de enviar usuario y contrasena, presentas un certificado TLS durante el handshake. El servidor (o NickServ) verifica el fingerprint (hash) del certificado contra los registrados para tu nick.
Es el metodo mas seguro de autenticacion en IRC porque:
- No transmite contrasena alguna.
- El certificado privado nunca sale de tu maquina.
- Es inmune a ataques de replay (cada handshake TLS es unico).
- Funciona automaticamente — no necesitas teclear nada.
# Generar un certificado de cliente:
openssl req -x509 -nodes -days 3650 -newkey ec \
-pkeyopt ec_paramgen_curve:prime256v1 \
-keyout irc-client.key -out irc-client.crt \
-subj "/CN=marco"
# Combinar en un solo archivo (requerido por algunos clientes):
cat irc-client.key irc-client.crt > irc-client.pem
chmod 600 irc-client.pem
# Obtener el fingerprint:
openssl x509 -in irc-client.crt -outform der | \
sha512sum | cut -d' ' -f1
# O para SHA-256 (depende de la red):
openssl x509 -in irc-client.crt -noout -fingerprint -sha256
# Registrar el fingerprint en NickServ:
/msg NickServ CERT ADD
# (Ejecutar mientras estas conectado con el certificado cargado)
# NickServ detecta el fingerprint automaticamente
# Verificar fingerprints registrados:
/msg NickServ CERT LIST
El certificado tiene una validez de 10 anos en el ejemplo (-days 3650). Cuando expire, genera uno nuevo y actualiza el fingerprint en NickServ. Usa curvas elipticas (EC) en vez de RSA — el certificado es mas pequeno y la criptografia igual de fuerte.
SASL EXTERNAL: CertFP automatico
SASL EXTERNAL combina SASL con CertFP. El cliente presenta el certificado durante el handshake TLS y luego usa SASL EXTERNAL para indicar al servidor que lo autentique por fingerprint. No envia contrasena — la autenticacion es el propio certificado.
# Secuencia SASL EXTERNAL:
CAP REQ :sasl
:servidor CAP * ACK :sasl
AUTHENTICATE EXTERNAL
:servidor AUTHENTICATE +
AUTHENTICATE + # No hay datos que enviar
:servidor 903 marco :SASL authentication successful
CAP END
SASL EXTERNAL es el gold standard de autenticacion en IRC. No transmite secretos, es automatico, y es resistente a todos los ataques de interceptacion de credenciales. La unica desventaja es que necesitas gestionar un certificado y asegurarte de que esta disponible en todos los dispositivos desde los que te conectas.
Configuracion por cliente
# === irssi ===
# SASL PLAIN:
/NETWORK ADD -sasl_mechanism PLAIN \
-sasl_username marco \
-sasl_password tupassword Libera
/SERVER ADD -auto -tls -network Libera irc.libera.chat 6697
# SASL EXTERNAL (CertFP):
/NETWORK ADD -sasl_mechanism EXTERNAL Libera
/SERVER ADD -auto -tls \
-tls_cert ~/.irssi/irc-client.pem \
-tls_verify -network Libera irc.libera.chat 6697
/SAVE
# === WeeChat ===
# SASL PLAIN:
/set irc.server.libera.sasl_mechanism plain
/set irc.server.libera.sasl_username marco
/set irc.server.libera.sasl_password tupassword
# SASL EXTERNAL:
/set irc.server.libera.sasl_mechanism external
/set irc.server.libera.ssl_cert "%h/tls/irc-client.pem"
/set irc.server.libera.ssl on
/save
# === HexChat ===
# Menu: HexChat > Network List > Seleccionar red > Edit
# Pestaña "Connect Commands":
# Login method: SASL EXTERNAL (cert)
# Pestaña "SSL":
# Use SSL: checked
# Client certificate: /path/to/irc-client.pem
# === mIRC ===
# File > Options > Connect > Options > SSL
# Private Key File: C:\path\to\irc-client.pem
# En server password: sasl_external
# (El soporte SASL de mIRC requiere un script adicional
# o la version 7.69+)
/WHOIS tunick. Deberias ver una linea indicando que estas conectado de forma segura y que tu certificado fue reconocido. Si no aparece, verifica que el fingerprint esta registrado en NickServ.Autenticacion de operadores
Los operadores de red usan el comando /OPER para obtener privilegios de administracion. La autenticacion de oper deberia ser mas fuerte que la de un usuario normal, porque comprometer una cuenta de oper compromete la red entera.
# UnrealIRCd — oper con fingerprint TLS:
oper marco {
password "password-hasheada";
mask *@ip.conocida;
fingerprint "SHA256:xxxxxxxxxxxxxxxxxxxx";
class opers;
operclass netadmin;
};
# InspIRCd — oper con fingerprint:
# La triple autenticacion:
# 1. Password (algo que sabes)
# 2. Mascara de IP (algo que tienes — la IP)
# 3. Fingerprint TLS (algo que posees — la clave privada)
# Es lo mas cercano a MFA que IRC ofrece nativamente.
Para opers, la combinacion de password + mascara de IP + fingerprint TLS es lo maximo que el protocolo IRC permite. No es MFA real (un TOTP seria mejor), pero tres factores independientes hacen que comprometer una cuenta de oper sea significativamente mas dificil que con solo password.
Preguntas frecuentes
SASL PLAIN es seguro?
Con TLS, si. Sin TLS, no. SASL PLAIN transmite las credenciales en base64 (que es reversible trivialmente). La seguridad la proporciona la capa TLS que cifra toda la comunicacion. Nunca uses SASL PLAIN sin TLS.
Puedo usar el mismo certificado en multiples redes?
Si. El certificado es tuyo, no de la red. Puedes registrar el mismo fingerprint en NickServ de Libera.Chat, OFTC, y cualquier otra red. Solo necesitas un certificado por identidad, no por red.
Que pasa si pierdo mi certificado?
Si aun puedes identificarte con contrasena (SASL PLAIN o /msg NickServ IDENTIFY), hazlo y luego borra el fingerprint viejo con /msg NickServ CERT DEL fingerprint. Si no recuerdas tu contrasena y tu unico metodo de auth era CertFP, contacta a un operador de la red — necesitaras demostrar que eres el dueno de la cuenta.
CertFP funciona con bouncers?
Si. El bouncer (ZNC, etc.) presenta el certificado al servidor IRC por ti. Configuras el certificado en el bouncer, no en el cliente. El cliente se conecta al bouncer normalmente. Si usas ZNC, el modulo cert gestiona esto.