%PDF- %PDF-
| Direktori : /usr/share/sssd/ |
| Current File : //usr/share/sssd/generate-config |
#!/bin/sh
# Generate sssd.conf setup dynamically based on autodetectet LDAP
# and Kerberos server.
set -e
# See if we can find an LDAP server. Prefer ldap.domain, but also
# accept SRV records if no ldap.domain server is found.
lookup_ldap_uri() {
domain="$1"
if ping -c2 ldap.$domain > /dev/null 2>&1; then
echo ldap://ldap.$domain
else
host=$(host -N 2 -t SRV _ldap._tcp.$domain | grep -v NXDOMAIN | awk '{print $NF}' | head -1)
if [ "$host" ] ; then
echo ldap://$host | sed 's/\.$//'
fi
fi
}
lookup_ldap_base() {
ldapuri="$1"
defaultcontext="$(ldapsearch -LLL -H "$ldapuri" -x -b '' -s base defaultNamingContext 2>/dev/null | awk '/^defaultNamingContext: / { print $2}')"
if [ -z "$defaultcontext" ] ; then
# If there are several contexts, pick the first one with
# posixAccount or posixGroup objects in it.
for context in $(ldapsearch -LLL -H "$ldapuri" -x -b '' \
-s base namingContexts 2>/dev/null | \
awk '/^namingContexts: / { print $2}') ; do
if ldapsearch -LLL -H $ldapuri -x -b "$context" -s sub -z 1 \
'(|(objectClass=posixAccount)(objectclass=posixGroup))' 2>&1 | \
egrep -q '^dn:|^Administrative limit exceeded' ; then
echo $context
return
fi
done
fi
echo $defaultcontext
}
lookup_kerberos_server() {
domain="$1"
if ping -c2 kerberos.$domain > /dev/null 2>&1; then
echo kerberos.$domain
else
host=$(host -t SRV _kerberos._tcp.$domain | grep -v NXDOMAIN | awk '{print $NF}'|head -1)
if [ "$host" ] ; then
echo $host | sed 's/\.$//'
fi
fi
}
lookup_kerberos_realm() {
domain="$1"
realm=$(host -t txt _kerberos.$domain | grep -v NXDOMAIN | awk '{print $NF}'|head -1|tr -d '"')
if [ -z "$realm" ] ; then
realm=$(echo $domain | tr a-z A-Z)
fi
echo $realm
}
generate_config() {
if [ "$1" ] ; then
domain=$1
else
domain="$(hostname -d)"
fi
kerberosrealm=$(lookup_kerberos_realm $domain)
ldapuri=$(lookup_ldap_uri "$domain")
if [ -z "$ldapuri" ]; then
# autodetection failed
return
fi
ldapbase="$(lookup_ldap_base "$ldapuri")"
if [ -z "$ldapbase" ]; then
# autodetection failed
return
fi
kerberosserver=$(lookup_kerberos_server "$domain")
cat <<EOF
# SSSD configuration generated using $0
[sssd]
config_file_version = 2
reconnection_retries = 3
sbus_timeout = 30
services = nss, pam
domains = $domain
[nss]
filter_groups = root
filter_users = root
reconnection_retries = 3
[pam]
reconnection_retries = 3
EOF
if [ "$kerberosserver" ] ; then
auth="krb5"
chpass="krb5"
else
auth="ldap"
chpass="ldap";
fi
cat <<EOF
[domain/$domain]
; Using enumerate = true leads to high load and slow response
enumerate = false
cache_credentials = true
id_provider = ldap
auth_provider = $auth
chpass_provider = $chpass
ldap_uri = $ldapuri
ldap_search_base = $ldapbase
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/ssl/certs/ca-certificates.crt
EOF
if [ "$kerberosserver" ] ; then
cat <<EOF
krb5_server = $kerberosserver
krb5_realm = $kerberosrealm
krb5_auth_timeout = 15
EOF
fi
}
generate_config "$@"