Kerberos (Español)

From ArchWiki
Esta traducción de Kerberos fue revisada el 2024-07-20. Si existen cambios puede actualizarla o avisar al equipo de traducción.

Kerberos es un sistema de autenticación de redes. Véase (en inglés) la documentación de Kerberos V5 (krb5).

Instalación

Instale el paquete krb5 tanto en el servidor como en los clientes.

Está altamente recomendado usar un servicio de sincronización de hora para mantener los relojes sincronizados en los equipos a configurar.

Si la resolución de nombres de dominio no ha sido configurada, puede añadir manualmente los equipos a sus archivos hosts(5) correspondientes. Nótese que, dentro del archivo hosts, el nombre de dominio completamente calificado (FQDM, por sus siglas en inglés), por ejemplo micliente.ejemplo.com, debe ser el primer nombre de dominio después de la dirección IP.

Configuración del servidor

Creación del dominio

Edite /etc/krb5.conf para configurar su dominio:

/etc/krb5.conf
[libdefaults]
    default_realm = EJEMPLO.COM

[realms]
    EJEMPLO.COM = {
        admin_server = $DIRECCIÓN
        # ocupe "kdc = ..." si el registro SRV de Kerberos no están en el DNS (véase la sección «Avanzado»)
        kdc = $DIRECCIÓN
        # Esto rompe con la compatibilidad con Kerberos V4, pero incrementa la seguridad
        default_principal_flags = +preauth
    }

[domain_realm]
    ejemplo.com  = EJEMPLO.COM
    .ejemplo.com = EJEMPLO.COM

[logging]
    kdc          = SYSLOG:NOTICE
    admin_server = SYSLOG:NOTICE
    default      = SYSLOG:NOTICE

Donde, $DIRECCIÓN es la dirección IP o nombre de dominio donde Kerberos está alojado, como, por ejemplo 10.0.0.120 o kerberos.ejemplo.com.

El formato de este archivo está descrito en la documentación de MIT Kerberos (en inglés).

Cree la base de datos:

# kdb5_util -r EJEMPLO.COM create -s
Loading random data                                                             
Initializing database '/var/lib/krb5kdc/principal' for realm 'EJEMPLO.COM',                  
master key name 'K/M@EJEMPLO.COM'
You will be prompted for the database Master Password.                          
It is important that you NOT FORGET this password.                              
Enter KDC database master key: ***
Re-enter KDC database master key to verify: ***

Finalmente, inicie o habilite krb5-kdc.service y krb5-kadmind.service.

Añadir identidades de usuario

Inicie la herramienta de administración de Kerberos usando la autenticación local:

# kadmin.local
Authenticating as principal root/admin@EJEMPLO.COM with password.
kadmin.local:

Añada una identidad (principal) de usuario a la base de datos de Kerberos:

kadmin.local: addprinc usuario@EJEMPLO.COM
WARNING: no policy specified for usuario@EJEMPLO.COM; defaulting to no policy
Enter password for principal "usuario@EJEMPLO.COM": ***
Re-enter password for principal "usuario@EJEMPLO.COM": ***
Principal "usuario@EJEMPLO.COM" created.

Añada la identidad del Key Distribution Center (KDC) a la base de datos de Kerberos:

kadmin.local: addprinc -randkey host/kerberos.ejemplo.com
WARNING: no policy specified for host/kerberos.ejemplo.com@EJEMPLO.COM; defaulting to no policy
Principal "host/kerberos.ejemplo.com@EJEMPLO.COM" created.

Finalmente, añada la identidad del KDC a la tabla de claves (keytab) del servidor:

kadmin.local: ktadd host/kerberos.ejemplo.com
Entry for principal host/kerberos.ejemplo.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kerberos.ejemplo.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

Salga de la herramienta de administración:

kadmin.local: quit

Ahora, debería poder obtener un ticket de Kerberos:

$ kinit
Password for usuario@EJEMPLO.COM: ***
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: usuario@EJEMPLO.COM

Valid starting       Expires              Service principal
08/30/2017 14:26:09  08/31/2017 14:26:09  krbtgt/EJEMPLO.COM@EJEMPLO.COM

Cortafuegos

