Hello,

Here is my new patch:

- add cyrus SASL mechanisms to the list.
- ANONYMOUS disable SASL
- LOGIN, PLAIN and *-MD5 require bindpw and sasl_authcid

Note that LOGIN and PLAIN are restricted by OpenLDAP to TLS connections,
so I didn't test them.

I didn't test OTP too.

Regards.
-- 
Daniel Dehennin
Récupérer ma clef GPG:
gpg --keyserver pgp.mit.edu --recv-keys 0x6A2540D1

=== modified file 'debian/nslcd.config'
--- debian/nslcd.config	2010-05-03 19:29:36 +0000
+++ debian/nslcd.config	2010-06-22 20:11:26 +0000
@@ -136,6 +136,38 @@
     reqcert=`echo "$reqcert" | tr 'A-Z' 'a-z' | sed 's/^no$/never/;s/^yes$/demand/'`
     [ -n "$reqcert" ] && db_set nslcd/ldap-reqcert "$reqcert"
   fi
+  # check SASL option
+  db_get nslcd/ldap-sasl
+  if [ -z "$RET" ]
+  then
+    if grep -qi '^SASL_MECH[[:space:]]*GSSAPI' "$cfgfile"
+    then
+      db_set nslcd/ldap-sasl "true"
+    else
+      db_set nslcd/ldap-sasl "false"
+    fi
+  fi
+  # check SASL mechanism
+  db_get nslcd/ldap-sasl-mech
+  if [ -z "$RET" ]
+  then
+    saslmech=`sed -n 's/^SASL_MECH[[:space:]]*\(GSSAPI\)[[:space:]]*$/\1/ip' "$cfgfile"`
+    [ -n "$saslmech" ] && db_set nslcd/ldap-sasl-mech "$saslmech"
+  fi
+  # check SASL realm
+  db_get nslcd/ldap-sasl-realm
+  if [ -z "$RET" ]
+  then
+    saslrealm=`sed -n 's/^SASL_REALM[[:space:]]*\([^[:space:]]*\)[[:space:]]*$/\1/ip' "$cfgfile"`
+    [ -n "$saslrealm" ] && db_set nslcd/ldap-sasl-realm "$saslrealm"
+  fi
+  # check SASL security properties
+  db_get nslcd/ldap-sasl-secprops
+  if [ -z "$RET" ]
+  then
+    saslsecprops=`sed -n 's/^SASL_SECPROPS[[:space:]]*\([^[:space:]]*\)[[:space:]]*$/\1/ip' "$cfgfile"`
+    [ -n "$saslsecprops" ] && db_set nslcd/ldap-sasl-secprops "$saslsecprops"
+  fi
   # we're done
   return 0
 }
@@ -150,6 +182,12 @@
   db_set nslcd/ldap-binddn ""
   db_set nslcd/ldap-bindpw ""
   db_set nslcd/ldap-starttls ""
+  db_set nslcd/ldap-sasl ""
+  db_set nslcd/ldap-sasl-mech ""
+  db_set nslcd/ldap-sasl-realm ""
+  db_set nslcd/ldap-sasl-authcid ""
+  db_set nslcd/ldap-sasl-authzid ""
+  db_set nslcd/ldap-sasl-secprops ""
   # parse current configuration
   parsecfg "$CONFFILE"
 else
@@ -170,6 +208,10 @@
 db_get nslcd/ldap-starttls
 [ -z "$RET" ] && db_set nslcd/ldap-starttls "false"
 
+# fallback for krb5_ccname
+db_get nslcd/ldap-sasl-krb5-ccname
+[ -z "$RET" ] && db_set nslcd/ldap-sasl-krb5-ccname "/var/run/nslcd/nslcd.tkt"
+
 #
 # This is the second part of the script. In this part the configurable
 # settings will be presented to the user for approval. The postinst
@@ -197,16 +239,8 @@
     db_go || state="server"
     ;;
   bindpw)
-    # only ask question if we have a binddn
-    db_get nslcd/ldap-binddn
-    if [ -n "$RET" ]
-    then
-      # ask for login information
-      db_input medium nslcd/ldap-bindpw || true
-    else
-      # clear password
-      db_set nslcd/ldap-bindpw ""
-    fi
+    # ask for login information
+    db_input medium nslcd/ldap-bindpw || true
     # ask the question, go to the next question or back
     state="starttls"
     db_go || state="binddn"
@@ -240,8 +274,112 @@
       db_input high nslcd/ldap-reqcert || true
     fi
     # ask the question, go to the next question or back
