Kerberos to protokół służący do identyfikacji (autentykacji) stworzony w MIT w roku 1988. Klienci łączą się do serwera KDC (Kerberos Distribution Center – Centrum Dystrybucji Kluczy) używając pewnego rodzaju loginu nazywanego principal i otrzymują ticket (bilet). Tak długo jak ticket jest ważny klient ma dostęp do chronionych przez kerberos usług i nie potrzebuje identyfikacji przy każdym dostępie do zasobu. Klient i serwer KDC muszą być w tym samym realm (jest to zazwyczaj nazwa domeny pisana dużymi literami).
Wymagania wstępne.
Przed uruchomieniem Kerberosa wymagane jest ustawienie synchronizacji czasu przez NTP. Jeżeli DNS nie jest skonfigurowany w pliku /etc/hosts muszą być stosowne wpisy zastępujące DNS, np:
1 2 3 |
192.168.1.1 kdc.example.com kdc 192.168.1.2 server.example.com server 192.168.1.3 client.example.com client |
Po adresie IP zawsze musi być wpisana nazwa hosta w wersji pełnej tj. wraz z ddomeną (FQDN), a poźniej dopiero może być nazwa skrócona. W przeciwnym wypadku autentykacja Kerberos nie będzie działać.
Instalacja i konfiguracja serwera.
Instalacja pakietów Kerberos:
1 |
# yum install -y krb5-server krb5-workstation pam_krb5 |
Edycja pliku /var/kerberos/krb5kdc/kdc.conf
i zastąpienie EXAMPLE.COM
swoim własnym realm.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vim /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { #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 } |
Opcjonalnie można odkomentować linię master_key_type = aes256-cts
i dodać wpis w bloku [realms]: default_principal_flags = +preauth.
Usunie to kompatybilność z Kerberos 4 ale zwiększy bezpieczeństwo.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.LOCAL = { master_key_type = aes256-cts default_principal_flags = +preauth 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 } |
Teraz edycja pliku /etc/krb5.conf.
Odkomentować należy wszystkie linie, EXAMPLE.COM
zastępujemy swoim realmem, example.com
swoją domeną (np. EXAMPLE.COM = NAZWA.PL, example.com = nazwa.pl
), kerberos.example.com
zastępujemy swoim własnym serwerem KDC (np. kdc.example.com
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# vim krb5.conf Configuration snippets may be placed in this directory as well 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 = EXAMPLE.COM default_ccache_name = KEYRING:persistent:%{uid} [realms] EXAMPLE.COM = { kdc = kdc.example.com admin_server = kdc.example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM |
Edytujemy plik /var/kerberos/krb5kdc/kadm5.acl
i zastępujemy EXAMPLE.COM
swoim realm.
1 2 |
# vim /var/kerberos/krb5kdc/kadm5.acl */admin@EXAMPLE.COM * |
Tworzymy bazę Kerberos (zstępujemy EXAMPLE.COM
swoim realm):
1 2 3 4 5 6 7 8 |
# kdb5_util create -s -r EXAMPLE.COM Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'EXAMPLE.COM', master key name 'K/M@EXAMPLE.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: example Re-enter KDC database master key to verify: example |
Generowanie bazy trwa nawet kilka minut. Może być potrzeba napisania pewnej ilości znaków na klawiaturze aby zwiększyć entropie potrzebną do generowania danych.
Uruchomienie, autostart usługi Kerberos:
1 2 |
# systemctl start krb5kdc kadmin # systemctl enable krb5kdc kadmin |
Utworzenie użytkownika user01 na testy. Na klientach serwera kerberos (server.example.com i desktop.example.com wg opisów z linku na samym dole artykułu) user01 musi mieć to samo uid.
1 |
# useradd -u 3001 user01 |
Uruchomienie narzędzia administracji Kerberosem:
1 2 |
# kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. |
Dodanie administatora:
1 2 3 4 5 6 |
kadmin.local: addprinc root/admin Authenticating as principal root/admin@EXAMPLE.COM with password. WARNING: no policy specified for root/admin@EXAMPLE.COM; defaulting to no policy Enter password for principal "root/admin@EXAMPLE.COM": kerberos Re-enter password for principal "root/admin@EXAMPLE.COM": kerberos Principal "root/admin@EXAMPLE.COM" created. |
Dodanie użytkownika user01:
1 2 3 4 |
kadmin.local: addprinc user01 Enter password for principal "user01@EXAMPLE.COM": user01 Re-enter password for principal "user01@EXAMPLE.COM": user01 Principal "user01@EXAMPLE.COM" created. |
Dodanie hosta:
1 2 3 4 |
kadmin.local: addprinc -randkey host/kdc.example.com Authenticating as principal root/admin@EXAMPLE.COM with password. WARNING: no policy specified for host/kdc.example.com@EXAMPLE.COM; defaulting to no policy Principal "host/kdc.example.com@EXAMPLE.COM" created. |
Utworzenie lokalnej kopii bazy w pliku /etc/krb5.keytab
:
1 2 3 4 5 6 7 8 9 10 |
kadmin.local: ktadd host/kdc.example.com Authenticating as principal root/admin@EXAMPLE.COM with password. Entry for principal host/kdc.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type camellia256-cts-cmac added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type camellia128-cts-cmac added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des-hmac-sha1 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des-cbc-md5 added to keytab WRFILE:/etc/krb5.keytab. |
Wyjście z administracji Kerberosem:
1 |
kadmin.local: quit |
Edycja pliku /etc/ssh/ssh_config
i dodanie/odkomentowanie linii:
1 2 |
GSSAPIAuthentication yes GSSAPIDelegateCredentials yes |
Przeładowanie demona ssh:
1 |
# systemctl reload sshd |
Konfiguracja komponentu PAM z linii komend:
1 |
# authconfig --enablekrb5 --update |
Odblokowanie na firewallu portu dla usługi Kerberos (udp/tcp 88) oraz portu tcp 749 dla kadmin.
1 2 3 |
# firewall-cmd --permanent --add-service=kerberos # firewall-cmd --permanent --add-port=749/tcp # firewall-cmd --reload |
Test konfiguracji:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# su - user01 $ kinit Password for user01@EXAMPLE.COM: user01 $ klist Ticket cache: KEYRING:persistent:1000:1000 Default principal: user01@EXAMPLE.COM Valid starting Expires Service principal 07/22/2014 16:48:35 07/23/2014 16:48:11 krbtgt/EXAMPLE.COM@EXAMPLE.COM renew until 07/22/2014 16:48:11 $ klist -l |
Teraz powinna być możliwość wyjścia z konsoli ssh i ponownego zalogowania bez podawania hasła:
1 |
$ ssh kdc.example.com |
Aby usunąć ticket używamy komendy:
1 |
# kdestroy |
Konfiguracja serwera usługi NFS i klienta NFS korzystających z Kerberosa opisana jest w artykule o Network File System:
http://miroslaw.borodziuk.eu/index.php/2017/07/25/network-file-system/