Añada a su cortafuegos las siguientes reglas para permitir (ALLOW) el tráfico en losvpuertos y protocolos especificados:

  • 88, TCP y UDP para Kerberos V5
  • 749, TCP y UDP para kadmin, si es que lo va a configurar
  • 750, TCP y UDP para Kerberos V4, si necesita compatibilidad con este

Registro DNS

Este paso no es necesario si ya especificó los servidores de Kerberos y kadmin en el archivo krb5.conf de cada máquin:

db.ejemplo.com
kerberos.ejemplo.com.           A     1.2.3.4
_kerberos.ejemplo.com.          TXT   "EJEMPLO.COM"
_kerberos._udp.ejemplo.com.     SRV   0 0  88 kerberos.ejemplo.com.
_kerberos-adm._udp.ejemplo.com. SRV   0 0 749 kerberos.ejemplo.com.

No olvide el DNS inverso.

Configuración del cliente

Edite el archivo /etc/krb5.conf del cliente para que tenga la misma configuración del servidor. También puede directamente copiarlo o añadir la información del dominio de Kerberos (realm).

Testeo

Ahora debería poder obtener un ticket de Kerberos en el cliente:

$ kinit
Password for usuario@EJEMPLO.COM: ***
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: usuario@EJEMPLO.COM

Valid starting       Expires              Service principal
08/30/2017 15:36:10  08/31/2017 15:36:10  krbtgt/EJEMPLO.COM@EJEMPLO.COM

Configuración de kadmin

Necesitará tener configurado el archivo /etc/krb5.conf en el cliente de kadmin, demás de tener activa la regla del servicio en el cortafuegos del servidor.

Configuración del ACL de kadmin

Cree una identidad administrativa:

kadmin.local:  add_principal usuario/admin@EJEMPLO.COM
WARNING: no policy specified for usuario/admin@EJEMPLO.COM; defaulting to no policy
Enter password for principal "usuario/admin@EJEMPLO.COM": ***
Re-enter password for principal "usuario/admin@EJEMPLO.COM": ***
Principal "usuario/admin@EJEMPLO.COM" created.

Añada el usuario «usuario» a la lista de control de acceso (ACL, por sus siglas en inglés) de kadmin:

/var/lib/krb5kdc/kadm5.acl
usuario/admin@EJEMPLO.COM *

El formato de este archivo está descrito en la documentación de Kerberos MIT (en inglés).

Configure el archivo kdc.conf:

/var/lib/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_ports = 750,88

[realms]
    EJEMPLO.COM = {
        database_name = /var/lib/krb5kdc/principal
        acl_file = /var/lib/krb5kdc/kadm5.acl
        key_stash_file = /var/lib/krb5kdc/.k5.EJEMPLO.COM
        kdc_ports = 750,88
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
    }

El formato de este archivo también está descrito en la documentación de Kerberos MIT (en inglés).

Reinicie krb5-kdc.service y krb5-kadmind.service.

Ahora puede usar kadmin desde su propio usuario, autenticando con Kerberos:

$ kadmin
Authenticating as principal usuario/admin@EJEMPLO.COM with password.
Password for usuario/admin@EJEMPLO.COM: ***
kadmin:

Identidades del servicio y tabla de claves

Primero que todo, asegurese que el archivo krb5.conf esté configurado en todos los equipos involucrados.

Una identidad (denotada en inglés como principal) de Kerberos tiene tres componentes, delimitados de la forma `primary/instance@REALM`. Para una identidad de usuario, el primary es simplemente el nombre de usuario e instance se omite o es un rol (p.ej. «admin» para un usuario administrativo): `usuario@EJEMPLO.COM` o `usuario/admin@EJEMPLO.COM`. Para los anfitriones, el primary es «host» e instance es el servidor de nombres de dominio completo (FQDN): `host/myserver.ejemplo.com@EJEMPLO.COM`. Para los servicios, el primary es una abreviación del nombre de servicio e instance es el FQDN: `nfs/myserver.ejemplo.com@EJEMPLO.COM`.

Generalmente, se puede omitir el REAL (o dominio), ya que se asume el del equipo local.

Con kadmin remoto

Es el método más fácil, sin embargo, requiere que se haya configurado kadmin.

