source/idea/idea-bootstrap/_templates/linux/connect_activedirectory.jinja2 (104 lines of code) (raw):
# Begin: Connect ActiveDirectory
RES_CLUSTER_HOME_DIR="{{ context.config.get_string('shared-storage.home.mount_dir', required=True) }}"
AD_DOMAIN_NAME="{{ context.config.get_string('directoryservice.name', required=True) | lower}}"
LDAP_CONNECTION_URI="{{ context.config.get_string('directoryservice.ldap_connection_uri', required=True) }}"
AD_SUDOERS_GROUP_NAME="{{ context.config.get_string('directoryservice.sudoers.group_name', required=True) }}"
AD_SUDOERS_GROUP_NAME_ESCAPED="{{ context.config.get_string('directoryservice.sudoers.group_name', required=True).replace(' ', '\ ') }}"
SSSD_LDAP_ID_MAPPING="{{ context.config.get_bool('directoryservice.sssd.ldap_id_mapping', default=True) | lower }}"
AD_TLS_CERTIFICATE_SECRET_ARN="{{context.config.get_string('directoryservice.tls_certificate_secret_arn', default='')}}"
AD_LDAP_BASE="{{context.config.get_string('directoryservice.ldap_base', required=True)}}"
ADDITIONAL_AD_CONFIGS="{{context.config.get_string('directoryservice.sssd.additional_sssd_configs', required=True).replace('"', '\\"')}}"
ROOT_USER_DN_SECRET_ARN="{{ context.config.get_string('directoryservice.root_user_dn_secret_arn', required=True) }}"
ROOT_USER_DN=$(get_secret "${ROOT_USER_DN_SECRET_ARN}")
set +x
SERVICE_ACCOUNT_CREDENTIALS_SECRET_ARN="{{ context.config.get_string('directoryservice.service_account_credentials_secret_arn', required=True) }}"
AD_USER_CREDENTIALS=$(get_secret "${SERVICE_ACCOUNT_CREDENTIALS_SECRET_ARN}")
AD_USER_USERNAME=$(echo $AD_USER_CREDENTIALS | jq -r 'keys[0]')
AD_USER_PASSWORD=$(echo $AD_USER_CREDENTIALS | jq -r '.[]')
set -x
if [[ ${IDEA_MODULE_NAME} == "cluster-manager" ]]; then
enumerate_value=True
else
enumerate_value=False
fi
sssd_config_file="/etc/sssd/sssd.conf"
if [[ -f $sssd_config_file ]]; then
cp $sssd_config_file $sssd_config_file.orig
fi
echo -e "[domain/${AD_DOMAIN_NAME}]
id_provider = ldap
auth_provider = ldap
sudo_provider = none
ldap_uri = ${LDAP_CONNECTION_URI}
ldap_search_base = ${AD_LDAP_BASE}
ldap_schema = ad
use_fully_qualified_names = false
case_sensitive = False
ldap_user_object_class = user
ldap_user_name = sAMAccountName
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
ldap_user_home_directory = unixHomeDirectory
ldap_user_shell = loginShell
ldap_user_uuid = objectGUID
ldap_group_object_class = group
ldap_group_name = sAMAccountName
ldap_group_gid_number = gidNumber
ldap_group_member = member
ldap_group_uuid = objectGUID
ldap_default_bind_dn = ${ROOT_USER_DN}
ldap_default_authtok_type = password
ldap_default_authtok = generated_password
enumerate = "${enumerate_value}"
ldap_id_mapping = ${SSSD_LDAP_ID_MAPPING}
cache_credentials = true
default_shell = /bin/bash
fallback_homedir = ${RES_CLUSTER_HOME_DIR}/%u" > $sssd_config_file
echo -e $ADDITIONAL_AD_CONFIGS | jq -r 'to_entries[][]' | while read -r key ; do
read -r value
if grep -q "^$key = " "$sssd_config_file"; then
# If the key exists, override the value
sed -i "s/^$key = .*/$key = $value/" "$sssd_config_file"
else
# If the key doesn't exist, append the new key-value pair
echo -e "$key = $value" >> $sssd_config_file
fi
done
echo -e "[sssd]
domains = ${AD_DOMAIN_NAME}
config_file_version = 2
services = nss, pam
[nss]
homedir_substring = /home/
[pam]
[autofs]
[ssh]
[secrets]
$(cat $sssd_config_file)" > $sssd_config_file
chmod 600 $sssd_config_file
# Place obfuscated password in the sssd.conf file.
# Executing the sss_obfuscate command removes the ldap_auth_disable_tls_never_use_in_production setting in sssd
# thus, sssd fails to communicate to AD
/usr/bin/expect <<EOD
set timeout -1
eval spawn sudo sss_obfuscate --domain ${AD_DOMAIN_NAME}
match_max 100
expect -exact "Enter password: "
send -- "${AD_USER_PASSWORD}\r"
expect -exact "\r
Re-enter password: "
send -- "${AD_USER_PASSWORD}\r"
expect eof
EOD
if [[ "${AD_TLS_CERTIFICATE_SECRET_ARN}" == '' ]]; then
# Adding the ldap_auth_disable_tls_never_use_in_production setting back into the file under sssd/domain section
echo -e "ldap_auth_disable_tls_never_use_in_production = true" >> $sssd_config_file
fi
if [[ $RES_BASE_OS =~ ^(amzn2|rhel8|rhel9)$ ]]; then
authconfig --enablemkhomedir --enablesssdauth --enablesssd --updateall
elif [[ $RES_BASE_OS == "ubuntu2204" ]]; then
pam-auth-update --enable sss
fi
systemctl enable sssd
systemctl restart sssd
# End: Connect ActiveDirectory