Kerberos is a network authentication protocol which was originally created by the Massachusetts Institute of Technology (MIT) as a way to securely provide authentication across a potentially hostile network. The Kerberos protocol uses strong cryptography so that both a client and server can prove their identity without sending any unencrypted secrets over the network. Kerberos can be described as an identity-verifying proxy system and as a trusted third-party authentication system. After a user authenticates with Kerberos, their communications can be encrypted to assure privacy and data integrity.
The only function of Kerberos is to provide the secure authentication of users and servers on the network. It does not provide authorization or auditing functions. It is recommended that Kerberos be used with other security methods which provide authorization and audit services.
The current version of the protocol is version 5, described in RFC 4120. Several free implementations of this protocol are available, covering a wide range of operating systems. MIT continues to develop their Kerberos package. It is commonly used in the US as a cryptography product, and has historically been subject to US export regulations. In FreeBSD, MIT Kerberos is available as the security/krb5 package or port. The Heimdal Kerberos implementation was explicitly developed outside of the US to avoid export regulations. The Heimdal Kerberos distribution is included in the base FreeBSD installation, and another distribution with more configurable options is available as security/heimdal in the Ports Collection.
In Kerberos users and services
      are identified as “principals” which are contained
      within an administrative grouping, called a
      “realm”.  A typical user principal would be of the
      form
      
      (realms are traditionally uppercase).user@REALM
This section provides a guide on how to set up Kerberos using the Heimdal distribution included in FreeBSD.
For purposes of demonstrating a Kerberos installation, the name spaces will be as follows:
The DNS domain (zone) will be
	  example.org.
The Kerberos realm will be
	  EXAMPLE.ORG.
Use real domain names when setting up Kerberos, even if it will run internally. This avoids DNS problems and assures inter-operation with other Kerberos realms.
The Key Distribution Center (KDC) is the centralized authentication service that Kerberos provides, the “trusted third party” of the system. It is the computer that issues Kerberos tickets, which are used for clients to authenticate to servers. Because the KDC is considered trusted by all other computers in the Kerberos realm, it has heightened security concerns. Direct access to the KDC should be limited.
While running a KDC requires few computing resources, a dedicated machine acting only as a KDC is recommended for security reasons.
To begin, install the security/heimdal package as follows:
#pkg install heimdal
Next, update /etc/rc.conf using
	sysrc as follows:
#sysrc kdc_enable=yes#sysrc kadmind_enable=yes
Next, edit /etc/krb5.conf as
	follows:
[libdefaults]
    default_realm = EXAMPLE.ORG
[realms]
    EXAMPLE.ORG = {
	kdc = kerberos.example.org
	admin_server = kerberos.example.org
    }
[domain_realm]
    .example.org = EXAMPLE.ORGIn this example, the KDC will use the
	fully-qualified hostname kerberos.example.org.  The
	hostname of the KDC must be resolvable in the
	DNS.
Kerberos can also use the
	DNS to locate KDCs, instead of a
	[realms] section in
	/etc/krb5.conf.  For large organizations
	that have their own DNS servers, the above
	example could be trimmed to:
[libdefaults]
      default_realm = EXAMPLE.ORG
[domain_realm]
    .example.org = EXAMPLE.ORGWith the following lines being included in the
	example.org zone
	file:
_kerberos._udp IN SRV 01 00 88kerberos.example.org. _kerberos._tcp IN SRV 01 00 88kerberos.example.org. _kpasswd._udp IN SRV 01 00 464kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749kerberos.example.org. _kerberos IN TXTEXAMPLE.ORG
In order for clients to be able to find the
	  Kerberos services, they
	  must have either
	  a fully configured /etc/krb5.conf or a
	  minimally configured /etc/krb5.conf
	  and a properly configured
	  DNS server.
