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.

Info! Es importante recordar que el usuario puede variar segun el nombre del usuario al cual queramos conceder el ticket.

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

Info! Es importante tener abierto los puertos 749 tcp, 464 tcp, 464 udp y 88 upd.

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