Skip to content

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

El usuario se conecta con un servidor de kerberos y obtiene un tiquet, este tiquet es la prueba de quien eres.

En los servidores kerberizados (que entienden kerberos), los usuarios presentas su tiquet, y el servidor kerberizado se comunica con el server kerberos para verificar quien es y autenticar.

Ejemplo de tiquet:

[isx47787241@i09 curs]$ klist
Ticket cache: FILE:/tmp/krb5cc_101709_6EW9wO
Default principal: isx47787241@INFORMATICA.ESCOLADELTREBALL.ORG

Valid starting     Expires            Service principal
18/02/20 08:46:52  19/02/20 08:46:52  krbtgt/INFORMATICA.ESCOLADELTREBALL.ORG@INFORMATICA.ESCOLADELTREBALL.ORG
18/02/20 08:46:56  19/02/20 08:46:52  nfs/madiba.informatica.escoladeltreball.org@INFORMATICA.ESCOLADELTREBALL.ORG

Auth autentication ( quien soy )

  • AP autentication provider: son los métodos de autenticación, es decir, verificar quien eres. Esto lo proporciona : kerberos, ldap, /etc/passwd

Autz authorization ( que tengo derecho a hacer)

  • IP information provider: Una vez sabido quien eres, que puedes hacer, se dicta a trabes de uid, gid, ... Se proporciona a trabes de: ldap, /etc/passwd

Autenticaction Provider AP Kerberos propoerciona el servei de proveïdor d'autenticació. No emmagatzema informació dels comptes d'usuari com el uid, git, shell, etc. Simplement emmagatzema i gestiona els passwords dels usuaris, en entrades anomenades principals en la seva base de dades. Coneixem els següents AP:

  • /etc/passwd que conté els password (AP) i també la informació dels comptes d'usuari (IP).
  • ldap el servei de directori ldap conté informació dels comptes d'usuari (IP) i també els seus passwords (AP).
  • kerberos que únicament actua de AP i no de IP.

Information Provider IP Els serveis que emmagatzemen la informació dels comptes d'usuari s'anomenen Information providers. Aquests serveis proporcionen el uid, gid, shell, gecos, etc. Els clàssics són /etc/passwd i ldap.

Kerberos utiliza tres servicios:

88/tcp open kerberos-sec
464/tcp open kpasswd5
749/tcp open kerberos-adm

kadmind: demonio del servicio de administración kerberos

krb5kdc: demonio de kerberos encargado de distribuir tiquets.

Instalación del server

instalar paquetes

dnf -y install krb5-server krb5-workstation

# tree /var/kerberos/
/var/kerberos/
├── krb5
│ └── user
└── krb5kdc
  ├── kadm5.acl
  └── kdc.conf

configurar

Modificar el fichero de configuración principal /etc/krb5.conf añadir nuestro dominio ( realm ) y especificar el servidor

includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = EDT.ORG
# default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EDT.ORG = {
 # servidor kerberos
  kdc = kserver.edt.org
  admin_server = kserver.edt.org
 }

[domain_realm]
 .edt.org = EDT.ORG 
 edt.org = EDT.ORG

Poner el REALM en el archivo /var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EDT.ORG = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

Crear base de datos

Crear la base de datos que almacena claves principales ( usuarios y maquinas )

kdb5_util create -s -P masterkey
# verificar que se a creado
tree /var/kerberos/
/var/kerberos/
├── krb5
│ └── user
└── krb5kdc
  ├── kadm5.acl
  ├── kdc.conf
  ├── principal
  ├── principal.kadm5
  ├── principal.kadm5.lock
  └── principal.ok

definir acl's

Definir las acl de los usuarios principales en /var/kerberos/krb5kdc/kadm5.acl

*/admin@EDT.ORG        *
superuser@EDT.ORG    *
pau/admin@EDT.ORG    *
marta@EDT.ORG        *

añadir usuarios

crear usuarios principales

kadmin.local -q "addprinc -pw superuser superuser"
kadmin.local -q "addprinc -pw admin admin"
kadmin.local -q "addprinc -pw kpere pere"
kadmin.local -q "addprinc -pw kmarta marta"
kadmin.local -q "addprinc -pw kjordi jordi"
kadmin.local -q "addprinc -pw kpau pau"
kadmin.local -q "addprinc -pw kpau pau/admin"

[root@kserver /]# kadmin.local -q "list_principals"
Authenticating as principal root/admin@EDT.ORG with password.
K/M@EDT.ORG
admin@EDT.ORG
jordi@EDT.ORG
kadmin/admin@EDT.ORG
kadmin/changepw@EDT.ORG
kadmin/kserver@EDT.ORG
kiprop/kserver@EDT.ORG
krbtgt/EDT.ORG@EDT.ORG
marta@EDT.ORG
pau/admin@EDT.ORG
pau@EDT.ORG
pere@EDT.ORG
superuser@EDT.ORG

Arrancar servicio