Next, create the Kerberos
	database which contains the keys of all principals (users and
	hosts) encrypted with a master password.  It is not required
	to remember this password as it will be stored in
	/var/heimdal/m-key; it would be
	reasonable to use a 45-character random password for this
	purpose.  To create the master key, run
	kstash and enter a password:
#kstashMaster key:Verifying password - Master key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Once the master key has been created, the database should
	be initialized.  The Kerberos
	administrative tool kadmin(8) can be used on the KDC in a
	mode that operates directly on the database, without using the
	kadmind(8) network service, as
	kadmin -l.  This resolves the
	chicken-and-egg problem of trying to connect to the database
	before it is created.  At the kadmin
	prompt, use init to create the realm's
	initial database:
#kadmin -lkadmin>initRealm max ticket life [unlimited]:EXAMPLE.ORG
Lastly, while still in kadmin, create
	the first principal using add.  Stick to
	the default options for the principal for now, as these can be
	changed later with modify.
	Type ? at the prompt to see the available
	options.
kadmin>add tillmanMax ticket life [unlimited]: Max renewable life [unlimited]: Principal expiration time [never]: Password expiration time [never]: Attributes []: Password:Verifying password - Password:xxxxxxxxxxxxxxxx
Next, start the KDC services by running:
#service kdc start#service kadmind start
While there will not be any kerberized daemons running at this point, it is possible to confirm that the KDC is functioning by obtaining a ticket for the principal that was just created:
%kinittillman@EXAMPLE.ORG's Password:tillman
Confirm that a ticket was successfully obtained using
	klist:
%klistCredentials cache: FILE:/tmp/krb5cc_1001 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 2013 Aug 28 01:37:58 2013 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
The temporary ticket can be destroyed when the test is finished:
%kdestroy
The first step in configuring a server to use
	Kerberos authentication is to
	ensure that it has the correct configuration in
	/etc/krb5.conf.  The version from the
	KDC can be used as-is, or it can be
	regenerated on the new system.
Next, create /etc/krb5.keytab on the
	server.  This is the main part of “Kerberizing” a
	service — it corresponds to generating a secret shared
	between the service and the KDC.  The
	secret is a cryptographic key, stored in a
	“keytab”.  The keytab contains the server's host
	key, which allows it and the KDC to verify
	each others' identity.  It must be transmitted to the server
	in a secure fashion, as the security of the server can be
	broken if the key is made public.  Typically, the
	keytab is generated on an administrator's
	trusted machine using kadmin, then securely
	transferred to the server, e.g., with scp(1); it can also
	be created directly on the server if that is consistent with
	the desired security policy.  It is very important that the
	keytab is transmitted to the server in a secure fashion: if
	the key is known by some other party, that party can
	impersonate any user to the server!  Using
	kadmin on the server directly is
	convenient, because the entry for the host principal in the
	KDC database is also created using
	kadmin.
Of course, kadmin is a kerberized
	service; a Kerberos ticket is
	needed to authenticate to the network service, but to ensure
	that the user running kadmin is actually
	present (and their session has not been hijacked),
	kadmin will prompt for the password to get
	a fresh ticket.  The principal authenticating to the kadmin
	service must be permitted to use the kadmin
	interface, as specified in
	/var/heimdal/kadmind.acl.  See the
	section titled “Remote administration” in
	info heimdal for details on designing
	access control lists.  Instead of enabling remote
	kadmin access, the administrator could
	securely connect to the KDC via the local
	console or ssh(1), and perform administration locally
	using kadmin -l.
After installing /etc/krb5.conf,
	use add --random-key in
	kadmin.  This adds the server's host
	principal to the database, but does not extract a copy of the
	host principal key to a keytab.  To generate the keytab, use
	ext to extract the server's host principal
	key to its own keytab:
