start.sh 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. #!/bin/sh -e
  2. function error() {
  3. echo "ERROR: $*" 1>&2
  4. exit
  5. }
  6. # variables
  7. DATE=$(date '+%Y%m%d%H%m')
  8. if test -z "${DOMAIN}"; then
  9. error "Specifying a domain is mandatory, use -e DOMAIN=example.org"
  10. fi
  11. if test -z "${ORGANIZATION}"; then
  12. error "Specifying an organization is mandatory, use -e ORGANIZATION=\"Example Organization\""
  13. fi
  14. if test -z "${PASSWORD}"; then
  15. if test -e /etc/ldap/password; then
  16. export PASSWORD="$(cat /etc/ldap/password)"
  17. else
  18. export PASSWORD=$(pwgen 20 1)
  19. echo "password: $PASSWORD"
  20. echo "$PASSWORD" > /etc/ldap/password
  21. chmod go= /etc/ldap/password
  22. fi
  23. fi
  24. export BASEDN="dc=${DOMAIN//./,dc=}"
  25. export PASSWD="$(slappasswd -h {SSHA} -s ${PASSWORD})"
  26. # configure
  27. cat > /tmp/update-config.sed <<EOF
  28. /^\s*suffix\b/csuffix\t\t"${BASEDN}"
  29. /^\s*rootdn\b/crootdn\t\t"cn=admin,${BASEDN}"
  30. /^\s*rootpw\b/crootpw\t\t${PASSWD}
  31. /^\s*directory\b/cdirectory /var/lib/ldap
  32. s/^\s*access/# &/
  33. s/# \?\(\s*\(access to \*\|by self write\|by users read\|by anonymous auth\)\)/\1/
  34. EOF
  35. sed -f /tmp/update-config.sed /etc/openldap/slapd.conf > /etc/ldap/slapd.conf
  36. if test "$MEMBEROF" -eq 1; then
  37. cat >> /etc/ldap/slapd.conf <<EOF
  38. moduleload refint
  39. overlay refint
  40. refint_attributes member
  41. refint_nothing "cn=admin,${BASEDN}"
  42. moduleload memberof
  43. overlay memberof
  44. memberof-group-oc groupOfNames
  45. memberof-member-ad member
  46. memberof-memberof-ad memberOf
  47. memberof-refint true
  48. EOF
  49. fi
  50. rm /tmp/update-config.sed
  51. for schema in $SCHEMAS; do
  52. echo "include /etc/openldap/schema/${schema}.schema" >> /etc/ldap/slapd.conf
  53. done
  54. if test -e /ssl/live/${DOMAIN}/chain.pem \
  55. -a -e /ssl/live/${DOMAIN}/privkey.pem \
  56. -a -e /ssl/live/${DOMAIN}/cert.pem; then
  57. cat >> /etc/ldap/slapd.conf <<EOF
  58. TLSCipherSuite HIGH:MEDIUM:-SSLv2:-SSLv3
  59. TLSCertificateFile /ssl/live/${DOMAIN}/cert.pem
  60. TLSCertificateKeyFile /ssl/live/${DOMAIN}/privkey.pem
  61. TLSCACertificateFile /ssl/live/${DOMAIN}/chain.pem
  62. # apk add ca-certificates +:
  63. #TLSCACertificatePath /usr/share/ca-certificates/mozilla
  64. EOF
  65. SSL_HOSTS=" ldaps:/// ldapi:///"
  66. else
  67. SSL_HOSTS=""
  68. fi
  69. # backup status quo
  70. if test -n "$(ls -A /var/lib/ldap)"; then
  71. slapcat -f /etc/ldap/slapd.conf > /var/backups/${DATE}-startup-data.ldif
  72. fi
  73. # restore if required
  74. if test -e /var/restore/*data.ldif; then
  75. rm -r /var/lib/ldap/* || true
  76. slapadd -f /etc/ldap/slapd.conf -l /var/restore/*data.ldif 2> /dev/null
  77. mv /var/restore/*data.ldif /var/backups/${DATE}-restored-data.ldif
  78. fi
  79. # run
  80. chown -R ${USER}.${GROUP} /var/lib/ldap /etc/ldap
  81. chmod 700 /var/lib/ldap
  82. /usr/sbin/slapd -u $USER -g $GROUP -d ${DEBUG} -h "ldap:///${SSL_HOSTS}" -f /etc/ldap/slapd.conf
  83. function multimaster() {
  84. if test -z "$MULTI_MASTER_REPLICATION"; then
  85. return
  86. fi
  87. if test -z "$SERVER_NAME" || ! [[ " ${MULTI_MASTER_REPLICATION} " =~ " ${SERVER_NAME} " ]]; then
  88. error "SERVER_NAME must be one of ${MULTI_MASTER_REPLICATION} in MULTI_MASTER_REPLICATION"
  89. fi
  90. log " --> multimaster ... "
  91. # load module
  92. log "module "
  93. ldapadd -c -Y external -H ldapi:/// > /dev/null 2> /dev/null <<EOF
  94. dn: cn=module,cn=config
  95. objectClass: olcModuleList
  96. cn: module
  97. olcModulePath: /usr/lib/ldap
  98. olcModuleLoad: syncprov.la
  99. EOF
  100. # config replication
  101. local masters=( ${MULTI_MASTER_REPLICATION} )
  102. local serverid=
  103. for ((i=0; i<${#masters[@]}; ++i)); do
  104. if test "${masters[$i]}" == "${SERVER_NAME}"; then
  105. serverid=$((i+1))
  106. break;
  107. fi
  108. done
  109. test -n "$serverid"
  110. log "config for ${SERVER_NAME} as $serverid "
  111. log "first "
  112. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  113. dn: cn=config
  114. changetype: modify
  115. add: olcServerID
  116. olcServerID: ${serverid}
  117. EOF
  118. log "second "
  119. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  120. dn: cn=config
  121. changetype: modify
  122. replace: olcServerID
  123. $(
  124. for ((i=0; i<${#masters[@]}; ++i)); do
  125. echo "olcServerID: $((i+1)) ldap://${masters[$i]}"
  126. done
  127. )
  128. dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
  129. changetype: add
  130. objectClass: olcOverlayConfig
  131. objectClass: olcSyncProvConfig
  132. dn: olcDatabase={0}config,cn=config
  133. changetype: modify
  134. add: olcSyncRepl
  135. $(
  136. for ((i=0; i<${#masters[@]}; ++i)); do
  137. printf 'olcSyncRepl: rid=%03d provider=ldap://%s binddn="cn=config"\n' $((i+1)) ${masters[$i]};
  138. echo ' bindmethod=simple credentials=x searchbase="cn=config"'
  139. echo ' type=refreshAndPersist retry="5 5 300 5" timeout=1'
  140. done
  141. )
  142. -
  143. add: olcMirrorMode
  144. olcMirrorMode: TRUE
  145. EOF
  146. # database replication
  147. log "data "
  148. log "first "
  149. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  150. dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
  151. changetype: add
  152. objectClass: olcOverlayConfig
  153. objectClass: olcSyncProvConfig
  154. olcOverlay: syncprov
  155. EOF
  156. log "second "
  157. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  158. dn: olcDatabase={1}hdb,cn=config
  159. changetype: modify
  160. replace: olcSuffix
  161. olcSuffix: dc=itzgeek,dc=local
  162. -
  163. replace: olcRootDN
  164. olcRootDN: cn=ldapadm,dc=itzgeek,dc=local
  165. -
  166. replace: olcRootPW
  167. olcRootPW: {SSHA}xtbbtC/1pJclCPzo1n3Szac9jqavSphk
  168. -
  169. add: olcSyncRepl
  170. $(
  171. for ((i=0; i<${#masters[@]}; ++i)); do
  172. printf 'olcSyncRepl: rid=%03d provider=ldap://%s binddn="cn=admin,${BASEDN}"\n' $((i+1)) ${masters[$i]};
  173. echo ' credentials=x searchbase="${BASEDN}" type=refreshOnly'
  174. echo ' interval=00:00:00:10 retry="5 5 300 5" timeout=1'
  175. done
  176. )
  177. -
  178. add: olcDbIndex
  179. olcDbIndex: entryUUID eq
  180. -
  181. add: olcDbIndex
  182. olcDbIndex: entryCSN eq
  183. -
  184. add: olcMirrorMode
  185. olcMirrorMode: TRUE
  186. EOF
  187. log "access "
  188. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  189. dn: olcDatabase={1}monitor,cn=config
  190. changetype: modify
  191. replace: olcAccess
  192. olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=admin,${BASEDN}" read by * none
  193. EOF
  194. logdone
  195. }
  196. function memberof() {
  197. log " --> memberof ... "
  198. if ! ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b olcOverlay={0}memberof,olcDatabase={1}hdb,cn=config 2> /dev/null > /dev/null; then
  199. log "module "
  200. ldapadd -c -Y external -H ldapi:/// > /dev/null 2> /dev/null <<EOF
  201. dn: cn=module,cn=config
  202. cn: module
  203. objectClass: olcModuleList
  204. olcModuleLoad: memberof
  205. olcModulePath: /usr/lib/ldap
  206. dn: olcOverlay={0}memberof,olcDatabase={1}hdb,cn=config
  207. objectClass: olcConfig
  208. objectClass: olcMemberOf
  209. objectClass: olcOverlayConfig
  210. objectClass: top
  211. olcOverlay: memberof
  212. olcMemberOfDangling: ignore
  213. olcMemberOfRefInt: TRUE
  214. olcMemberOfGroupOC: groupOfNames
  215. olcMemberOfMemberAD: member
  216. olcMemberOfMemberOfAD: memberOf
  217. EOF
  218. log "refint "
  219. ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
  220. dn: cn=module{1},cn=config
  221. add: olcmoduleload
  222. olcmoduleload: refint
  223. EOF
  224. ldapadd -c -Y external -H ldapi:/// > /dev/null 2> /dev/null <<EOF
  225. dn: olcOverlay={1}refint,olcDatabase={1}hdb,cn=config
  226. objectClass: olcConfig
  227. objectClass: olcOverlayConfig
  228. objectClass: olcRefintConfig
  229. objectClass: top
  230. olcOverlay: {1}refint
  231. olcRefintAttribute: memberof member manager owner
  232. EOF
  233. logdone
  234. else
  235. logdone "already configured"
  236. fi
  237. }