This post describes how to install using MIT Kerberos version 5 in a Debian GNU/Linux system. The installation of Heimdal should be similar but is not addressed in this document.
Packages installation
This document considers four kinds of hosts:
- master: the master KDC (Key Distribution Center), i.e. the central authentication and administration server,
- slave: a slave KDC, that mirrors a master KDC,
- server: a host that offers Kerberos-authenticated access to services,
- client: a host that accessed Kerberos-authenticated services offered by a server.
The krb5-user
package must be installed on every host, including KDC servers and application servers. The krb5-kdc
package must be installed on every KDC server, either master or slave. The krb5-admin-server
package must be installed only on the master KDC:
root@master> apt-get install krb5-admin-server root@slave> apt-get install krb5-kdc root@client> apt-get install krb5-user root@server> apt-get install krb5-user
Configuration of NTP
The clocks of all hosts (KDCs, servers and clients) must be synchronized. One way is to use NTP. One server must be configured as an NTP server, by installing the ntp-simple
package:
root@server> apt-get install ntp-server ntp-simple
The ntpdate
packages must then be installed on every other host:
root@host> apt-get install ntpdate
On every host, put the NTP server host name as the value of the NTPSERVERS
variable in the /etc/default/ntpdate
file.
Configuration of /etc/krb5.conf
The /etc/krb5.conf
file is mainly configured through debconf
in package krb5-config
. The main purpose of this file is to define the default Kerberos realm, and the mapping of the domain name of a service that is accessed, to the realm used to authenticate when accessing that service. A Kerberos realm is an identifier for a domain of authentication. It is usually the DNS domain name in upper-case. In this document, the realm is CSG.IS.TITECH.AC.JP
.
In the debconf
configuration of krb5-config
, Kerberos 4 support should be disabled, in order to allow only Kerberos 5 authentication (which is more secure). As a recommended practice, generic host names should be used: the master KDC host should be named kerberos
, and the slave KDC hosts should be named kerberos-1
, kerberos-2
, etc. The FQDN (Fully Qualified Domain Name, i.e. the host name appended with the DNS domain name) of every KDC host must be given in thekrb5-config
package configuration.
WARNING: The master and slave KDC servers bind to the external network interfaces, and cannot be connected by clients if referring to a non-external network interface such as 127.*.*.*
. Therefore a valid FQDN or a non-variable IP address must be given to refer to the KDC servers.
The debconf
configuration of krb5-config
results in the generation of the /etc/krb5.conf
file. A /etc/krb5.conf
is required on every client, server and KDC server.
It must be noted that, from a service / server point of view, the realm used for authenticating when accessing a service is by default the upper-case conversion of the DNS domain name of the accessed server hostname. Thus, it would be required to handle one Kerberos realm for every DNS domain name. It is however possible to define only one realm for several DNS domains, by adding lines in the [domain_realm]
section in /etc/krb5.conf
, on every host. For instance, to use the CSG.IS.TITECH.AC.JP
realm when accessing hosts in DNS domain csg.is.titech.ac.jp
and all its sub-domains, the following two lines must be added:
[domain_realm] ... .csg.is.titech.ac.jp = CSG.IS.TITECH.AC.JP csg.is.titech.ac.jp = CSG.IS.TITECH.AC.JP
An alternative and more centralized way to configure mappings between DNS domain names and Kerberos realms is to add Kerberos-specific entries into the DNS. Since DNS may be subject to spoofing, that method is less secure, and is not described in this post. See: http://web.mit.edu/kerberos/www/krb5-1.4/krb5-1.4.1/doc/krb5-admin/Using-DNS.html
Configuration of /etc/krb5kdc/kdc.conf
The KDC master and slaves additionnally require a /etc/krb5kdc/kdc.conf
file to be created, that defines the realm managed by the KDC. This file can be generated using the Debian-specific command krb5_newrealm
provided in packagekrb5-config
, on the master KDC server. However, the following describes instead the use of the standard kdb5_util
command:
root@master> kdb5_util -r CSG.IS.TITECH.AC.JP create -s
This command automatically initializes the realm CSG.IS.TITECH.AC.JP
in the KDC, and creates a master key principal K/M@CSG.IS.TITECH.AC.JP
. The password must be remembered, as it is needed to repair the KDC database. Then, the KDC master servers can be started:
root@master> touch /etc/krb5kdc/kadm5.acl root@master> /etc/init.d/krb5-kdc start root@master> /etc/init.d/krb5-admin-server start
A first user principal must be created for administration. A principal is an identifier to which capabilities are attached. An user principal name has the form primary/secondary@realm
: the primary
part should be a valid Unix user name, and the/secondary
part is optional and may be used to distinguish the different identities of a single user. For instance, my Unix user is lenglet
, and one of my identities is dedicated to system administration. It is a common practice to create principals with /admin
as a secondary part, for administration purposes. I therefore create a lenglet/admin@CSG.IS.TITECH.AC.JP
principal:
root@master> kadmin.local kadmin.local: add_principal -clearpolicy lenglet/admin kadmin.local: quit
The kadmin.local
command is the master KDC administration client, that locally interacts with the administration server, and does not involve remote access nor authentication to modify the database. The kadmin
command is an equivalent command, to remotely manage the KDC database, that uses Kerberos authentication. At this point in the installation, only the kadmin.local
can be used, although the kadmin
command is the preferred command (and having any other remote access to the KDC servers, e.g. through remote shell, is not recommended for the sake of security).
Configuration of administration privileges
Administration of the Kerberos database remotely (using the kadmin
command) requires to grant privileges to the principal used to authenticate to the administration server. The administration privileges are defined in the /etc/krb5kdc/kadm5.acl
file. For instance, to grant all administrative privileges to the lenglet/admin
principal created above:
root@master> echo 'lenglet/admin *' >> /etc/krb5kdc/kadm5.acl root@master> /etc/init.d/krb5-admin-server restart
It is now possible to login to the Kerberos KDC using the lenglet/admin
principal:
lenglet@client> kinit lenglet/admin
and to test the privileges of that principal, by creating a new lenglet
principal:
lenglet@client> kadmin -p lenglet/admin kadmin: add_principal lenglet kadmin: quit
It is now possible to login to the Kerberos KDC using the lenglet
principal (by default, the principal name is the same as the Unix user name, with no secondary part):
lenglet@client> kdestroy lenglet@client> kinit lenglet@client> klist lenglet@client> kdestroy
Kerberos authentication using PAM (Pluggable Authentication Modules)
The example authentication scenario above directly uses the Kerberos commands (kinit
, kdestroy
, etc.), after login into the client host. It is however possible to use Kerberos authentication to login into client hosts, and to automatically obtain at login a Kerberos TGT (Ticket Granting Ticket) just like kinit
does, by using the Kerberos PAM modules. On all client hosts, the Kerberos PAM module must be installed:
root@client> apt-get install libpam-krb5
I decided to group in one file (/etc/pam.d/common-kerberos
) the configuration for Kerberos authentication, independently from services. The content of this file is:
auth sufficient pam_krb5.so try_first_pass forwardable account sufficient pam_krb5.so password sufficient pam_krb5.so try_first_pass
Then this file is included in all local only login applications PAM files, by adding the following line at the end of those files:
@include common-kerberos
On a typical client host with KDE installed, only the /etc/pam.d/kdm
and /etc/pam.d/login
files need to be modified.
Adding those lines at the end of files (in conjunction with the try_first_pass
flag) makes Kerberos authentication transparent to local users, and if a user is defined in both NSS (e.g. in /etc/passwd
or in an LDAP directory) and Kerberos, a TGT is granted transparently to the user at login.
To test, logout from the client host, login again, and check that a TGT has been granted:
lenglet@client> klist
Common kerberized servers
Standard Kerberos-enhanced server programs for remote access (remote shell, remote FTP, etc.) are available in separate packages:
root@server> apt-get install krb5-ftpd krb5-rsh-server krb5-telnetd
Every service must be explicitely identified with a specific principal in the KDC servers. More precisely, two principals must be created: host/serverfqdn
for all the services on the server, and ftp/serverfqdn
for the FTP service, etc., all with a random password / key unlike principals for normal users (this is configured with the -randkey
option):
root@server> kadmin -p lenglet/admin kadmin: add_principal -randkey host/serverfqdn kadmin: add_principal -randkey ftp/serverfqdn kadmin: quit
The generated password / key associated with those principals is a shared secret between the server and the KDC. The principals generated above must therefore be copied into a key table file (keytab) on the server, using the kadmin
command. The default keytab file is /etc/krb5.keytab
. To add the principals to the keytab, the user running kadmin
must be root
, because the /etc/krb5.keytab
file can be modified only by root
on the server:
root@server> kadmin -p lenglet/admin kadmin: ktadd host/serverfqdn kadmin: ktadd ftp/serverfqdn kadmin: quit
To list the keys in the keytab file:
root@server> klist -k /etc/krb5.keytab
WARNING: the server FQDN (as returned by the hostname
command on the server) must be exactly the same as the serverfqdn string, because the kerberized servers use that FQDN to look for keys in the keytab file.
Common kerberised clients
The corresponding Kerberos-enhanced client programs must be installed on every client:
root@client> apt-get install krb5-clients
It is then possible to use the kerberized services installed on a server:
lenglet@client> krb5-ftp serverfqdn lenglet@client> telnet.krb5 -a serverfqdn lenglet@client> telnet.krb5 -x serverfqdn
It must be noted that the -a
option must be given to kerberized telnet
to enforce automatic login (i.e., Kerberos authentication), or the -x
option to do that and additionally enforce encryption, otherwise the kerberized server refuses the connection (no unsecure connection is enabled in the Debian packages).
lenglet@client> krb5-rlogin -x serverfqdn lenglet@client> krb5-rsh -x serverfqdn ls
It must be noted that the -x
option must be given to the kerberized rlogin
and rsh
to enforce encryption, otherwise the kerberized servers refuse the connection.