#kadminkadmin>add --random-key host/myserver.example.orgMax ticket life [unlimited]: Max renewable life [unlimited]: Principal expiration time [never]: Password expiration time [never]: Attributes []: kadmin>ext_keytabkadmin>host/myserver.example.orgexit
Note that ext_keytab stores the
	extracted key in /etc/krb5.keytab by
	default.  This is good when being run on the server being
	kerberized, but the --keytab
	   argument
	should be used when the keytab is being extracted
	elsewhere:path/to/file
#kadminkadmin>ext_keytab --keytab=/tmp/example.keytabkadmin>host/myserver.example.orgexit
The keytab can then be securely copied to the server using scp(1) or a removable media. Be sure to specify a non-default keytab name to avoid inserting unneeded keys into the system's keytab.
At this point, the server can read encrypted messages from
	the KDC using its shared key, stored in
	krb5.keytab.  It is now ready for the
	Kerberos-using services to be
	enabled.  One of the most common such services is
	sshd(8), which supports
	Kerberos via the
	GSS-API.  In
	/etc/ssh/sshd_config, add the
	line:
GSSAPIAuthentication yes
After making this change, sshd(8) must be restarted
	for the new configuration to take effect:
	service sshd restart.
As it was for the server, the client requires
	configuration in /etc/krb5.conf.  Copy
	the file in place (securely) or re-enter it as needed.
Test the client by using kinit,
	klist, and kdestroy from
	the client to obtain, show, and then delete a ticket for an
	existing principal.  Kerberos
	applications should also be able to connect to
	Kerberos enabled servers.  If that
	does not work but obtaining a ticket does, the problem is
	likely with the server and not with the client or the
	KDC.  In the case of kerberized
	ssh(1), GSS-API is disabled by
	default, so test using ssh -o
	  GSSAPIAuthentication=yes
	  .hostname
When testing a Kerberized application, try using a packet
	sniffer such as tcpdump to confirm that no
	sensitive information is sent in the clear.
Various Kerberos client applications are available. With the advent of a bridge so that applications using SASL for authentication can use GSS-API mechanisms as well, large classes of client applications can use Kerberos for authentication, from Jabber clients to IMAP clients.
Users within a realm typically have their
	Kerberos principal mapped to a
	local user account.  Occasionally, one needs to grant access
	to a local user account to someone who does not have a
	matching Kerberos principal.  For
	example, tillman@EXAMPLE.ORG may need
	access to the local user account webdevelopers.  Other
	principals may also need access to that local account.
The .k5login and
	.k5users files, placed in a user's home
	directory, can be used to solve this problem.  For example, if
	the following .k5login is placed in the
	home directory of webdevelopers, both principals
	listed will have access to that account without requiring a
	shared password:
tillman@example.org jdoe@example.org
Refer to ksu(1) for more information about
	.k5users.
The major difference between the MIT
	and Heimdal implementations is that kadmin
	has a different, but equivalent, set of commands and uses a
	different protocol.  If the KDC is
	MIT, the Heimdal version of
	kadmin cannot be used to administer the
	KDC remotely, and vice versa.
Client applications may also use slightly different
	command line options to accomplish the same tasks.  Following
	the instructions at http://web.mit.edu/Kerberos/www/
	is recommended.  Be careful of path issues: the
	MIT port installs into
	/usr/local/ by default, and the FreeBSD
	system applications run instead of the
	MIT versions if PATH lists
	the system directories first.
When using MIT Kerberos as a KDC on
	FreeBSD, the following edits should also be made to
	rc.conf:
kdc_program="/usr/local/sbin/kdc" kadmind_program="/usr/local/sbin/kadmind" kdc_flags="" kdc_enable="YES" kadmind_enable="YES"
When configuring and troubleshooting Kerberos, keep the following points in mind:
When using either Heimdal or MIT
	    Kerberos from ports, ensure
	    that the PATH lists the port's versions of
	    the client applications before the system versions.
