xref: /freebsd/crypto/heimdal/kdc/default_config.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1c19800e8SDoug Rabson /*
2ae771770SStanislav Sedov  * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan
3c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
4c19800e8SDoug Rabson  * All rights reserved.
5c19800e8SDoug Rabson  *
6ae771770SStanislav Sedov  * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
7ae771770SStanislav Sedov  *
8c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
9c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
10c19800e8SDoug Rabson  * are met:
11c19800e8SDoug Rabson  *
12c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
13c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
14c19800e8SDoug Rabson  *
15c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
16c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
17c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
18c19800e8SDoug Rabson  *
19c19800e8SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
20c19800e8SDoug Rabson  *    may be used to endorse or promote products derived from this software
21c19800e8SDoug Rabson  *    without specific prior written permission.
22c19800e8SDoug Rabson  *
23c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24c19800e8SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26c19800e8SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27c19800e8SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28c19800e8SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29c19800e8SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30c19800e8SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31c19800e8SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32c19800e8SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33c19800e8SDoug Rabson  * SUCH DAMAGE.
34c19800e8SDoug Rabson  */
35c19800e8SDoug Rabson 
36c19800e8SDoug Rabson #include "kdc_locl.h"
37c19800e8SDoug Rabson #include <getarg.h>
38c19800e8SDoug Rabson #include <parse_bytes.h>
39c19800e8SDoug Rabson 
40c19800e8SDoug Rabson krb5_error_code
krb5_kdc_get_config(krb5_context context,krb5_kdc_configuration ** config)41c19800e8SDoug Rabson krb5_kdc_get_config(krb5_context context, krb5_kdc_configuration **config)
42c19800e8SDoug Rabson {
43c19800e8SDoug Rabson     krb5_kdc_configuration *c;
44c19800e8SDoug Rabson 
45c19800e8SDoug Rabson     c = calloc(1, sizeof(*c));
46c19800e8SDoug Rabson     if (c == NULL) {
47ae771770SStanislav Sedov 	krb5_set_error_message(context, ENOMEM, "malloc: out of memory");
48c19800e8SDoug Rabson 	return ENOMEM;
49c19800e8SDoug Rabson     }
50c19800e8SDoug Rabson 
51c19800e8SDoug Rabson     c->require_preauth = TRUE;
52c19800e8SDoug Rabson     c->kdc_warn_pwexpire = 0;
53c19800e8SDoug Rabson     c->encode_as_rep_as_tgs_rep = FALSE;
54*cf771f22SStanislav Sedov     c->tgt_use_strongest_session_key = FALSE;
55ae771770SStanislav Sedov     c->preauth_use_strongest_session_key = FALSE;
56*cf771f22SStanislav Sedov     c->svc_use_strongest_session_key = FALSE;
57ae771770SStanislav Sedov     c->use_strongest_server_key = TRUE;
58c19800e8SDoug Rabson     c->check_ticket_addresses = TRUE;
59c19800e8SDoug Rabson     c->allow_null_ticket_addresses = TRUE;
60c19800e8SDoug Rabson     c->allow_anonymous = FALSE;
61c19800e8SDoug Rabson     c->trpolicy = TRPOLICY_ALWAYS_CHECK;
62c19800e8SDoug Rabson     c->enable_pkinit = FALSE;
63c19800e8SDoug Rabson     c->pkinit_princ_in_cert = TRUE;
64c19800e8SDoug Rabson     c->pkinit_require_binding = TRUE;
65c19800e8SDoug Rabson     c->db = NULL;
66c19800e8SDoug Rabson     c->num_db = 0;
67c19800e8SDoug Rabson     c->logf = NULL;
68c19800e8SDoug Rabson 
69c19800e8SDoug Rabson     c->require_preauth =
70c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
71c19800e8SDoug Rabson 				     c->require_preauth,
72c19800e8SDoug Rabson 				     "kdc", "require-preauth", NULL);
73ae771770SStanislav Sedov #ifdef DIGEST
74c19800e8SDoug Rabson     c->enable_digest =
75c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
76c19800e8SDoug Rabson 				     FALSE,
77c19800e8SDoug Rabson 				     "kdc", "enable-digest", NULL);
78c19800e8SDoug Rabson 
79c19800e8SDoug Rabson     {
80c19800e8SDoug Rabson 	const char *digests;
81c19800e8SDoug Rabson 
82c19800e8SDoug Rabson 	digests = krb5_config_get_string(context, NULL,
83c19800e8SDoug Rabson 					 "kdc",
84c19800e8SDoug Rabson 					 "digests_allowed", NULL);
85c19800e8SDoug Rabson 	if (digests == NULL)
86c19800e8SDoug Rabson 	    digests = "ntlm-v2";
87c19800e8SDoug Rabson 	c->digests_allowed = parse_flags(digests,_kdc_digestunits, 0);
88c19800e8SDoug Rabson 	if (c->digests_allowed == -1) {
89c19800e8SDoug Rabson 	    kdc_log(context, c, 0,
90c19800e8SDoug Rabson 		    "unparsable digest units (%s), turning off digest",
91c19800e8SDoug Rabson 		    digests);
92c19800e8SDoug Rabson 	    c->enable_digest = 0;
93c19800e8SDoug Rabson 	} else if (c->digests_allowed == 0) {
94c19800e8SDoug Rabson 	    kdc_log(context, c, 0,
95c19800e8SDoug Rabson 		    "no digest enable, turning digest off",
96c19800e8SDoug Rabson 		    digests);
97c19800e8SDoug Rabson 	    c->enable_digest = 0;
98c19800e8SDoug Rabson 	}
99c19800e8SDoug Rabson     }
100ae771770SStanislav Sedov #endif
101c19800e8SDoug Rabson 
102ae771770SStanislav Sedov #ifdef KX509
103c19800e8SDoug Rabson     c->enable_kx509 =
104c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
105c19800e8SDoug Rabson 				     FALSE,
106c19800e8SDoug Rabson 				     "kdc", "enable-kx509", NULL);
107c19800e8SDoug Rabson 
108c19800e8SDoug Rabson     if (c->enable_kx509) {
109c19800e8SDoug Rabson 	c->kx509_template =
110c19800e8SDoug Rabson 	    krb5_config_get_string(context, NULL,
111c19800e8SDoug Rabson 				   "kdc", "kx509_template", NULL);
112c19800e8SDoug Rabson 	c->kx509_ca =
113c19800e8SDoug Rabson 	    krb5_config_get_string(context, NULL,
114c19800e8SDoug Rabson 				   "kdc", "kx509_ca", NULL);
115c19800e8SDoug Rabson 	if (c->kx509_ca == NULL || c->kx509_template == NULL) {
116c19800e8SDoug Rabson 	    kdc_log(context, c, 0,
117c19800e8SDoug Rabson 		    "missing kx509 configuration, turning off");
118c19800e8SDoug Rabson 	    c->enable_kx509 = FALSE;
119c19800e8SDoug Rabson 	}
120c19800e8SDoug Rabson     }
121ae771770SStanislav Sedov #endif
122ae771770SStanislav Sedov 
123*cf771f22SStanislav Sedov     c->tgt_use_strongest_session_key =
124ae771770SStanislav Sedov 	krb5_config_get_bool_default(context, NULL,
125*cf771f22SStanislav Sedov 				     c->tgt_use_strongest_session_key,
126ae771770SStanislav Sedov 				     "kdc",
127*cf771f22SStanislav Sedov 				     "tgt-use-strongest-session-key", NULL);
128ae771770SStanislav Sedov     c->preauth_use_strongest_session_key =
129ae771770SStanislav Sedov 	krb5_config_get_bool_default(context, NULL,
130ae771770SStanislav Sedov 				     c->preauth_use_strongest_session_key,
131ae771770SStanislav Sedov 				     "kdc",
132ae771770SStanislav Sedov 				     "preauth-use-strongest-session-key", NULL);
133*cf771f22SStanislav Sedov     c->svc_use_strongest_session_key =
134ae771770SStanislav Sedov 	krb5_config_get_bool_default(context, NULL,
135*cf771f22SStanislav Sedov 				     c->svc_use_strongest_session_key,
136ae771770SStanislav Sedov 				     "kdc",
137*cf771f22SStanislav Sedov 				     "svc-use-strongest-session-key", NULL);
138ae771770SStanislav Sedov     c->use_strongest_server_key =
139ae771770SStanislav Sedov 	krb5_config_get_bool_default(context, NULL,
140ae771770SStanislav Sedov 				     c->use_strongest_server_key,
141ae771770SStanislav Sedov 				     "kdc",
142ae771770SStanislav Sedov 				     "use-strongest-server-key", NULL);
143c19800e8SDoug Rabson 
144c19800e8SDoug Rabson     c->check_ticket_addresses =
145c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
146c19800e8SDoug Rabson 				     c->check_ticket_addresses,
147c19800e8SDoug Rabson 				     "kdc",
148c19800e8SDoug Rabson 				     "check-ticket-addresses", NULL);
149c19800e8SDoug Rabson     c->allow_null_ticket_addresses =
150c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
151c19800e8SDoug Rabson 				     c->allow_null_ticket_addresses,
152c19800e8SDoug Rabson 				     "kdc",
153c19800e8SDoug Rabson 				     "allow-null-ticket-addresses", NULL);
154c19800e8SDoug Rabson 
155c19800e8SDoug Rabson     c->allow_anonymous =
156c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
157c19800e8SDoug Rabson 				     c->allow_anonymous,
158c19800e8SDoug Rabson 				     "kdc",
159c19800e8SDoug Rabson 				     "allow-anonymous", NULL);
160c19800e8SDoug Rabson 
161c19800e8SDoug Rabson     c->max_datagram_reply_length =
162c19800e8SDoug Rabson 	krb5_config_get_int_default(context,
163c19800e8SDoug Rabson 				    NULL,
164c19800e8SDoug Rabson 				    1400,
165c19800e8SDoug Rabson 				    "kdc",
166c19800e8SDoug Rabson 				    "max-kdc-datagram-reply-length",
167c19800e8SDoug Rabson 				    NULL);
168c19800e8SDoug Rabson 
169c19800e8SDoug Rabson     {
170c19800e8SDoug Rabson 	const char *trpolicy_str;
171c19800e8SDoug Rabson 
172c19800e8SDoug Rabson 	trpolicy_str =
173c19800e8SDoug Rabson 	    krb5_config_get_string_default(context, NULL, "DEFAULT", "kdc",
174c19800e8SDoug Rabson 					   "transited-policy", NULL);
175c19800e8SDoug Rabson 	if(strcasecmp(trpolicy_str, "always-check") == 0) {
176c19800e8SDoug Rabson 	    c->trpolicy = TRPOLICY_ALWAYS_CHECK;
177c19800e8SDoug Rabson 	} else if(strcasecmp(trpolicy_str, "allow-per-principal") == 0) {
178c19800e8SDoug Rabson 	    c->trpolicy = TRPOLICY_ALLOW_PER_PRINCIPAL;
179c19800e8SDoug Rabson 	} else if(strcasecmp(trpolicy_str, "always-honour-request") == 0) {
180c19800e8SDoug Rabson 	    c->trpolicy = TRPOLICY_ALWAYS_HONOUR_REQUEST;
181c19800e8SDoug Rabson 	} else if(strcasecmp(trpolicy_str, "DEFAULT") == 0) {
182c19800e8SDoug Rabson 	    /* default */
183c19800e8SDoug Rabson 	} else {
184c19800e8SDoug Rabson 	    kdc_log(context, c, 0,
185c19800e8SDoug Rabson 		    "unknown transited-policy: %s, "
186c19800e8SDoug Rabson 		    "reverting to default (always-check)",
187c19800e8SDoug Rabson 		    trpolicy_str);
188c19800e8SDoug Rabson 	}
189c19800e8SDoug Rabson     }
190c19800e8SDoug Rabson 
191c19800e8SDoug Rabson     c->encode_as_rep_as_tgs_rep =
192c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
193c19800e8SDoug Rabson 				     c->encode_as_rep_as_tgs_rep,
194c19800e8SDoug Rabson 				     "kdc",
195c19800e8SDoug Rabson 				     "encode_as_rep_as_tgs_rep", NULL);
196c19800e8SDoug Rabson 
197c19800e8SDoug Rabson     c->kdc_warn_pwexpire =
198c19800e8SDoug Rabson 	krb5_config_get_time_default (context, NULL,
199c19800e8SDoug Rabson 				      c->kdc_warn_pwexpire,
200c19800e8SDoug Rabson 				      "kdc", "kdc_warn_pwexpire", NULL);
201c19800e8SDoug Rabson 
202c19800e8SDoug Rabson 
203c19800e8SDoug Rabson     c->enable_pkinit =
204c19800e8SDoug Rabson 	krb5_config_get_bool_default(context,
205c19800e8SDoug Rabson 				     NULL,
206c19800e8SDoug Rabson 				     c->enable_pkinit,
207c19800e8SDoug Rabson 				     "kdc",
208c19800e8SDoug Rabson 				     "enable-pkinit",
209c19800e8SDoug Rabson 				     NULL);
210c19800e8SDoug Rabson 
211ae771770SStanislav Sedov 
212ae771770SStanislav Sedov     c->pkinit_kdc_identity =
213c19800e8SDoug Rabson 	krb5_config_get_string(context, NULL,
214c19800e8SDoug Rabson 			       "kdc", "pkinit_identity", NULL);
215ae771770SStanislav Sedov     c->pkinit_kdc_anchors =
216ae771770SStanislav Sedov 	krb5_config_get_string(context, NULL,
217c19800e8SDoug Rabson 			       "kdc", "pkinit_anchors", NULL);
218ae771770SStanislav Sedov     c->pkinit_kdc_cert_pool =
219c19800e8SDoug Rabson 	krb5_config_get_strings(context, NULL,
220c19800e8SDoug Rabson 				"kdc", "pkinit_pool", NULL);
221ae771770SStanislav Sedov     c->pkinit_kdc_revoke =
222c19800e8SDoug Rabson 	krb5_config_get_strings(context, NULL,
223c19800e8SDoug Rabson 				"kdc", "pkinit_revoke", NULL);
224ae771770SStanislav Sedov     c->pkinit_kdc_ocsp_file =
225c19800e8SDoug Rabson 	krb5_config_get_string(context, NULL,
226c19800e8SDoug Rabson 			       "kdc", "pkinit_kdc_ocsp", NULL);
227ae771770SStanislav Sedov     c->pkinit_kdc_friendly_name =
228ae771770SStanislav Sedov 	krb5_config_get_string(context, NULL,
229ae771770SStanislav Sedov 			       "kdc", "pkinit_kdc_friendly_name", NULL);
230c19800e8SDoug Rabson     c->pkinit_princ_in_cert =
231c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
232c19800e8SDoug Rabson 				     c->pkinit_princ_in_cert,
233c19800e8SDoug Rabson 				     "kdc",
234c19800e8SDoug Rabson 				     "pkinit_principal_in_certificate",
235c19800e8SDoug Rabson 				     NULL);
236c19800e8SDoug Rabson     c->pkinit_require_binding =
237c19800e8SDoug Rabson 	krb5_config_get_bool_default(context, NULL,
238c19800e8SDoug Rabson 				     c->pkinit_require_binding,
239c19800e8SDoug Rabson 				     "kdc",
240c19800e8SDoug Rabson 				     "pkinit_win2k_require_binding",
241c19800e8SDoug Rabson 				     NULL);
242c19800e8SDoug Rabson     c->pkinit_dh_min_bits =
243c19800e8SDoug Rabson 	krb5_config_get_int_default(context, NULL,
244c19800e8SDoug Rabson 				    0,
245c19800e8SDoug Rabson 				    "kdc", "pkinit_dh_min_bits", NULL);
246c19800e8SDoug Rabson 
247c19800e8SDoug Rabson     *config = c;
248c19800e8SDoug Rabson 
249c19800e8SDoug Rabson     return 0;
250c19800e8SDoug Rabson }
251ae771770SStanislav Sedov 
252ae771770SStanislav Sedov krb5_error_code
krb5_kdc_pkinit_config(krb5_context context,krb5_kdc_configuration * config)253ae771770SStanislav Sedov krb5_kdc_pkinit_config(krb5_context context, krb5_kdc_configuration *config)
254ae771770SStanislav Sedov {
255ae771770SStanislav Sedov #ifdef PKINIT
256ae771770SStanislav Sedov #ifdef __APPLE__
257ae771770SStanislav Sedov     config->enable_pkinit = 1;
258ae771770SStanislav Sedov 
259ae771770SStanislav Sedov     if (config->pkinit_kdc_identity == NULL) {
260ae771770SStanislav Sedov 	if (config->pkinit_kdc_friendly_name == NULL)
261ae771770SStanislav Sedov 	    config->pkinit_kdc_friendly_name =
262ae771770SStanislav Sedov 		strdup("O=System Identity,CN=com.apple.kerberos.kdc");
263ae771770SStanislav Sedov 	config->pkinit_kdc_identity = strdup("KEYCHAIN:");
264ae771770SStanislav Sedov     }
265ae771770SStanislav Sedov     if (config->pkinit_kdc_anchors == NULL)
266ae771770SStanislav Sedov 	config->pkinit_kdc_anchors = strdup("KEYCHAIN:");
267ae771770SStanislav Sedov 
268ae771770SStanislav Sedov #endif /* __APPLE__ */
269ae771770SStanislav Sedov 
270ae771770SStanislav Sedov     if (config->enable_pkinit) {
271ae771770SStanislav Sedov 	if (config->pkinit_kdc_identity == NULL)
272ae771770SStanislav Sedov 	    krb5_errx(context, 1, "pkinit enabled but no identity");
273ae771770SStanislav Sedov 
274ae771770SStanislav Sedov 	if (config->pkinit_kdc_anchors == NULL)
275ae771770SStanislav Sedov 	    krb5_errx(context, 1, "pkinit enabled but no X509 anchors");
276ae771770SStanislav Sedov 
277ae771770SStanislav Sedov 	krb5_kdc_pk_initialize(context, config,
278ae771770SStanislav Sedov 			       config->pkinit_kdc_identity,
279ae771770SStanislav Sedov 			       config->pkinit_kdc_anchors,
280ae771770SStanislav Sedov 			       config->pkinit_kdc_cert_pool,
281ae771770SStanislav Sedov 			       config->pkinit_kdc_revoke);
282ae771770SStanislav Sedov 
283ae771770SStanislav Sedov     }
284ae771770SStanislav Sedov 
285ae771770SStanislav Sedov     return 0;
286ae771770SStanislav Sedov #endif /* PKINIT */
287ae771770SStanislav Sedov }
288