setup-slapd.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #!/bin/sh
  2. set -ex
  3. # Create TLS certificate
  4. sudo mkdir -p /etc/ldap/ssl
  5. alt_names() {
  6. (
  7. (
  8. (hostname && hostname -a && hostname -A && hostname -f) |
  9. xargs -n 1 |
  10. sort -u |
  11. sed -e 's/\(\S\+\)/DNS:\1/g'
  12. ) && (
  13. (hostname -i && hostname -I && echo "127.0.0.1 ::1") |
  14. xargs -n 1 |
  15. sort -u |
  16. sed -e 's/\(\S\+\)/IP:\1/g'
  17. )
  18. ) | paste -d, -s
  19. }
  20. sudo openssl req -newkey rsa:4096 -x509 -nodes -days 3650 \
  21. -out /etc/ldap/ssl/server.crt -keyout /etc/ldap/ssl/server.key \
  22. -subj "/C=US/ST=Arizona/L=Localhost/O=localhost/CN=localhost" \
  23. -addext "subjectAltName = `alt_names`"
  24. sudo chown -R openldap:openldap /etc/ldap/ssl
  25. # Display the TLS certificate (should be world readable)
  26. openssl x509 -noout -text -in /etc/ldap/ssl/server.crt
  27. # Point to the certificate generated
  28. if ! grep -q 'TLS_CACERT \/etc\/ldap\/ssl\/server.crt' /etc/ldap/ldap.conf; then
  29. sudo sed -e 's|^\s*TLS_CACERT|# TLS_CACERT|' -i /etc/ldap/ldap.conf
  30. echo 'TLS_CACERT /etc/ldap/ssl/server.crt' | sudo tee -a /etc/ldap/ldap.conf
  31. fi
  32. # Configure LDAP protocols to serve.
  33. sudo sed -e 's|^\s*SLAPD_SERVICES\s*=.*$|SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"|' -i /etc/default/slapd
  34. # Configure LDAP database.
  35. DBDN=`sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(&(olcRootDN=*)(olcSuffix=*))' dn | grep -i '^dn:' | sed -e 's/^dn:\s*//'`;
  36. sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ppolicy.ldif
  37. sudo service slapd restart
  38. sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// << EOF
  39. dn: $DBDN
  40. changetype: modify
  41. replace: olcSuffix
  42. olcSuffix: dc=my-domain,dc=com
  43. -
  44. replace: olcRootDN
  45. olcRootDN: cn=Manager,dc=my-domain,dc=com
  46. -
  47. replace: olcRootPW
  48. olcRootPW: secret
  49. dn: cn=config
  50. changetype: modify
  51. add: olcTLSCACertificateFile
  52. olcTLSCACertificateFile: /etc/ldap/ssl/server.crt
  53. -
  54. add: olcTLSCertificateFile
  55. olcTLSCertificateFile: /etc/ldap/ssl/server.crt
  56. -
  57. add: olcTLSCertificateKeyFile
  58. olcTLSCertificateKeyFile: /etc/ldap/ssl/server.key
  59. -
  60. add: olcTLSVerifyClient
  61. olcTLSVerifyClient: never
  62. -
  63. add: olcAuthzRegexp
  64. olcAuthzRegexp: uid=usera,cn=digest-md5,cn=auth cn=usera,dc=my-domain,dc=com
  65. -
  66. replace: olcLogLevel
  67. olcLogLevel: -1
  68. dn: cn=module{0},cn=config
  69. changetype: modify
  70. add: olcModuleLoad
  71. olcModuleLoad: sssvlv
  72. -
  73. add: olcModuleLoad
  74. olcModuleLoad: ppolicy
  75. -
  76. add: olcModuleLoad
  77. olcModuleLoad: dds
  78. EOF
  79. sudo service slapd restart
  80. sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// << EOF
  81. dn: olcOverlay=sssvlv,$DBDN
  82. objectClass: olcOverlayConfig
  83. objectClass: olcSssVlvConfig
  84. olcOverlay: sssvlv
  85. olcSssVlvMax: 10
  86. olcSssVlvMaxKeys: 5
  87. dn: olcOverlay=ppolicy,$DBDN
  88. objectClass: olcOverlayConfig
  89. objectClass: olcPPolicyConfig
  90. olcOverlay: ppolicy
  91. ### This would clutter our DIT and make tests to fail, while ppolicy does not
  92. ### seem to work as we expect (it does not seem to provide expected controls)
  93. ## olcPPolicyDefault: cn=default,ou=pwpolicies,dc=my-domain,dc=com
  94. ## olcPPolicyHashCleartext: FALSE
  95. ## olcPPolicyUseLockout: TRUE
  96. dn: olcOverlay=dds,$DBDN
  97. objectClass: olcOverlayConfig
  98. objectClass: olcDdsConfig
  99. olcOverlay: dds
  100. EOF
  101. sudo service slapd restart
  102. sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// << EOF
  103. dn: $DBDN
  104. changetype: modify
  105. add: olcDbIndex
  106. olcDbIndex: entryExpireTimestamp eq
  107. EOF
  108. sudo service slapd restart
  109. ldapadd -H ldapi:/// -D cn=Manager,dc=my-domain,dc=com -w secret <<EOF
  110. dn: dc=my-domain,dc=com
  111. objectClass: top
  112. objectClass: organization
  113. objectClass: dcObject
  114. dc: my-domain
  115. o: php ldap tests
  116. ### This would clutter our DIT and make tests to fail, while ppolicy does not
  117. ### seem to work as we expect (it does not seem to provide expected controls)
  118. ## dn: ou=pwpolicies,dc=my-domain,dc=com
  119. ## objectClass: top
  120. ## objectClass: organizationalUnit
  121. ## ou: pwpolicies
  122. ##
  123. ## dn: cn=default,ou=pwpolicies,dc=my-domain,dc=com
  124. ## objectClass: top
  125. ## objectClass: person
  126. ## objectClass: pwdPolicy
  127. ## cn: default
  128. ## sn: default
  129. ## pwdAttribute: userPassword
  130. ## pwdMaxAge: 2592000
  131. ## pwdExpireWarning: 3600
  132. ## #pwdInHistory: 0
  133. ## pwdCheckQuality: 0
  134. ## pwdMaxFailure: 5
  135. ## pwdLockout: TRUE
  136. ## #pwdLockoutDuration: 0
  137. ## #pwdGraceAuthNLimit: 0
  138. ## #pwdFailureCountInterval: 0
  139. ## pwdMustChange: FALSE
  140. ## pwdMinLength: 3
  141. ## pwdAllowUserChange: TRUE
  142. ## pwdSafeModify: FALSE
  143. EOF
  144. # Verify TLS connection
  145. tries=0
  146. while : ; do
  147. ldapsearch -d 255 -H ldaps://localhost -D cn=Manager,dc=my-domain,dc=com -w secret -s base -b dc=my-domain,dc=com 'objectclass=*'
  148. rt=$?
  149. if [ $rt -eq 0 ]; then
  150. echo "OK"
  151. exit 0
  152. else
  153. tries=$((tries+1))
  154. if [ $((tries)) -gt 3 ]; then
  155. echo "exit failure $rt"
  156. exit $rt
  157. else
  158. echo "trying again"
  159. sleep 3
  160. fi
  161. fi
  162. done