Update: Practical recommendations - Webservers: CipherStrings match old CipherString...
[ach-master.git] / src / practical_settings / kerberos.tex
1 This section discusses various implementations of the Kerberos 5 authentication protocol
2 on Unix and Unix-like systems as well as on Microsoft Windows. 
3
4 \subsection{Overview}
5 \label{subsection:kerberos_overview}
6
7 Kerberos provides mutual authentication of two communicating parties, e.g. a user using a network service. The authentication process is mediated by a trusted third party, the Kerberos key distribution centre (KDC). Kerberos implements secure single-sign-on across a large number of network protocols and operating systems. Optionally, Kerberos can be used to create encrypted communications channels between the user and service.
8
9 \paragraph{Recommended reading}
10 An understanding of the Kerberos protocol is necessary for properly implementing a Kerberos setup. Also, in the following section some knowledge about the inner workings of Kerberos is assumed. Therefore we strongly recommend reading this excellent introduction first: \url{http://gost.isi.edu/publications/kerberos-neuman-tso.html}.
11 No further overview over Kerberos terminology and functions will be provided, for a discussion and a selection of relevant papers refer to \url{http://web.mit.edu/kerberos/papers.html}.
12
13 % describe realm, login, ticket exchanges here? would be quite lengthy and necessarily incomplete, so currently left out
14
15 The Kerberos protocol over time has been extended with a variety of extensions and Kerberos implementations provide additional services in addition to the aforementioned KDC. All discussed implementations provide support for trust relations between multiple realms, an administrative network service (kerberos-adm, kadmind) as well as a password changing service (kpasswd). Sometimes, alternative database backends for ticket storage, X.509 and SmartCard authentication are provided. Of those, only administrative and password changing services will be discussed.
16
17 Only the Kerberos 5 protocol and implementation will be discussed. Kerberos 4 is obsolete, insecure and its use is strongly discouraged.
18
19 \subsubsection{Providing a suitable Setup for secure Kerberos Operations}
20 \label{subsubsection:kerberos_secure_setup}
21
22 The aim of Kerberos is to unify authentication across a wide range of services, for many different users and use cases and on many computer platforms. The resulting complexity and attack surface make it necessary to carefully plan and continuously evaluate the security of the overall ecosystem in which Kerberos is deployed. Several assumptions are made on which the security of a Kerberos infrastructure relies:
23 \begin{itemize}
24         \item Every KDC in a realm needs to be trustworthy. The KDC's principal database must not become known to or changed by an attacker. The contents of the principal database enables the attacker to impersonate any user or service in the realm.
25         \item Synchronisation between KDCs must be secure, reliable and frequent. An attacker that is able to intercept or influence synchronisation messages obtains or influences parts of the principal database, enabling impersonation of affected principals. Unreliable or infrequent synchronisation enlarges the window of vulnerability after disabling principals or changing passwords that have been compromised or lost.
26         \item KDCs must be available. An attacker is able to inhibit authentication for services and users by cutting off their access to a KDC.
27         \item Users' passwords must be secure. Since Kerberos is a single-sign-on mechanism, a single password may enable an attacker to access a large number of services.
28         \item Service keytabs need to be secured against unauthorized access similarly to SSL/TLS server certificates. Obtaining a service keytab enables an attacker to impersonate a service.
29         \item DNS infrastructure must be secure and reliable. Hosts that provide services need consistent forward and reverse DNS entries. The identity of a service is tied to its DNS name, similarly the realm a client belongs to as well as the KDC, kpasswd and kerberos-adm servers may be specified in DNS TXT and SRV records. Spoofed DNS entries will cause denial-of-service situations and might endanger\cite{MITKrbDoc:realm_config,IETF:cat-krb-dns-locate-02} the security of a Kerberos realm.
30 % "might endanger" according to MITKrbDoc:realm_config, unfortunately no further details beyond the suspicion of vulnerability are provided
31 % IETF:cat-krb-dns-locate-02 mentions possible redirection to a compromised realm in setups with trust relations 
32         \item Clients and servers in Kerberos realms need to have synchronized clocks. Tickets in Kerberos are created with a limited, strictly enforced lifetime. This limits an attacker's window of opportunity for various attacks such as the decryption of tickets in sniffed network traffic or the use of tickets read from a client computer's memory. Kerberos will refuse tickets with old timestamps or timestamps in the future. This would enable an attacker with access to a systems clock to deny access to a service or all users logging in from a specific host.
33 \end{itemize}
34
35 Therefore we suggest:
36 \begin{itemize}
37         \item Secure all KDCs at least as strongly as the most secure service in the realm.
38         \item Dedicate physical (i.e. non-VM) machines to be KDCs. Do not run any services on those machines beyond the necessary KDC, kerberos-adm, kpasswd and kprop services. 
39         \item Restrict physical and administrative access to the KDCs as severely as possible. E.g. ssh access should be limited to responsible adminstrators and trusted networks. 
40         \item Encrypt and secure the KDCs backups.
41         \item Replicate your primary KDC to at least one secondary KDC.
42         \item Prefer easy-to-secure replication (propagation in Kerberos terms) methods.Especially avoid LDAP replication and database backends. LDAP enlarges the attack surface of your KDC and facilitates unauthorized access to the principal database e.g. by ACL misconfiguration.
43         \item Use DNSSEC. If that is not possible, at least ensure that all servers and clients in a realm use a trustworthy DNS server contacted via secure network links.
44         \item Use NTP on a trustworthy server via secure network links. 
45         \item Avoid services that require the user to enter a password which is then checked against Kerberos. Prefer services that are able to use authentication via service tickets, usually not requiring the user to enter a password except for the initial computer login to obtain a ticket-granting-ticket (TGT). This limits the ability of attackers to spy out passwords through compromised services.
46 \end{itemize}
47
48 \subsection{Implementations}
49 \label{subsection:kerberos_implementations}
50
51 \paragraph{Cryptographic Algorithms in Kerberos Implementations}
52
53 The encryption algorithms (commonly abbreviated 'etypes' or 'enctypes') in Kerberos exchanges are subject to negotiation between both sides of an exchange. Similarly, a ticket granting ticket (TGT), which is usually obtained on initial login, can only be issued if the principal contains a version of the password encrypted with an etype that is available both on the KDC and on the client where the login happens. Therefore, to ensure interoperability among components using different implementations as shown in table \ref{table:Kerberos_enctypes}, a selection of available etypes is necessary. However, the negotiation process may be subject to downgrade attacks\cite{AttKerbDepl} and weak hashing algorithms endanger integrity protection and password security. This means that the des3-cbc-sha1-kd or rc4-hmac algorithms should not be used, except if there is a concrete and unavoidable need to do so. Other des3-*, des-* and rc4-hmac-exp algorithms should never be used.
54
55 Along the lines of cipher string B, the following etypes are recommended: aes256-cts-hmac-sha1-96 camellia256-cts-cmac aes128-cts-hmac-sha1-96 camellia128-cts-cmac.
56
57 % XXX ask the author XXX
58 %\todo{say something about salt types, eg discourage the null salt type?}
59
60 \ctable[%
61 pos=ht,
62 caption={Commonly supported Kerberos encryption types by implementation. Algorithm names according to RFC3961, except where aliases can be used or the algorithm is named differently altogether as stated~\cite{rfc3962,rfc6803,rfc3961,rfc4120,rfc4120,krb519,JavaJGSS,ShishiEnctypes}.},
63 label=tab:Kerberos_enctypes,
64 ]{rl|llll}{%
65 \tnote[a]{named old-des3-cbc-sha1}
66 \tnote[b]{alias des3-cbc-sha1, des3-hmac-sha1}
67 \tnote[c]{named des3-cbc-sha1}
68 \tnote[d]{since Vista, Server 2008}
69 \tnote[e]{since 7, Server 2008R2}
70 \tnote[f]{since 1.9}
71 }{%
72 \FL   ID & Algorithm               & MIT           & Heimdal       & GNU Shishi & MS ActiveDirectory
73 \ML    1 & des-cbc-crc             & \yes          & \yes          & \yes       & \yes
74 \NN    2 & des-cbc-md4             & \yes          & \yes          & \yes       & \no
75 \NN    3 & des-cbc-md5             & \yes          & \yes          & \yes       & \yes
76 \NN    6 & des3-cbc-none           & \no           & \yes          & \yes       & \no
77 \NN    7 & des3-cbc-sha1           & \no           & \yes\tnote[a] & \no        & \no
78 \NN   16 & des3-cbc-sha1-kd        & \yes\tnote[b] & \yes\tnote[c] & \yes       & \no
79 \NN   17 & aes128-cts-hmac-sha1-96 & \yes          & \yes          & \yes       & \yes\tnote[d]
80 \NN   18 & aes256-cts-hmac-sha1-96 & \yes          & \yes          & \yes       & \yes\tnote[e]
81 \NN   23 & rc4-hmac                & \yes          & \yes          & \yes       & \yes
82 \NN   24 & rc4-hmac-exp            & \yes          & \no           & \yes       & \yes
83 \NN   25 & camellia128-cts-cmac    & \yes\tnote[f] & \no           & \no        & \no
84 \NN   26 & camellia256-cts-cmac    & \yes\tnote[f] & \no           & \no        & \no
85 \LL}
86 % \footnote{In MIT krb5 and Heimdal aliased to des3-hmac-sha1 and des3-cbc-sha1, colliding with the official string for enctype 7 which is referred to as old-des3-cbc-sha1 or similar.}
87 % AES enctypes: rfc3962
88 % Camellia enctypes: rfc3962
89 % enctype numbers list: rfc6803
90 % recommended settings: rfc3961
91 % enctype alias collision in MIT krb5: see src/lib/crypto/krb/etypes.c line 84 and src/include/krb5/krb5.hin line 438 compared to RFC3961
92 % in Heimdal, HEIM_WEAK_CRYPTO and DES3_OLD_ENCTYPE disable some DES and old 3DES algorithms at build time (lib/krb5/crypto-algs.c in source)
93 % etype recommendations, downgrade attacks and more: AttKerbDepl
94
95 \paragraph{Existing installations}
96
97 The configuration samples below assume new installations without preexisting principals.
98
99 For existing installations:
100 \begin{itemize}
101         \item Existing setups should be migrated to a new master key if the current master key is using a weak enctype.
102         \item When changing the list of supported\_enctypes, principals where all enctypes are no longer supported will cease to work.
103         \item Be aware that Kerberos 4 is obsolete and should not be used.
104         \item Principals with weak enctypes pose an increased risk for password bruteforce attacks if an attacker gains access to the database.
105 \end{itemize}
106
107 To get rid of principals with unsupported or weak enctypes, a password change is usually the easiest way. Service principals can simply be recreated. 
108 % XXX ask the author XXX
109 %\todo{force password change for old enctypes howto?}
110
111 \subsubsection{MIT krb5}
112 % hack.
113 \gdef\currentsubsectionname{krb5}
114 \paragraph{KDC configuration}
115 In \verb#/etc/krb5kdc/kdc.conf# set the following in your realm's
116 configuration:
117 \configfile{kdc.conf}{14-15}{Encryption flags for MIT krb5 KDC}
118 % XXX ask the author XXX
119 %\todo{TODO: recommendations for lifetime, proxiable, forwardable}
120
121 In \verb#/etc/krb5.conf# set in the [libdefaults] section:
122
123 \configfile{krb5.conf}{1-1,22-25}{Encryption flags for MIT krb5 client}
124 % XXX ask the author XXX
125 %\todo{verify MIT client config}
126
127 %\subsubsection{Heimdal Kerberos 5}
128 % XXX ask the author XXX
129 %\todo{research and write Heimdal Kerberos section}
130
131 % In \verb#/etc/krb5.conf# set in the \[libdefaults\] section:
132 % \begin{lstlisting}[breaklines]
133 %[libdefaults] 
134 %       default\_etypes= aes256-cts-hmac-sha1-96 camellia256-cts-cmac aes128-cts-hmac-sha1-96 camellia128-cts-cmac
135 %       default\_as\_etypes= aes256-cts-hmac-sha1-96 camellia256-cts-cmac aes128-cts-hmac-sha1-96 camellia128-cts-cmac
136 %       default\_tgs\_etypes= aes256-cts-hmac-sha1-96 camellia256-cts-cmac aes128-cts-hmac-sha1-96 camellia128-cts-cmac
137 % \end{lstlisting}
138
139 %\subsubsection{GNU Shishi}
140 %\todo{research and write GNU Shishi section}
141 %
142 %\subsubsection{Microsoft ActiveDirectory}
143 %\todo{research and write MS AD section}
144
145 % encryption type setting for a user account: http://blogs.msdn.com/b/openspecification/archive/2011/05/31/windows-configurations-for-kerberos-supported-encryption-type.aspx
146 % hunting down DES: http://blogs.technet.com/b/askds/archive/2010/10/19/hunting-down-des-in-order-to-securely-deploy-kerberos.aspx
147 % supported subset of encryption types, extension documentation: http://msdn.microsoft.com/en-us/library/cc233855.aspx
148 \paragraph{Upgrading a MIT krb5 database to a new enctype}
149 To check if an upgrade is necessary, execute the following on the KDC in question:
150 \begin{lstlisting}
151 root@kdc.example.com:~# kdb5_util list_mkeys
152 Master keys for Principal: K/M@EXAMPLE.COM
153 KVNO: 1, Enctype: des-cbc-crc, Active on: Thu Jan 01 00:00:00 UTC 1970 *
154 \end{lstlisting}
155 In this case, an old unsafe enctype is in use as indicated by the star following the key line.
156 To upgrade, proceed as follows. First create a new master key for the database with the appropriate enctype.
157 You will be prompted for a master password that can later be used to decrypt the database. A stash-file
158 containing this encryption key will also be written.
159 \begin{lstlisting}
160 root@kdc.example.com:~# kdb5_util add_mkey -s -e aes256-cts-hmac-sha1-96
161 Creating new master key for master key principal 'K/M@EXAMPLE.COM'
162 You will be prompted for a new database Master Password.
163 It is important that you NOT FORGET this password.
164 Enter KDC database master key:
165 Re-enter KDC database master key to verify:
166 \end{lstlisting}
167 Verify that the new master key has been successfully created. Note the key version number (KVNO) of the new master key, in this case \verb#2#.
168 \begin{lstlisting}
169 root@kdc.example.com:~# kdb5_util list_mkeys
170 Master keys for Principal: K/M@EXAMPLE.COM
171 KVNO: 2, Enctype: aes256-cts-hmac-sha1-96, No activate time set
172 KVNO: 1, Enctype: des-cbc-crc, Active on: Thu Jan 01 00:00:00 UTC 1970 *
173 \end{lstlisting}
174 Set the new master key as the active master key by giving its KVNO. The active master key will be indicated
175 by an asterisk in the master key list.
176 \begin{lstlisting}
177 root@kdc.example.com:~# kdb5_util use_mkey 2
178 root@kdc.example.com:~# kdb5_util list_mkeys
179 Master keys for Principal: K/M@EXAMPLE.COM
180 KVNO: 2, Enctype: aes256-cts-hmac-sha1-96, Active on: Wed May 13 14:14:18 UTC 2015 *
181 KVNO: 1, Enctype: des-cbc-crc, Active on: Thu Jan 01 00:00:00 UTC 1970
182 \end{lstlisting}
183 Reencrypt all principals to the new master key.
184 \begin{lstlisting}
185 root@kdc.example.com:~# kdb5_util update_princ_encryption
186 Re-encrypt all keys not using master key vno 2?
187 (type 'yes' to confirm)? yes
188 504 principals processed: 504 updated, 0 already current
189 \end{lstlisting}
190 After verifying that everything still works as desired it is possible to remove unused master
191 keys.
192 \begin{lstlisting}
193 root@kdc.example.com:~# kdb5_util purge_mkeys
194 Will purge all unused master keys stored in the 'K/M@EXAMPLE.COM' principal, are you sure?
195 (type 'yes' to confirm)? yes
196 OK, purging unused master keys from 'K/M@EXAMPLE.COM'...
197 Purging the following master key(s) from K/M@EXAMPLE.COM:
198 KVNO: 1
199 1 key(s) purged.
200 \end{lstlisting}