Jump to content

# 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.

Artículos relacionados

- Integración con directorio activo
- Gestión de identidades

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)[enlace roto 2024-12-15].

## Véase también

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

- RHEL7: Configure a Kerberos KDC
- RHEL7: Configure a system to authenticate using Kerberos

Categories:

- Networking (Español)
- Authentication (Español)

Hidden category:

- Pages with dead links

Kerberos (Español)
Add topic