+    state="sasl"
+    db_go || state="bindpw"
+    ;;
+  sasl)
+    db_input medium nslcd/ldap-sasl || true
+    # ask the question, go to the next question or back
+    state="saslmech"
+    db_go || state="reqcert"
+    ;;
+  saslmech)
+    # check if SASL is enabled
+    db_get nslcd/ldap-sasl
+    if [ "$RET" = "true" ]
+    then
+      db_input medium nslcd/ldap-sasl-mech || true
+    else
+      db_set nslcd/ldap-sasl-mech ""
+    fi
+    # ask the question, go to the next question or back
+    state="saslrealm"
+    db_go || state="sasl"
+    ;;
+  saslrealm)
+    # check if SASL is enabled
+    db_get nslcd/ldap-sasl
+    sasl="$RET"
+    # check if SASL mechanism is not ANONYMOUS
+    db_get nslcd/ldap-sasl-mech
+    saslmech="$RET"
+    if [ "$sasl" = "true" ] && [ "$saslmech" != "ANONYMOUS" ]
+    then
+      db_input medium nslcd/ldap-sasl-realm || true
+    else
+      db_set nslcd/ldap-sasl-realm ""
+    fi
+    # ask the question, go to the next question or back
+    state="saslauthcid"
+    db_go || state="saslmech"
+    ;;
+  saslauthcid)
+    # check if SASL is enabled
+    db_get nslcd/ldap-sasl
+    sasl="$RET"
+    # check if SASL mechanism is not ANONYMOUS
+    db_get nslcd/ldap-sasl-mech
+    saslmech="$RET"
+    if [ "$sasl" = "true" ] && [ "$saslmech" != "ANONYMOUS" ]
+    then
+      db_input medium nslcd/ldap-sasl-authcid || true
+    else
+      db_set nslcd/ldap-sasl-authcid ""
+    fi
+    # ask the question, go to the next question or back
+    state="saslauthzid"
+    db_go || state="saslrealm"
+    ;;
+  saslauthzid)
+    # check if SASL is enabled
+    db_get nslcd/ldap-sasl
+    sasl="$RET"
+    # check if SASL mechanism is not ANONYMOUS
+    db_get nslcd/ldap-sasl-mech
+    saslmech="$RET"
+    if [ "$sasl" = "true" ] && [ "$saslmech" != "ANONYMOUS" ]
+    then
+      db_input medium nslcd/ldap-sasl-authzid || true
+    else
+      db_set nslcd/ldap-sasl-authzid ""
+    fi
+    # ask the question, go to the next question or back
+    state="saslsecprops"
+    db_go || state="saslauthcid"
+    ;;
+  saslsecprops)
+    # check if SASL is enabled
+    db_get nslcd/ldap-sasl
+    sasl="$RET"
+    # check if SASL mechanism is not ANONYMOUS
+    db_get nslcd/ldap-sasl-mech
+    saslmech="$RET"
+    if [ "$sasl" = "true" ] && [ "$saslmech" != "ANONYMOUS" ]
+    then
+      db_input medium nslcd/ldap-sasl-secprops || true
+    else
+      db_set nslcd/ldap-sasl-secprops ""
+    fi
+    # ask the question, go to the next question or back
+    state="krb5ccname"
+    db_go || state="saslauthzid"
+    ;;
+  krb5ccname)
+    # check if SASL mech is GSSAPI
+    db_get nslcd/ldap-sasl
+    sasl="$RET"
+    # check if SASL mechanism is GSSAPI
+    db_get nslcd/ldap-sasl-mech
+    saslmech="$RET"
+    if [ "$sasl" = "true" ] && [ "$saslmech" = "GSSAPI" ]
+    then
+      db_input low nslcd/ldap-sasl-krb5-ccname || true
+    else
+      db_set nslcd/ldap-sasl-krb5-ccname ""
+    fi
+    # ask the question, go to the next question or back
     state="done"
-    db_go || state="bindpw"
+    db_go || state="saslsecprops"
     ;;
   esac
 done

=== modified file 'debian/nslcd.postinst'
--- debian/nslcd.postinst	2010-05-09 09:39:45 +0000
+++ debian/nslcd.postinst	2010-06-22 20:25:13 +0000
@@ -199,8 +199,6 @@
       cfg_disable bindpw
     fi
   fi
-  # remove password from database
-  db_set nslcd/ldap-bindpw ""
   # set ssl option
   db_get nslcd/ldap-starttls
   if [ "$RET" = "true" ]