systemctl start bkrb5kdc.service
systemctl start kadmin.service

/usr/sbin/krb5kdc
/usr/sbin/kadmind -nofork

Instalación cliente

[root@kclient /]# dnf install -y krb5-workstation

Configuración

[root@khost /]# vi /etc/krb5.conf
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 default_realm = EDT.ORG
# default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EDT.ORG = {
 # servidor kerberos
  kdc = kserver.edt.org
  admin_server = kserver.edt.org
 }

[domain_realm]
 .edt.org = EDT.ORG 
 edt.org = EDT.ORG

Comprobar

[root@khost /]# kinit marta
Password for marta@EDT.ORG: 

[root@khost /]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: marta@EDT.ORG
Valid starting     Expires            Service principal
02/18/20 18:52:27  02/19/20 18:52:27  krbtgt/EDT.ORG@EDT.ORG

Gestión de acl

Definir las acl de los usuarios principales en /var/kerberos/krb5kdc/kadm5.acl

El orden de las entradas es significativo. La primera entrada coincidente especifica el principal en el que se aplica el acceso de control, ya sea solo en el principal o en el principal cuando opera en un principal objetivo.

Las líneas que contienen entradas de ACL deben tener el siguiente formato:

principal operation-mask [operation-target]

Operation mask: Permisos sobre que se podrá hacer, si la opción está en mayúscula se denegará la acción, en minúscula se aprueba, es decir a permite crear principales, A deniega crear principales.

Con la excepción de x que no tiene versión mayúscula.

a permite crear principals y politicas
c permite cambio de contraseñas a principals
d permite eliminar principals y politicas
i permite consultas sobre principals y politicas
l permite listar principals y politicas
m permite modificar principals y politicas
p permite la propagación de la base de datos principal (utilizada en la propagación de base de datos incremental)
s permite la configuración explícita de la clave para un principal
x Corto para admcil. Todos los privilegios
* Igual que x.

Operation target: opcional, objeto sobre el cual podrá aplicar los permisos indicados, si no se indica ninguno es a todos.

Ejemplos:

# el usuario kser01/admin tiene permido de: add,delete, modifi. sobre todos los usuarios
kuser01/admin@realm adm 

# el usuario kuser01 tiene permisos sobre todos los usuarios del grupo instance de: cambiar contraseña, modificar y ver datos de usuario
kuser01@EDT.ORG cim */instance@EDT.ORG

# si hay un mach solo se aplica la primea regla, kuser01 solo puede cambiar contraseñas
kuser01@EDT.ORG        c
kuser01@EDT.ORG        *

# kuser01 puede camiar contraseña solo a kuser05
kuser01@EDT.ORG        c kuser05@EDT.ORG

# todos los usuarios pueden cambiarse la contraseña a si mismos, no a los demas.
*@EDT.ORG        c     self@EDT.ORG

# ¿?
sms@ATHENA.MIT.EDU        x   * -maxlife 9h -postdateable

# kuser01 puede añadir usuarios pero no borrarlos
kuser01@EDT.ORG        aD

# todos los usuarios pueden cambiarse la contraseña y kuser01 ademas puede listar y ver usuarios.
*@EDT.ORG        c    self@EDT.ORG
kuser01@EDT.ORG        li

Gestión del servidor

Para gestionar el servidor kerberos se tiene las siguientes herramientas.

  • kadmin.local utilidad de administración de la base de datos de principals, esta utilidad accede a bajo nivel modifica los ficheros directamente. solo se puede utilizar directamente desde el servidor y con privilegios de root.
  • kadmin utilidad de administración que conecta con el servidor por red usando el protocolo kerberos. Se puede utilizar desde cualquier cliente o servidor y establece una conexión de red segura. Los permisos de ACL's establecidos determina los privilegios de cada usuario.

Desde host:

kinit kuser06     # pedir tiquet
klist        # listar tiquet
kpasswd        # cambiar password
Password for kuser06@EDT.ORG: 
Enter new password: 
Enter it again: 
Password changed.

kdestroy     # eliminar tiquet

Desde server:

# añadir principal
kadmin.local -q "addprinc superuser"
kadmin.local -q "addprinc -pw contrasena kuser03"
kadmin:  addprinc pau

# listar principals
kadmin.local -q "listprincs"
kadmin:  listprincs

# ver principal
kadmin:  getprinc kuser06
kadmin.local -q "getprinc kuser06"

# cabiar contraseña
kadmin.local -q "change_password kuser02"
kadmin.local -q "cpw kuser02"

# eliminar principal
kadmin.local -q "delprinc kuser02"

# modificar principal
kadmin: modprinc -expire "12/31 7pm" kuser01

https://docs.oracle.com/cd/E19683-01/816-0211/6m6nc66tj/index.html

addprinc -randkey host/sshd.edt.org
ktadd -k /etc/krb5.keytab host/sshd.edt.org
docker exec  kserver.edt.org kadmin -p marta -w kmarta -q listprincs

docker system prune