Kerberos (Español)
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)
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: