Kerberos (Español)

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-gssapi
AUR
o
seguir estas instrucciones (en inglés)
.
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