@@ -221,6 +219,96 @@
     # clear debconf value so that this option is only set if the question is asked
     db_set nslcd/ldap-reqcert ""
   fi
+  # set SASL options
+  db_get nslcd/ldap-sasl
+  if [ -n "$RET" ]
+  then
+    db_get nslcd/ldap-sasl-mech
+    if [ -n "$RET" ] && [ "$RET" != "ANONYMOUS" ]
+    then
+      saslmech="$RET"
+      cfg_set sasl_mech "$RET"
+      if [ "$saslmech" = "GSSAPI" ]
+      then
+        # Set kerberos credential cache name
+        db_get nslcd/ldap-sasl-krb5-ccname
+        if [ -n "$RET" ]
+        then
+          cfg_set krb5_ccname "$RET"
+        else
+          # default value
+          cfg_set krb5_ccname "/var/run/nslcd/nslcd.tkt"
+        fi
+      elif [ "$saslmech" = "LOGIN" ] || [ "$saslmech" = "PLAIN" ] || [ "$saslmech" = "CRAM-MD5" ] || [ "$saslmech" = "DIGEST-MD5" ]
+      then
+	# authcid must be set
+	db_get nslcd/ldap-sasl-authcid
+	saslauthcid="$RET"
+	if [ -n "$saslauthcid" ]
+	then
+	  # bindpw must be set
+	  db_get nslcd/ldap-bindpw
+	  bindpw="$RET"
+	  if [ -n "$bindpw" ]
+	  then
+	    cfg_set sasl_authcid "$saslauthcid"
+	    cfg_set bindpw "$bindpw"
+	  else
+	    cfg_disable sasl_authcid "$saslauthcid"
+	    cfg_disable bindpw "$bindpw"
+	  fi
+	fi
+      fi
+    else
+      if grep -qi '^sasl_mech' $CONFFILE
+      then
+        cfg_disable sasl_mech
+      fi
+      if grep -qi '^krb5_ccname' $CONFFILE
+      then
+        cfg_disable krb5_ccname
+      fi
+    fi
+    db_get nslcd/ldap-sasl-realm
+    if [ -n "$RET" ]
+    then
+      cfg_set sasl_realm "$RET"
+    else
+      cfg_disable sasl_realm
+    fi
+    db_get nslcd/ldap-sasl-authcid
+    if [ -n "$RET" ]
+    then
+      cfg_set sasl_authcid "$RET"
+    else
+      cfg_disable sasl_authcid
+    fi
+    db_get nslcd/ldap-sasl-authzid
+    if [ -n "$RET" ]
+    then
+      cfg_set sasl_authzid "$RET"
+    else
+      cfg_disable sasl_authzid
+    fi
+    db_get nslcd/ldap-sasl-secprops
+    if [ -n "$RET" ]
+    then
+      cfg_set sasl_secprops "$RET"
+    else
+      cfg_disable sasl_secprops
+    fi
+  else
+    # Disable all SASL options
+    for saslitem in sasl_mech sasl_realm sasl_authcid sasl_authzid sasl_secprops krb5_ccname
+    do
+      if grep -qi "^saslitem" $CONFFILE
+      then
+        cfg_disable $saslitem
+      fi
+    done
+  fi
+  # remove password from database
+  db_set nslcd/ldap-bindpw ""
   # we're done
   db_stop
   # rename reconnect_maxsleeptime to reconnect_retrytime

=== modified file 'debian/nslcd.templates'
--- debian/nslcd.templates	2009-08-31 20:46:01 +0000
+++ debian/nslcd.templates	2010-06-22 20:39:42 +0000
@@ -29,7 +29,8 @@
 Template: nslcd/ldap-bindpw
 Type: password
 _Description: LDAP user password:
- Enter the password that will be used to log in to the LDAP database.
+ Enter the password that will be used to log in to the LDAP database
+ or to use SASL authentication.
 
 Template: nslcd/ldap-starttls
 Type: boolean
@@ -52,3 +53,109 @@
   * demand: a certificate will be requested, required, and checked.
  If certificate checking is enabled, at least one of the tls_cacertdir or
  tls_cacertfile options must be put in /etc/nslcd.conf.