If all the computers in the realm do not have synchronized time settings, authentication may fail. Section 29.11, “Clock Synchronization with NTP” describes how to synchronize clocks using NTP.
If the hostname is changed, the host/ principal must be
	    changed and the keytab updated.  This also applies to
	    special keytab entries like the HTTP/ principal used for
	    Apache's www/mod_auth_kerb.
All hosts in the realm must be both forward and
	    reverse resolvable in DNS or, at a
	    minimum, exist in /etc/hosts.  CNAMEs
	    will work, but the A and PTR records must be correct and
	    in place.  The error message for unresolvable hosts is not
	    intuitive: Kerberos5 refuses authentication
	      because Read req failed: Key table entry not
	      found.
Some operating systems that act as clients to the
	    KDC do not set the permissions for
	    ksu to be setuid root.  This means that
	    ksu does not work.  This is a
	    permissions problem, not a KDC
	    error.
With MIT
	    Kerberos, to allow a principal
	    to have a ticket life longer than the default lifetime of
	    ten hours, use modify_principal at the
	    kadmin(8) prompt to change the
	    maxlife of both the principal in
	    question and the
	    krbtgt
	    principal.  The principal can then use
	    kinit -l to request a ticket with a
	    longer lifetime.
When running a packet sniffer on the
	    KDC to aid in troubleshooting while
	    running kinit from a workstation, the
	    Ticket Granting Ticket (TGT) is sent
	    immediately, even before the password is typed.  This is
	    because the Kerberos server
	    freely transmits a TGT to any
	    unauthorized request.  However, every
	    TGT is encrypted in a key derived from
	    the user's password.  When a user types their password, it
	    is not sent to the KDC, it is instead
	    used to decrypt the TGT that
	    kinit already obtained.  If the
	    decryption process results in a valid ticket with a valid
	    time stamp, the user has valid
	    Kerberos credentials.  These
	    credentials include a session key for establishing secure
	    communications with the
	    Kerberos server in the future,
	    as well as the actual TGT, which is
	    encrypted with the Kerberos
	    server's own key.  This second layer of encryption allows
	    the Kerberos server to verify
	    the authenticity of each TGT.
Host principals can have a longer ticket lifetime. If the user principal has a lifetime of a week but the host being connected to has a lifetime of nine hours, the user cache will have an expired host principal and the ticket cache will not work as expected.
When setting up krb5.dict to
	    prevent specific bad passwords from being used as
	    described in kadmind(8), remember that it only
	    applies to principals that have a password policy assigned
	    to them.  The format used in
	    krb5.dict is one string per line.
	    Creating a symbolic link to
	    /usr/share/dict/words might be
	    useful.
Since Kerberos is an all or nothing approach, every service enabled on the network must either be modified to work with Kerberos or be otherwise secured against network attacks. This is to prevent user credentials from being stolen and re-used. An example is when Kerberos is enabled on all remote shells but the non-Kerberized POP3 mail server sends passwords in plain text.
The KDC is a single point of failure. By design, the KDC must be as secure as its master password database. The KDC should have absolutely no other services running on it and should be physically secure. The danger is high because Kerberos stores all passwords encrypted with the same master key which is stored as a file on the KDC.
A compromised master key is not quite as bad as one might fear. The master key is only used to encrypt the Kerberos database and as a seed for the random number generator. As long as access to the KDC is secure, an attacker cannot do much with the master key.
If the KDC is unavailable, network services are unusable as authentication cannot be performed. This can be alleviated with a single master KDC and one or more slaves, and with careful implementation of secondary or fall-back authentication using PAM.
Kerberos allows users, hosts
	and services to authenticate between themselves.  It does not
	have a mechanism to authenticate the
	KDC to the users, hosts, or services.  This
	means that a trojaned kinit could record
	all user names and passwords.  File system integrity checking
	tools like security/tripwire can
	alleviate this.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
    documentation may be
    sent to <freebsd-questions@FreeBSD.org>.
    Send questions about this document to <freebsd-doc@FreeBSD.org>.