Kerberos es un protocolo de autenticación de redes de ordenador creado por el MIT que permite a dos ordenadores en una red insegura demostrar su identidad mutuamente de manera segura. Sus diseñadores se concentraron primeramente en un modelo de cliente-servidor, y brinda autenticación mutua: tanto cliente como servidor verifican la identidad uno del otro. Los mensajes de autenticación están protegidos para evitar eavesdropping y ataques de Replay.
Kerberos se basa en criptografía de clave simétrica y requiere un tercero de confianza. Además, existen extensiones del protocolo para poder utilizar criptografía de clave asimétrica.
Kerberos utiliza su propia terminología que es necesario conocer previamente
– Realm: Define el dominio de autenticación del que se hará cargo el servidor kerberos. Para un realm se suele utilizar el dominio DNS de la organización y se suele poner en mayúsculas.
– Principal:
- Usuario: usuario@REALM
- Maquina: fqdn@REALM
- Servicio: servicio/fqdn@REALM
– Ticket: Se utilizan como identificadores de los principales y los facilita el servidor kerberos de la organización (autentication server de forma más precisa)
– KDC: Key Distribution Center
– Kerberos Server: se utiliza para modificar los principales.
Pasos previos
Para un correcto funcionamiento antes de instalar kerberos debemos tanto tener un servidor de hora ntp
y un Servidor DNS instalado, en nuestra maquina barney
ya tenemos un servidor dns configurado por lo cual solo deberemos añadir la siguiente linea
Configuración servidor DNS
Es importante configurar tanto la resolución directa, como la inversa y en el caso de tener un direccionamiento interno una resolución inversa del direccionamiento interno.
Named.conf.local
root@barney:/home/debian# cat /etc/bind/named.conf.local // // Do any local configuration here // // Consider adding the 1918 zones here, if they are not used in your // organization //include "/etc/bind/zones.rfc1918"; // Zona resolucion directa zone "jlramirez.gonzalonazareno.org" { type master; file "db.jlramirez"; }; // Zona resolucion inversa IP_FLOTANTE zone "22.172.in-addr.arpa" { type master; file "db.172.22"; }; // Zona resolucion inversa IP_FIJA zone "0.0.10.in-addr.arpa" { type master; file "db.10.0.0"; };
db.jlramirez
Añadimos las siguiente lineas dicho fichero
kerberos IN CNAME barney ldap IN CNAME barney _kerberos IN TXT "JLRAMIREZ.GONZALONAZARENO.ORG" _kerberos._udp IN SRV 0 0 88 kerberos.jlramirez.gonzalonazareno.org. _kerberos_adm._tcp IN SRV 0 0 749 kerberos.jlramirez.gonzalonazareno.org. _ldap._tcp IN SRV 0 0 389 ldap.jlramirez.gonzalonazareno.org.
db.172.22
root@barney:/home/debian# cat /var/cache/bind/db.172.22 ; ; BIND reverse data file for broadcast zone ; $TTL 604800 @ IN SOA jlramirez.gonzalonazareno.org. mail.jlramirez.gonzalonazareno.org. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS barney.jlramirez.gonzalonazareno.org. $ORIGIN 22.172.in-addr.arpa. 137.200 IN PTR barney.jlramirez.gonzalonazareno.org. 138.200 IN PTR homer.jlramirez.gonzalonazareno.org. 139.200 IN PTR lisa.jlramirez.gonzalonazareno.org.
db.10.0.0
root@barney:/home/debian# cat /var/cache/bind/db.10.0.0 ; ; BIND reverse data file for broadcast zone ; $TTL 604800 @ IN SOA jlramirez.gonzalonazareno.org. mail.jlramirez.gonzalonazareno.org. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS barney.jlramirez.gonzalonazareno.org. $ORIGIN 0.0.10.in-addr.arpa. 8 IN PTR barney.jlramirez.gonzalonazareno.org. 6 IN PTR homer.jlramirez.gonzalonazareno.org. 5 IN PTR lisa.jlramirez.gonzalonazareno.org.
Guardamos y reiniciamos el servicio systemctl restart bind9.service
Y comprobamos que resuelve nombre nuestro servidor:
root@barney:/home/debian# dig ldap.jlramirez.gonzalonazareno.org ; <<>> DiG 9.9.5-9+deb8u9-Debian <<>> ldap.jlramirez.gonzalonazareno.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28827 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ldap.jlramirez.gonzalonazareno.org. IN A ;; ANSWER SECTION: ldap.jlramirez.gonzalonazareno.org. 86400 IN CNAME barney.jlramirez.gonzalonazareno.org. barney.jlramirez.gonzalonazareno.org. 86400 IN A 172.22.200.137 ;; AUTHORITY SECTION: jlramirez.gonzalonazareno.org. 57071 IN NS barney.jlramirez.gonzalonazareno.org. ;; Query time: 3 msec ;; SERVER: 192.168.102.2#53(192.168.102.2) ;; WHEN: Mon Feb 20 17:08:29 UTC 2017 ;; MSG SIZE rcvd: 114
Configuración de clientes
En mi caso se trata de un subdominio por tanto todas las maquinas de mi red tiene como dominio principal 192.168.102.2
en el caso de no tenerlo debemos dirigirnos en los clientes a /etc/resolv.conf
y añadir la siguiente linea:
nameserver [Ip_Servidor_DNS]
Para un funcionamiento aun mas correcto es recomendable que el FQDN de cada una de nuestras maquinas de la red se encuentren correctamente configurados, comprobamos en ambas maquinas.
Para ello utilizamos el siguiente comando hostname -f
, si no fuera el mismo modificamos el nombre del mismo en /etc/hostname
Servidor de hora
Vamos a instalar en ambas maquinas apt install ntp
, en nuestro cliente establecemos a barney como servidor de hora de homer /etc/ntp.conf
:
# Specify one or more NTP servers. server barney.jlramirez.gonzalonazareno.org # Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board # on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for # more information. #pool 0.ubuntu.pool.ntp.org iburst #pool 1.ubuntu.pool.ntp.org iburst #pool 2.ubuntu.pool.ntp.org iburst #pool 3.ubuntu.pool.ntp.org iburst
Si realizamos una consulta ntpd -np
y vemos quien nos responde:
root@homer:/home/ubuntu# ntpq -np remote refid st t when poll reach delay offset jitter ============================================================================== 172.22.200.137 .INIT. 16 u - 64 0 0.000 0.000 0.000
Configuración LDAP
Partimos de un árbol LDAP creado en practicas anteriores
En el cual configuramos NSS
, libnss-ldap
Instalación de paquete para Servidor Kerberos5
Instalamos kdc, kadmin apt install krb5-kdc krb5-admin-server
, en el proceso de instalación nos solicitara el nombre del servidor kerberos JLRAMIREZ.GONZALONAZARENO.ORG
(en mayusculas) y el Kerberos realm
, administrative realm
que sera el nombre de la maquina servidor barney.jlramirez.gonzalonazareno.org
.
Configuración kerberos
Ahora procederemos con la configuración de el servidor kerberos para ello primero editamos el fichero /etc/krb5.conf
para que quede asi, comentaremos todas la lineas debajo de «realms»:
[libdefaults] default_realm = JLRAMIREZ.GONZALONAZARENO.ORG [realms] JLRAMIREZ.GONZALONAZARENO.ORG = { kdc = barney.jlramirez.gonzalonazareno.org admin_server = barney.jlramirez.gonzalonazareno.org } [domain_realm] .jlramirez.gonzalonazareno.org = JLRAMIREZ.GONZALONAZARENO.ORG jlramirez.gonzalonazareno.org = JLRAMIREZ.GONZALONAZARENO.ORG
Los dos primero apartados libdefaults
y domain_realm
vienen definidos pero tenemos que añadir nuestro nombre de reino realms
Editamos fichero kdc.conf
El siguiente paso es modificar el puerto de escucha de Kerberos que sera en el puerto 88 para ello modificamos el fichero /etc/krb5kdc/kdc.conf
:
[kdcdefaults] kdc_ports = 88 [realms] JLRAMIREZ.GONZALONAZARENO.ORG = { database_name = /var/lib/krb5kdc/principal admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab acl_file = /etc/krb5kdc/kadm5.acl key_stash_file = /etc/krb5kdc/stash kdc_ports = 88 max_life = 10h 0m 0s max_renewable_life = 7d 0h 0m 0s master_key_type = des3-hmac-sha1 supported_enctypes = aes256-cts:normal arcfour-hmac:normal des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3 default_principal_flags = +preauth }
Deshabilitamos la utilizacion de kerberos4
Para ello añadimos las siguientes lineas en /etc/default/krb5-kdc
KRB4_MODE=disable RUN_KRB524D=false
Creacion realm
Ejecutamos krb5_newrealm
, para realizarlo de una manera rápida vamos a instalar apt install rng-tools
y en otra terminal ejecutamos rngd -r /dev/urandom
y podremos observar como en la terminal donde estamos ejecutando el primer comando nos solicita una contraseña.
root@barney:/home/debian# krb5_newrealm This script should be run on the master KDC/admin server to initialize a Kerberos realm. It will ask you to type in a master key password. This password will be used to generate a key that is stored in /etc/krb5kdc/stash. You should try to remember this password, but it is much more important that it be a strong password than that it be remembered. However, if you lose the password and /etc/krb5kdc/stash, you cannot decrypt your Kerberos database. Loading random data Initializing database '/var/lib/krb5kdc/principal' for realm 'JLRAMIREZ.GONZALONAZARENO.ORG', master key name 'K/M@JLRAMIREZ.GONZALONAZARENO.ORG' 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: Now that your realm is set up you may wish to create an administrative principal using the addprinc subcommand of the kadmin.local program. Then, this principal can be added to /etc/krb5kdc/kadm5.acl so that you can use the kadmin program on other computers. Kerberos admin principals usually belong to a single user and end in /admin. For example, if jruser is a Kerberos administrator, then in addition to the normal jruser principal, a jruser/admin principal should be created. Don't forget to set up DNS information so your clients can find your KDC and admin servers. Doing so is documented in the administration guide.
Y reiniciamos lo servicios instalados
root@barney:/home/debian# systemctl restart krb5-kdc.service root@barney:/home/debian# systemctl restart krb5-admin-server.service
Ya podemos comprobar que los puertos especificados se encuentran escuchando:
tcp 0 0 0.0.0.0:464 0.0.0.0:* LISTEN 5643/kadmind udp 0 0 0.0.0.0:464 0.0.0.0:* 5643/kadmind udp 0 0 0.0.0.0:88 0.0.0.0:* 5621/krb5kdc
Realizar una conexión local al servidor de kerberos
Como prueba vamos a listar lo que hemos definido anteriormente
root@barney:/home/debian# kadmin.local Authenticating as principal root/admin@JLRAMIREZ.GONZALONAZARENO.ORG with password. kadmin.local: list_principals K/M@JLRAMIREZ.GONZALONAZARENO.ORG kadmin/admin@JLRAMIREZ.GONZALONAZARENO.ORG kadmin/barney.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG kadmin/changepw@JLRAMIREZ.GONZALONAZARENO.ORG krbtgt/JLRAMIREZ.GONZALONAZARENO.ORG@JLRAMIREZ.GONZALONAZARENO.ORG
Creamos un principal por cada uno de los servicios o usuarios
Vamos a crear un principal por cada uno de los servicios o usuarios que vamos a kerberizar. Los usuarios se autenticaran utilizando una contraseña, los equipos y servicios se crearan utilizando una contraseña aleatoria y la almacena en un fichero keytab
root@barney:/home/debian# kadmin.local Authenticating as principal root/admin@JLRAMIREZ.GONZALONAZARENO.ORG with password. kadmin.local: add_principal juanluis.ramirez WARNING: no policy specified for juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG; defaulting to no policy Enter password for principal "juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG": Re-enter password for principal "juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG": Principal "juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG" created. kadmin.local: add_principal -randkey host/barney.jlramirez.gonzalonazareno.org WARNING: no policy specified for host/barney.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG; defaulting to no policy Principal "host/barney.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG" created. kadmin.local: add_principal -randkey host/homer.jlramirez.gonzalonazareno.org WARNING: no policy specified for host/homer.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG; defaulting to no policy Principal "host/homer.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG" created. kadmin.local: add_principal -randkey ldap/barney.jlramirez.gonzalonazareno.org WARNING: no policy specified for ldap/barney.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG; defaulting to no policy Principal "ldap/barney.jlramirez.gonzalonazareno.org@JLRAMIREZ.GONZALONAZARENO.ORG" created.
Almacenar claves cifradas de los principales de barney
kadmin.local: ktadd host/barney.jlramirez.gonzalonazareno.org Entry for principal host/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab. Entry for principal host/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type des-cbc-crc added to keytab FILE:/etc/krb5.keytab. kadmin.local: ktadd ldap/barney.jlramirez.gonzalonazareno.org Entry for principal ldap/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal ldap/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab. Entry for principal ldap/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal ldap/barney.jlramirez.gonzalonazareno.org with kvno 2, encryption type des-cbc-crc added to keytab FILE:/etc/krb5.keytab.
Ahora ya tenemos creado el fichero de los principales con sus correspondientes claves cifradas
root@barney:/home/debian# ls -l /etc | grep krb5 -rw-r--r-- 1 root root 3619 Mar 1 10:44 krb5.conf -rw-r--r-- 1 root root 3286 Feb 20 19:57 krb5.conf.save drwx------ 2 root root 4096 Feb 21 09:28 krb5kdc -rw------- 1 root root 914 Mar 1 11:31 krb5.keytab
Creamos rol de administracion
Para ello vamos a descomentar la siguiente linea en /etc/krb5kdc/kadm5.acl
*/admin *
Accedemos a kadmin.local
y creamos un principal para el administrador:
root@barney:/home/debian# kadmin.local Authenticating as principal root/admin@JLRAMIREZ.GONZALONAZARENO.ORG with password. kadmin.local: add_principal boss/admin WARNING: no policy specified for boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG; defaulting to no policy Enter password for principal "boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG": Re-enter password for principal "boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG": Principal "boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG" created.
Configuración de cliente
Instalamos kerberos en el cliente homer apt install krb5-config krb5-user
.
Fichero configuración kerberos
Ahora vamos a observar que el fichero /etc/krb5.conf
quede asi, como en el paso anterior vamos a comentar todas la lineas que se vean en realms
y domain_reals
:
[libdefaults] default_realm = JLRAMIREZ.GONZALONAZARENO.ORG [realms] JLRAMIREZ.GONZALONAZARENO.ORG = { kdc = barney.jlramirez.gonzalonazareno.org admin_server = barney.jlramirez.gonzalonazareno.org } [domain_realm] .jlramirez.gonzalonazareno.org = JLRAMIREZ.GONZALONAZARENO.ORG jlramirez.gonzalonazareno.org = JLRAMIREZ.GONZALONAZARENO.ORG
Autenticarse desde el cliente al servidor Kerberos
Ahora desde el cliente homer
, vamos a autenticarnos al servidor Kerbero, el cual nos va a conceder un ticket por 10 horas
root@homer:/home/ubuntu# klist -5 klist: Credentials cache file '/tmp/krb5cc_0' not found ubuntu@homer:~$ kinit boss/admin Password for boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG: ubuntu@homer:~$ klist -5 Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: boss/admin@JLRAMIREZ.GONZALONAZARENO.ORG Valid starting Expires Service principal 03/04/2017 10:36:21 03/04/2017 20:36:21 krbtgt/JLRAMIREZ.GONZALONAZARENO.ORG@JLRAMIREZ.GONZALONAZARENO.ORG renew until 03/05/2017 10:36:13
rayon-te-content
También podemos loguearnos con nuestro usuario de ldap juanluis.ramirez
y observamos como nos concede un ticket por 10 horas también:
ubuntu@homer:~$ kinit juanluis.ramirez Password for juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG: ubuntu@homer:~$ klist -5 Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: juanluis.ramirez@JLRAMIREZ.GONZALONAZARENO.ORG Valid starting Expires Service principal 03/04/2017 11:03:00 03/04/2017 21:03:00 krbtgt/JLRAMIREZ.GONZALONAZARENO.ORG@JLRAMIREZ.GONZALONAZARENO.ORG renew until 03/05/2017 11:02:56
SASL/GSSAPI
Instalamos Modulo para realizar consoltas SASL/GSSAPI
Instalamos el modulo de configuracion de LDAP apt install libsasl2-modules-gssapi-mit
para que se puedan realizar las consultas con SASL/GSSAPI
Modificamos permisos del fichero krb5.keytab
Modificamos los permisos del fichero /etc/krb5.keytab
por chmod 640 /etc/krb5.keytab
y cambiamos el grupo propietario chgrp openldap /etc/krb5.keytab
Modificamos el fichero de configuracion de nuestro LDAP
Vamos a modificar /etc/ldap/slapd.d/cn\=config.ldif
y añadimos las siguientes lineas:
oclSasl-realm: JLRAMIREZ.GONZALONAZARENO.ORG olcAuthzRegexp: uid=(.*),cn=JLRAMIREZ.GONZALONAZARENO.ORG,cn=gssapi,cn=auth uid=$1,ou=People,dc=jlramirez,dc=gonzalonazareno,dc=org
Creamos fichero slapd.conf
Vamos a crear el fichero /etc/ldap/sasl2/slapd.conf
y añadimos la siguiente linea:
mech_list: GSSAPI
Y reiniciamos el servicio systemctl restart slapd
Comprobamos si esta activo SALSL/GSSAPI en LDAP
Vamos a comprobar si SALSL/GSSAPI
se encuentra activo
root@barney:/home/debian# ldapsearch -x -b "" -s base -LLL supportedSASLMechanisms dn: supportedSASLMechanisms: GSSAPI
PAM
Dicha herramienta se encarga de la autenticación en el sistema todas las aplicaciones que necesiten autenticación van pasar por PAM
Instalar PAM para kerberos
Vamos a instalar PAM para kerberos tanto en homer
como en barney
:
root@barney:/home/debian# apt install libpam-krb5 root@homer:/home/ubuntu# apt install libpam-krb5
Ahora nos vamos a la maquina homer e instalamos el siguiente paquete apt install --no-install-recommends libnss-ldapd
En el proceso de instalacion nos solicitara unos datos que vamos a configurar de la siguiente manera:
#LDAP server URI ldap://barney.jlramirez.gonzalonazarno.org #LDAP server search base: dc=jlramirez,dc=gonzalonazareno,dc=org #Name services to configure: Group Passwd Shadow
Crear directorio al vuelo
Vamos a añadir la siguiente linea en /etc/pam.d/common-session
:
session optional pam_mkhomedir.so
No se han encontrado comentarios