init.sh 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/bin/bash
  2. set -e
  3. appSetup () {
  4. # Set variables
  5. DOMAIN=${DOMAIN:-SAMDOM.LOCAL}
  6. DOMAINPASS=${DOMAINPASS:-youshouldsetapassword^123}
  7. JOIN=${JOIN:-false}
  8. JOINSITE=${JOINSITE:-NONE}
  9. MULTISITE=${MULTISITE:-false}
  10. NOCOMPLEXITY=${NOCOMPLEXITY:-false}
  11. INSECURELDAP=${INSECURELDAP:-false}
  12. DNSFORWARDER=${DNSFORWARDER:-NONE}
  13. HOSTIP=${HOSTIP:-NONE}
  14. RPCPORTS=${RPCPORTS:-"49152-49172"}
  15. DOMAIN_DC=${DOMAIN_DC:-${DOMAIN_DC}}
  16. LDOMAIN=${DOMAIN,,}
  17. UDOMAIN=${DOMAIN^^}
  18. URDOMAIN=${UDOMAIN%%.*}
  19. # If multi-site, we need to connect to the VPN before joining the domain
  20. if [[ ${MULTISITE,,} == "true" ]]; then
  21. /usr/sbin/openvpn --config /docker.ovpn &
  22. VPNPID=$!
  23. echo "Sleeping 30s to ensure VPN connects ($VPNPID)";
  24. sleep 30
  25. fi
  26. # Set host ip option
  27. if [[ "$HOSTIP" != "NONE" ]]; then
  28. HOSTIP_OPTION="--host-ip=$HOSTIP"
  29. else
  30. HOSTIP_OPTION=""
  31. fi
  32. # Set up samba
  33. mv /etc/krb5.conf /etc/krb5.conf.orig
  34. echo "[libdefaults]" > /etc/krb5.conf
  35. echo " dns_lookup_realm = false" >> /etc/krb5.conf
  36. echo " dns_lookup_kdc = true" >> /etc/krb5.conf
  37. echo " default_realm = ${UDOMAIN}" >> /etc/krb5.conf
  38. # If the finished file isn't there, this is brand new, we're not just moving to a new container
  39. FIRSTRUN=false
  40. if [[ ! -f /etc/samba/external/smb.conf ]]; then
  41. FIRSTRUN=true
  42. mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
  43. if [[ ${JOIN,,} == "true" ]]; then
  44. if [[ ${JOINSITE} == "NONE" ]]; then
  45. samba-tool domain join ${LDOMAIN} DC -U"${URDOMAIN}\administrator" --password="${DOMAINPASS}" --dns-backend=SAMBA_INTERNAL
  46. else
  47. samba-tool domain join ${LDOMAIN} DC -U"${URDOMAIN}\administrator" --password="${DOMAINPASS}" --dns-backend=SAMBA_INTERNAL --site=${JOINSITE}
  48. fi
  49. else
  50. samba-tool domain provision --use-rfc2307 --domain=${URDOMAIN} --realm=${UDOMAIN} --server-role=dc --dns-backend=SAMBA_INTERNAL --adminpass=${DOMAINPASS} ${HOSTIP_OPTION}
  51. if [[ ${NOCOMPLEXITY,,} == "true" ]]; then
  52. samba-tool domain passwordsettings set --complexity=off
  53. samba-tool domain passwordsettings set --history-length=0
  54. samba-tool domain passwordsettings set --min-pwd-age=0
  55. samba-tool domain passwordsettings set --max-pwd-age=0
  56. fi
  57. fi
  58. sed -i "/\[global\]/a \
  59. \\\tidmap_ldb:use rfc2307 = yes\\n\
  60. wins support = yes\\n\
  61. template shell = /bin/bash\\n\
  62. template homedir = /home/%U\\n\
  63. idmap config ${URDOMAIN} : schema_mode = rfc2307\\n\
  64. idmap config ${URDOMAIN} : unix_nss_info = yes\\n\
  65. idmap config ${URDOMAIN} : backend = ad\\n\
  66. rpc server dynamic port range = ${RPCPORTS}\
  67. " /etc/samba/smb.conf
  68. sed -i "s/LOCALDC/${URDOMAIN}DC/g" /etc/samba/smb.conf
  69. if [[ $DNSFORWARDER != "NONE" ]]; then
  70. sed -i "/dns forwarder/d" /etc/samba/smb.conf
  71. sed -i "/\[global\]/a \
  72. \\\tdns forwarder = ${DNSFORWARDER}\
  73. " /etc/samba/smb.conf
  74. fi
  75. if [[ ${INSECURELDAP,,} == "true" ]]; then
  76. sed -i "/\[global\]/a \
  77. \\\tldap server require strong auth = no\
  78. " /etc/samba/smb.conf
  79. fi
  80. # Once we are set up, we'll make a file so that we know to use it if we ever spin this up again
  81. cp -f /etc/samba/smb.conf /etc/samba/external/smb.conf
  82. else
  83. cp -f /etc/samba/external/smb.conf /etc/samba/smb.conf
  84. fi
  85. # Set up supervisor
  86. echo "[supervisord]" > /etc/supervisor/conf.d/supervisord.conf
  87. echo "nodaemon=true" >> /etc/supervisor/conf.d/supervisord.conf
  88. echo "" >> /etc/supervisor/conf.d/supervisord.conf
  89. echo "[program:ntpd]" >> /etc/supervisor/conf.d/supervisord.conf
  90. echo "command=/usr/sbin/ntpd -c /etc/ntpd.conf -n" >> /etc/supervisor/conf.d/supervisord.conf
  91. echo "[program:samba]" >> /etc/supervisor/conf.d/supervisord.conf
  92. echo "command=/usr/sbin/samba -i" >> /etc/supervisor/conf.d/supervisord.conf
  93. if [[ ${MULTISITE,,} == "true" ]]; then
  94. if [[ -n $VPNPID ]]; then
  95. kill $VPNPID
  96. fi
  97. echo "" >> /etc/supervisor/conf.d/supervisord.conf
  98. echo "[program:openvpn]" >> /etc/supervisor/conf.d/supervisord.conf
  99. echo "command=/usr/sbin/openvpn --config /docker.ovpn" >> /etc/supervisor/conf.d/supervisord.conf
  100. fi
  101. echo "server 127.127.1.0" > /etc/ntpd.conf
  102. echo "fudge 127.127.1.0 stratum 10" >> /etc/ntpd.conf
  103. echo "server 0.pool.ntp.org iburst prefer" >> /etc/ntpd.conf
  104. echo "server 1.pool.ntp.org iburst prefer" >> /etc/ntpd.conf
  105. echo "server 2.pool.ntp.org iburst prefer" >> /etc/ntpd.conf
  106. echo "driftfile /var/lib/ntp/ntp.drift" >> /etc/ntpd.conf
  107. echo "logfile /var/log/ntp" >> /etc/ntpd.conf
  108. echo "ntpsigndsocket /usr/local/samba/var/lib/ntp_signd/" >> /etc/ntpd.conf
  109. echo "restrict default kod nomodify notrap nopeer mssntp" >> /etc/ntpd.conf
  110. echo "restrict 127.0.0.1" >> /etc/ntpd.conf
  111. echo "restrict 0.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery" >> /etc/ntpd.conf
  112. echo "restrict 1.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery" >> /etc/ntpd.conf
  113. echo "restrict 2.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery" >> /etc/ntpd.conf
  114. echo "tinker panic 0" >> /etc/ntpd.conf
  115. appStart ${FIRSTRUN}
  116. }
  117. fixDomainUsersGroup () {
  118. GIDNUMBER=$(ldbedit -H /var/lib/samba/private/sam.ldb -e cat "samaccountname=domain users" | { grep ^gidNumber: || true; })
  119. if [ -z "${GIDNUMBER}" ]; then
  120. echo "dn: CN=Domain Users,CN=Users,${DOMAIN_DC}
  121. changetype: modify
  122. add: gidNumber
  123. gidNumber: 3000000" | ldbmodify -H /var/lib/samba/private/sam.ldb
  124. net cache flush
  125. fi
  126. }
  127. setupSSH () {
  128. echo "dn: CN=sshPublicKey,CN=Schema,CN=Configuration,${DOMAIN_DC}
  129. changetype: add
  130. objectClass: top
  131. objectClass: attributeSchema
  132. attributeID: 1.3.6.1.4.1.24552.500.1.1.1.13
  133. cn: sshPublicKey
  134. name: sshPublicKey
  135. lDAPDisplayName: sshPublicKey
  136. description: MANDATORY: OpenSSH Public key
  137. attributeSyntax: 2.5.5.10
  138. oMSyntax: 4
  139. isSingleValued: FALSE
  140. objectCategory: CN=Attribute-Schema,CN=Schema,CN=Configuration,${DOMAIN_DC}
  141. searchFlags: 8
  142. schemaIDGUID:: cjDAZyEXzU+/akI0EGDW+g==" > /tmp/Sshpubkey.attr.ldif
  143. echo "dn: CN=ldapPublicKey,CN=Schema,CN=Configuration,${DOMAIN_DC}
  144. changetype: add
  145. objectClass: top
  146. objectClass: classSchema
  147. governsID: 1.3.6.1.4.1.24552.500.1.1.2.0
  148. cn: ldapPublicKey
  149. name: ldapPublicKey
  150. description: MANDATORY: OpenSSH LPK objectclass
  151. lDAPDisplayName: ldapPublicKey
  152. subClassOf: top
  153. objectClassCategory: 3
  154. objectCategory: CN=Class-Schema,CN=Schema,CN=Configuration,${DOMAIN_DC}
  155. defaultObjectCategory: CN=ldapPublicKey,CN=Schema,CN=Configuration,${DOMAIN_DC}
  156. mayContain: sshPublicKey
  157. schemaIDGUID:: +8nFQ43rpkWTOgbCCcSkqA==" > /tmp/Sshpubkey.class.ldif
  158. ldbadd -H /var/lib/samba/private/sam.ldb /var/lib/samba/private/sam.ldb /tmp/Sshpubkey.attr.ldif --option="dsdb:schema update allowed"=true
  159. ldbadd -H /var/lib/samba/private/sam.ldb /var/lib/samba/private/sam.ldb /tmp/Sshpubkey.class.ldif --option="dsdb:schema update allowed"=true
  160. }
  161. appStart () {
  162. /usr/bin/supervisord > /var/log/supervisor/supervisor.log 2>&1 &
  163. if [ "${1}" = "true" ]; then
  164. echo "Sleeping 10 before checking on Domain Users of gid 3000000 and setting up sshPublicKey"
  165. sleep 10
  166. fixDomainUsersGroup
  167. setupSSH
  168. fi
  169. while [ ! -f /var/log/supervisor/supervisor.log ]; do
  170. echo "Waiting for log files..."
  171. sleep 1
  172. done
  173. sleep 3
  174. tail -F /var/log/supervisor/*.log
  175. }
  176. appSetup
  177. exit 0