+
+Template: nslcd/ldap-sasl
+Type: boolean
+Default: false
+_Description: Configure LDAP SASL authentication?
+ LDAP binding can be performed with the Simple Authentication and
+ Security Layer.
+ .
+ For the moment, only GSSAPI/Kerberos authentication mechanism is
+ tested and configurable via debconf. It needs the suggested package
+ kstart to acquire and maintain the kerberos credential cache.
+ .
+ You can try other mechanisms by editing /etc/nslcd.conf configuration file
+ directly and report any successful configuration.
+
+Template: nslcd/ldap-sasl-mech
+Type: select
+__Choices: ANONYMOUS, LOGIN, PLAIN, NTLM, CRAM-MD5, DIGEST-MD5, GSSAPI, OTP
+Default: none
+_Description: SASL mechanism to configure:
+ Simple Authentication and Security Layer mechanism to use for LDAP
+ authentication.
+ .
+ You can choose in the following list:
+  * ANONYMOUS: for unauthenticated guest access (no SASL).
+  * LOGIN: a simple cleartext password mechanism.
+  * PLAIN: a simple cleartext password mechanism. PLAIN obsoleted the LOGIN mechanism.
+  * NTLM: an NT LAN Manager authentication mechanism.
+  * CRAM-MD5: a simple challenge-response scheme based on HMAC-MD5.
+  * DIGEST-MD5: HTTP Digest compatible challenge-response scheme based
+                upon MD5. DIGEST-MD5 offers a data security layer.
+  * GSSAPI: Generic Security Services Application Program Interface
+            (Kerberos, needs libsasl2-modules-gssapi-mit or
+	    libsasl2-modules-gssapi-heimdal)
+  * OTP: a One Time Password mechanism. OTP obsoleted the SKEY
+         mechanism (untested, needs libsasl2-modules-otp).
+ .
+ With OpenLDAP, weak mechanisms need TLS (LOGIN and PLAIN) or
+ sasl-secprops minssf=0 (CRAM-MD5).
+
+Template: nslcd/ldap-sasl-realm
+Type: string
+_Description: SASL realm:
+ Simple Authentication and Security Layer realm to use for LDAP
+ authentication.
+ .
+ If empty, the GSSAPI mechanism will use informations from the kerberos
+ credential cache.
+ .
+ The realm is appended to authentication and authorisation identities.
+
+Template: nslcd/ldap-sasl-authcid
+Type: string
+_Description: SASL authentication identity:
+ Simple Authentication and Security Layer identity.
+ .
+ This is the login used in LOGIN, PLAIN, CRAM-MD5 and DIGEST-MD5 mechanisms.
+
+Template: nslcd/ldap-sasl-authzid
+Type: string
+_Description: SASL proxy authorisation identity:
+ Simple Authentication and Security Layer proxy authorisation
+ identity.
+ .
+ This is the object in the name of witch the LDAP request are
+ done. They should have a DN syntax.
+
+Template: nslcd/ldap-sasl-secprops
+Type: string
+_Description: Cyrus SASL security properties:
+ The Cyrus Simple Authentication and Security Layer library provides
+ the following security properties:
+  * none: (without any other properties) causes the properties
+          defaults ("noanonymous,noplain") to be cleared.
+  * noplain: disables mechanisms susceptible to simple passive
+             attacks.
+  * noactive: disables mechanisms susceptible to active attacks.
+  * nodict: disables mechanisms susceptible to passive dictionary
+            attacks.
+  * noanonymous: disables mechanisms which support anonymous login.
+  * forwardsec: requires forward secrecy between sessions.
+  * passcred: requires mechanisms which pass client credentials (and
+              allows mechanisms which can pass credentials to do so).
+  * minssf=<factor>: specifies the minimum acceptable security strength
+                     factor as an integer approximating the effective
+                     key length used for encryption.  0 (zero) implies
+                     no protection, 1 implies integrity protection
+                     only, 56 allows DES or other weak ciphers, 112
+                     allows triple DES and other strong ciphers, 128
+                     allows RC4, Blowfish and other modern strong
+                     ciphers. The default is 0.
+  * maxssf=<factor>: specifies the maximum acceptable security
+                     strength factor as an integer (see minssf
+                     description). The default is INT_MAX.
+  * maxbufsize=<factor>: specifies the maximum security layer receive
+                         buffer size allowed. 0 disables security
+                         layers. The default is 65536.
+
+Template: nslcd/ldap-sasl-krb5-ccname
+Type: string
+Default: /var/run/nslcd/nslcd.tkt
+_Description: Kerberos credential cache file path:
+ The GSSAPI/Kerberos authentication mechanism needs a credential cache
+ file.
+ .
+ The cache file is initialised and maintained by k5start.

Attachment: pgpx8mWSXtfcl.pgp
Description: PGP signature

Reply via email to