mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
ipa-sam: report supported enctypes based on Kerberos realm configuration
We store Kerberos realm configuration in cn=REALM,cn=kerberos,$SUFFIX.
Along other configuration options, this container has list of default
supported encryption types, in krbDefaultEncSaltTypes.
Fetch krbDefaultEncSaltTypes value on ipa-sam initialization and convert
discovered list to the mask of supported encryption types according to
security.idl from Samba:
typedef [public,bitmap32bit] bitmap {
KERB_ENCTYPE_DES_CBC_CRC = 0x00000001,
KERB_ENCTYPE_DES_CBC_MD5 = 0x00000002,
KERB_ENCTYPE_RC4_HMAC_MD5 = 0x00000004,
KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96 = 0x00000008,
KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96 = 0x00000010
} kerb_EncTypes;
Part of https://fedorahosted.org/freeipa/ticket/3898
This commit is contained in:
committed by
Petr Viktorin
parent
860a3ff647
commit
a9843d6918
@@ -170,6 +170,7 @@ struct ipasam_privates {
|
|||||||
char *server_princ;
|
char *server_princ;
|
||||||
char *client_princ;
|
char *client_princ;
|
||||||
struct sss_idmap_ctx *idmap_ctx;
|
struct sss_idmap_ctx *idmap_ctx;
|
||||||
|
uint32_t supported_enctypes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -2062,11 +2063,7 @@ static bool fill_pdb_trusted_domain(TALLOC_CTX *mem_ctx,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (*td->supported_enc_type == 0) {
|
if (*td->supported_enc_type == 0) {
|
||||||
*td->supported_enc_type = KERB_ENCTYPE_DES_CBC_CRC |
|
*td->supported_enc_type = ldap_state->ipasam_privates->supported_enctypes;
|
||||||
KERB_ENCTYPE_DES_CBC_MD5 |
|
|
||||||
KERB_ENCTYPE_RC4_HMAC_MD5 |
|
|
||||||
KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96 |
|
|
||||||
KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!smbldap_talloc_single_blob(td, priv2ld(ldap_state), entry,
|
if (!smbldap_talloc_single_blob(td, priv2ld(ldap_state), entry,
|
||||||
@@ -2333,12 +2330,7 @@ static NTSTATUS ipasam_set_trusted_domain(struct pdb_methods *methods,
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
enctypes = KERB_ENCTYPE_DES_CBC_CRC |
|
enctypes = ldap_state->ipasam_privates->supported_enctypes;
|
||||||
KERB_ENCTYPE_DES_CBC_MD5 |
|
|
||||||
KERB_ENCTYPE_RC4_HMAC_MD5 |
|
|
||||||
KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96 |
|
|
||||||
KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96;
|
|
||||||
|
|
||||||
if (td->supported_enc_type != NULL) {
|
if (td->supported_enc_type != NULL) {
|
||||||
enctypes = *td->supported_enc_type;
|
enctypes = *td->supported_enc_type;
|
||||||
}
|
}
|
||||||
@@ -3606,6 +3598,106 @@ static NTSTATUS ipasam_get_domain_name(struct ldapsam_privates *ldap_state,
|
|||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS ipasam_get_enctypes(struct ldapsam_privates *ldap_state,
|
||||||
|
TALLOC_CTX *mem_ctx,
|
||||||
|
uint32_t *enctypes)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
LDAPMessage *result;
|
||||||
|
LDAPMessage *entry = NULL;
|
||||||
|
int count, i;
|
||||||
|
char **enctype_list, *dn;
|
||||||
|
krb5_enctype enctype;
|
||||||
|
krb5_error_code err;
|
||||||
|
struct smbldap_state *smbldap_state = ldap_state->smbldap_state;
|
||||||
|
const char *attr_list[] = {
|
||||||
|
"krbDefaultEncSaltTypes",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
dn = talloc_asprintf(mem_ctx, "cn=%s,cn=kerberos,%s",
|
||||||
|
ldap_state->ipasam_privates->realm,
|
||||||
|
ldap_state->ipasam_privates->base_dn);
|
||||||
|
|
||||||
|
if (dn == NULL) {
|
||||||
|
DEBUG(1, ("Failed to construct DN to the realm's kerberos container\n"));
|
||||||
|
return NT_STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = smbldap_search(smbldap_state, dn, LDAP_SCOPE_BASE,
|
||||||
|
"objectclass=krbrealmcontainer", attr_list, 0,
|
||||||
|
&result);
|
||||||
|
if (ret != LDAP_SUCCESS) {
|
||||||
|
DEBUG(1, ("Failed to get kerberos realm encryption types: %s\n",
|
||||||
|
ldap_err2string (ret)));
|
||||||
|
talloc_free(dn);
|
||||||
|
return NT_STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = ldap_count_entries(smbldap_state->ldap_struct, result);
|
||||||
|
|
||||||
|
if (count != 1) {
|
||||||
|
DEBUG(1, ("Unexpected number of results [%d] for realm "
|
||||||
|
"search.\n", count));
|
||||||
|
ldap_msgfree(result);
|
||||||
|
talloc_free(dn);
|
||||||
|
return NT_STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = ldap_first_entry(smbldap_state->ldap_struct, result);
|
||||||
|
if (entry == NULL) {
|
||||||
|
DEBUG(0, ("Could not get krbrealmcontainer entry\n"));
|
||||||
|
ldap_msgfree(result);
|
||||||
|
talloc_free(dn);
|
||||||
|
return NT_STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
enctype_list = get_attribute_values(dn, smbldap_state->ldap_struct, entry,
|
||||||
|
"krbDefaultEncSaltTypes", &count);
|
||||||
|
ldap_msgfree(result);
|
||||||
|
if (enctype_list == NULL) {
|
||||||
|
talloc_free(dn);
|
||||||
|
return NT_STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*enctypes = 0;
|
||||||
|
for (i = 0; i < count ; i++) {
|
||||||
|
char *enc = strchr(enctype_list[i], ':');
|
||||||
|
if (enc != NULL) {
|
||||||
|
*enc = '\0';
|
||||||
|
}
|
||||||
|
err = krb5_string_to_enctype(enctype_list[i], &enctype);
|
||||||
|
if (enc != NULL) {
|
||||||
|
*enc = ':';
|
||||||
|
}
|
||||||
|
if (err) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (enctype) {
|
||||||
|
case ENCTYPE_DES_CBC_CRC:
|
||||||
|
*enctypes |= KERB_ENCTYPE_DES_CBC_CRC;
|
||||||
|
break;
|
||||||
|
case ENCTYPE_DES_CBC_MD5:
|
||||||
|
*enctypes |= KERB_ENCTYPE_DES_CBC_MD5;
|
||||||
|
break;
|
||||||
|
case ENCTYPE_ARCFOUR_HMAC:
|
||||||
|
*enctypes |= KERB_ENCTYPE_RC4_HMAC_MD5;
|
||||||
|
break;
|
||||||
|
case ENCTYPE_AES128_CTS_HMAC_SHA1_96:
|
||||||
|
*enctypes |= KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96;
|
||||||
|
break;
|
||||||
|
case ENCTYPE_AES256_CTS_HMAC_SHA1_96:
|
||||||
|
*enctypes |= KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
talloc_free(dn);
|
||||||
|
return NT_STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS ipasam_get_realm(struct ldapsam_privates *ldap_state,
|
static NTSTATUS ipasam_get_realm(struct ldapsam_privates *ldap_state,
|
||||||
TALLOC_CTX *mem_ctx,
|
TALLOC_CTX *mem_ctx,
|
||||||
char **realm)
|
char **realm)
|
||||||
@@ -4135,7 +4227,6 @@ done:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static NTSTATUS pdb_init_ipasam(struct pdb_methods **pdb_method,
|
static NTSTATUS pdb_init_ipasam(struct pdb_methods **pdb_method,
|
||||||
const char *location)
|
const char *location)
|
||||||
{
|
{
|
||||||
@@ -4151,6 +4242,7 @@ static NTSTATUS pdb_init_ipasam(struct pdb_methods **pdb_method,
|
|||||||
LDAPMessage *result = NULL;
|
LDAPMessage *result = NULL;
|
||||||
LDAPMessage *entry = NULL;
|
LDAPMessage *entry = NULL;
|
||||||
enum idmap_error_code err;
|
enum idmap_error_code err;
|
||||||
|
uint32_t enctypes = 0;
|
||||||
|
|
||||||
status = make_pdb_method(pdb_method);
|
status = make_pdb_method(pdb_method);
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
@@ -4328,6 +4420,19 @@ static NTSTATUS pdb_init_ipasam(struct pdb_methods **pdb_method,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ldap_msgfree(result);
|
ldap_msgfree(result);
|
||||||
|
|
||||||
|
status = ipasam_get_enctypes(ldap_state,
|
||||||
|
ldap_state->ipasam_privates,
|
||||||
|
&enctypes);
|
||||||
|
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
enctypes = KERB_ENCTYPE_RC4_HMAC_MD5 |
|
||||||
|
KERB_ENCTYPE_AES128_CTS_HMAC_SHA1_96 |
|
||||||
|
KERB_ENCTYPE_AES256_CTS_HMAC_SHA1_96;
|
||||||
|
}
|
||||||
|
|
||||||
|
ldap_state->ipasam_privates->supported_enctypes = enctypes;
|
||||||
|
|
||||||
(*pdb_method)->getsampwnam = ldapsam_getsampwnam;
|
(*pdb_method)->getsampwnam = ldapsam_getsampwnam;
|
||||||
(*pdb_method)->search_users = ldapsam_search_users;
|
(*pdb_method)->search_users = ldapsam_search_users;
|
||||||
(*pdb_method)->search_groups = ldapsam_search_groups;
|
(*pdb_method)->search_groups = ldapsam_search_groups;
|
||||||
|
|||||||
Reference in New Issue
Block a user