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