Acceda a kadmin como superusuario (para escribir en la tabla de claves) desde el cliente, y autentíquese con su identidad administrativa:

client# kadmin -p usuario/admin
Authenticating as principal usuario/admin with password.
Password for usuario/admin@EJEMPLO.COM:
kadmin:

Añada una identidad para los servicios que vaya a utilizar; por ejemplo, «host» para autenticación por SSH o «nfs» para NFS:

kadmin: addprinc -randkey host/kbclient.ejemplo.com
WARNING: no policy specified for host/kbclient.ejemplo.com@EJEMPLO.COM; defaulting to no policy
Principal "host/kbclient.ejemplo.com@EJEMPLO.COM" created.

Añada las claves a la tabla:

kadmin: ktadd host/kbclient.ejemplo.com
Entry for principal host/kbclient.ejemplo.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kbclient.ejemplo.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

Sin kadmin remoto

Inicie kadmin en el servidor de Kerberos usando la autenticación de unix o Kerberos:

# kadmin.local
Authenticating as principal root/admin@EJEMPLO.COM with password.
kadmin.local:

Añada una identidad para los servicios que vaya a utilizar; por ejemplo, «host» para autenticación por SSH o «nfs» para NFS:

kadmin.local: addprinc -randkey host/kbclient.ejemplo.com
WARNING: no policy specified for host/kbclient.ejemplo.com@EJEMPLO.COM; defaulting to no policy
Principal "host/kbclient.ejemplo.com@EJEMPLO.COM" created.

Añada las claves a la tabla que será traspasada al cliente:

kadmin.local: ktadd -k kbclient.keytab host/kbclient.ejemplo.com
Entry for principal host/kbclient.ejemplo.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kbclient.ejemplo.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

Copie el archivo kbclient.keytab del servidor a los clientes usando SCP o similares y ajústele los permisos:

# install -b -o root -g root -m 600 kbclient.keytab /etc/krb5.keytab

Finalmente, elimine kbclient.keytab tanto en el servidor como en los clientes.

confianza entre dominios

Configure un segundo servidor como se mostró anteriormente, y cree una identidad que abarque los dominios de ambos KDCs. Esta identidad tiene que tener una contraseña segura, no usando -randkey; además de tener el mismo número de versión de llave (kvno) en ambos KDCs.

Para darle acceso a las identidades del dominio EJEMPLO.COM a los recursos de EJEMPLO.ORG, tiene que crear la siguiente identidad:

kadmin# addprinc krbtgt/EJEMPLO.ORG@EJEMPLO.COM

La sección [capaths] de krb5.conf puede ser usada para personalizar aún más las relaciones de confianza entre los dominios.

Autenticación por SSH

Ocupe las instrucciones de la sección Identidades del servicio y tabla de claves para crear una identidad para el servicio «host» en el cliente y servidor, después, añada las llaves de cada uno a sus tablas respectivas.

Edite la configuración de su servidor SSH para habilitar la autenticación GSSAPI:

/etc/ssh/sshd_config
# GSSAPI Options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

Y edite la configuración de su cliente para enviar peticiones GSSAPI:

/etc/ssh/ssh_config
Host *
  GSSAPIAuthentication yes
  GSSAPIDelegateCredentials yes

Obtenga un ticket de concesión de tickets antes de usar ssh:

$ kinit usuario@EJEMPLO.COM
Password for usuario@EJEMPLO.COM: ***

Agregue la opción -v a ssh para ver lo que sucede:

$ ssh sshserver.ejemplo.com -v
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).
Authenticated to sshserver.ejemplo.com ([192.168.100.136]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
Last login: Wed Aug 30 15:52:41 2017 from 192.168.100.1

Debería obtener un ticket del anfitrión en el cliente:

client$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: usuario@EJEMPLO.COM

Valid starting       Expires              Service principal
08/30/2017 15:37:40  08/31/2017 15:37:40  krbtgt/EJEMPLO.COM@EJEMPLO.COM
08/30/2017 15:53:04  08/31/2017 15:37:40  host/sshserver.ejemplo.com@EJEMPLO.COM

Autorización de otras identidades

Para permitir que otras identidades de Kerberos se autentiquen a una cuenta de usuario, añada el nombre de la identidad a la cuenta a autenticar en su archivo .k5login. Por ejemplo, para permitir que roberto@EJEMPLO.COM acceda por SSH a la cuenta de Alicia:

/home/alicia/.k5login
roberto@EJEMPLO.COM

Configuración de seguridad de NFS

Primero, configure su servidor NFS. Véase también NFS/Troubleshooting. Está altamente recomendado que configure un servicio de sincronización de hora tanto en los clientes como el servidor; ya que una desincronización en los relojes causará que esta configuración no funcione, sin siquiera darle mensajes de error útiles.

Siga las instrucciones en #Identidades del servicio y tabla de claves para crear la identidad del servicio «nfs» tanto en los clientes como el servidor, y agregue las llaves a sus tablas respectivas.

Servidor NFS

Añada alguna de las opciones de exportación de Kerberos. Si es necesario, puede especificar varias separadas por dos puntos y en orden de preferencia, p.ej. sec=krb5p:krb5i.

  • sec=krb5p usa Kerberos para la autenticación, chequeo de integridad y cifrado.
  • sec=krb5i usa Kerberos para la autenticación y el chequeo de integridad, pero transmite los datos sin cifrar.
  • sec=krb5 usa Kerberos sólo para la autenticación y transmite los datos no cifrados sin verificar la integridad.
  • sec=sys es la opción por defecto, y no ofrece ninguna protección criptográfica.
/etc/exports
/srv/export *(rw,async,no_subtree_check,no_root_squash,sec=krb5p)

Y vuelva a cargar las exportaciones:

# exportfs -arv

Cliente NFS

Monte el directorio exportado:

# mount nfsserver:/srv/export /mnt/

Puede agregar la opción -vv para obtener información adicional, y puede que necesite -t nfs4 y -o sec=krb5p o la configuración de seguridad que use.

Asegúrese de que funcione con el comando mount:

mount | grep nfs
nfsserver:/srv/export on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=krb5,clientaddr=192.168.100.139,local_lock=none,addr=192.168.100.136)

Navegadores

Algunos navegadores tienen soporte para el protocolo de Kerberos, pero por defecto viene desactivado. Aquí están las instrucciones para activarlo en algunos de estos:

Chromium

Chromium tiene que ser ejecutado con un parámetro que especifique la lista de sitios en los que se permite la autenticación con Kerberos. La forma más sencilla de hacer esto, es añadiendo un parámetro persistente al archivo de configuración:

/etc/chromium/policies/managed/test_policy.json
{
  "AuthServerAllowlist": "*.nombredecompañía.com",
  "DisableAuthNegotiateCnameLookup": true
}

Firefox

Para configurar los sitios de confianza en Firefox, visite about:config y establezca la propiedad network.negotiate-auth.trusted-uris al nombre del sitio (p.ej. «SITIO.COM», y nótese que no lleva el «*.» que ocupa Chrome).

Solución de problemas

Error «Cannot set GSSAPI authentication names»

Cannot set GSSAPI authentication names, aborting

En español: «No se pueden establecer los nombres de autenticación GSSAPI, abortando».

A su dominio le faltan las identidades kadmin/admin o kadmin/changepw.

Para los clientes, puede que hayan opciones o argumentos inválidos la primera vez que los configure si rpc-gssd no está activado. Para solventarlo, (Habilite o inicie nfs-client.target, pero si lo realiza después de la primera configuración, tendrá que reiniciar el servicio.

La autenticación SSH falla después de conectarse a un servdor que requiere GSSAPI con KeyExchange

Si le aparece alguno de los siguentes errores:

$ ssh -v -o GSSAPIDelegateCredentials=yes -o GSSAPIAuthentication=yes <user>@<IP address>
Unable to negotiate with <IP address> port 22: no matching key exchange method found. Their offer: gss-group14-sha1-...
$ ssh -v -o GSSAPIDelegateCredentials=yes -o GSSAPIKeyExchange=yes -o GSSAPIAuthentication=yes <user>@<IP address>
command-line: line 0: Bad configuration option: gssapikeyexchange

Significa que el paquete openssh no está configurado con el parche que habilita GSSIAPI en OpenSSH. Puede instalar openssh-gssapiAUR o seguir estas instrucciones (en inglés).

Véase también

Para más información (en inglés), vea: