#!/bin/bash ######################################################################## ## Script : ldap-init.sh ## Name : LDAP を初期化します。 ## Version : 0.0.1 ## Copyright : 2019 Nomura Kei ## License : BSD-2-Clause ## Usage: ## |使用法) ldap-init.sh [オプション] ## | ## | LDAP を初期化します。 ## | 初期化の際、ユーザー管理のための次のエントリを追加します。 ## | -Group (dn: ou=Group,<domain>) ## | -User (dn: ou=User,<domain>) ## | ## |[オプション] ## | --id arg 管理者用のIDを設定します。(デフォルト:root)) ## | --password arg 管理者用のパスワードを設定します。 ## | -h,--help 使用法を表示します。 ## | -v,--version バージョンを表示します。 ## | ## ######################################################################## SCRIPT_FILE=${0} SCRIPT_DIR=`dirname ${SCRIPT_FILE}` LIB_DIR=${SCRIPT_DIR}/../lib ######################################################################## ## ## ライブラリのロード ## [ -f "${LIB_DIR}/functions.sh" ] && . ${LIB_DIR}/bash-utils.sh [ -f "${SCRIPT_DIR}/ldap-util.sh" ] && . ${SCRIPT_DIR}/ldap-util.sh ######################################################################## ## ## デフォルト値 ## DOMAIN_DN=`getDomainDN` ROOT_ID=root ROOT_PW= ROOT_CPW= TMP_LDIF= ######################################################################## ## ## 関数群 ## # ====================================================================== # LDAP の設定を変更する ldif 形式のデータを標準出力します。 # # @param $1 ドメイン(DN形式) # @param $2 ルートID # @param $3 ルート暗号化済パスワード # ====================================================================== mkldif_for_change_config() { DOMAIN_DN=$1 ROOT_ID=$2 ROOT_CPW=$3 cat << EOF dn: olcDatabase={0}config,cn=config changeType: modify replace: olcRootDN olcRootDN: cn=${ROOT_ID},${DOMAIN_DN} dn: olcDatabase={1}mdb,cn=config changeType: modify replace: olcRootDN olcRootDN: cn=${ROOT_ID},${DOMAIN_DN} dn: olcDatabase={1}mdb,cn=config changeType: modify replace: olcSuffix olcSuffix: ${DOMAIN_DN} dn: olcDatabase={1}mdb,cn=config changeType: modify replace: olcRootPW olcRootPW: ${ROOT_CPW} EOF } # ====================================================================== # LDAP のルートDNを設定する ldif 形式のデータを標準出力します。 # # @param $1 ドメイン(DN形式) # @param $2 ルートID # @param $3 ルート暗号化済パスワード # ====================================================================== mkldif_for_add_rootdn() { DOMAIN_DN=$1 ROOT_ID=$2 ROOT_CPW=$3 cat << EOF dn: cn=${ROOT_ID},${DOMAIN_DN} objectClass: organizationalRole objectClass: simpleSecurityObject cn: ${ROOT_ID} description: LDAP Administrator userPassword: ${ROOT_CPW} dn: ou=Group,${DOMAIN_DN} objectClass: organizationalUnit ou: Group dn: ou=User,${DOMAIN_DN} objectClass: organizationalUnit ou: User EOF } # ====================================================================== # アクセス制御の設定を設定ファイルに反映します。 # # @param $1 ドメイン(DN形式) # @param $2 ルートID # @param $3 ルート暗号化済パスワード # ====================================================================== update_ldapconf() { DOMAIN_DN=$1 ROOT_ID=$2 ROOT_CPW=$3 LDAP_CONF=/etc/ldap/ldap.conf CONFIG_HEADER="#@ >>> ----- ACL Auto Settings -----" CONFIG_FOOTER="#@ <<< ----- ACL Auto Settings -----" cp -f "${LDAP_CONF}" "${LDAP_CONF}.old" sed -e "/${CONFIG_HEADER}/,/${CONFIG_FOOTER}/d" ${LDAP_CONF}.old > ${LDAP_CONF} cat << EOF >> ${LDAP_CONF} ${CONFIG_HEADER} access to * by self write by dn="cn=${ROOT_ID},${DOMAIN_DN}" access to attr=userPassword by self write by dn="cn=${ROOT_ID},${ROMAIN_DN}" by anonymous auth by * none ${CONFIG_FOOTER} EOF } ######################################################################## ## ## メイン処理 ## for OPT in "$@"; do case "${OPT}" in '-h'|'--help') usage; exit 1 ;; '-v'|'--version') version; exit 1 ;; '--id') ROOT_ID="$2"; shift 2 ;; '--password') ROOT_PW="$2"; shift 2 ;; -*) usage exit 1 ;; *) if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then usage exit 1 fi ;; esac done # ---------------------------------------------------------------------- # 引数整理 # ---------------------------------------------------------------------- [ "${ROOT_ID}" = "" ] && read -p "Root ID > " ROOT_ID if [ "${ROOT_PW}" = "" ]; then confirm_password "Root Password > " "Re-type Password > " if [ $? -ne 0 ]; then echo "password verification error" exit 1 fi ROOT_PW=${CONFIRM_PASSWORD} fi [ "${DOMAIN}" != "" ] && DOMAIN_DN=`domainToDN ${DOMAIN}` ROOT_CPW=`slappasswd -h '{CRYPT}' -c '$6$}' -s ${ROOT_PW}` ROOT_DN_ORIG=`getRootDN` # ---------------------------------------------------------------------- # 一時ファイルの生成 # ---------------------------------------------------------------------- TMP_LDIF=$(mktemp /tmp/ldap-init.XXXXXXXXXXXX.ldif) trap 'rm -f /tmp/ldap-init.*.ldif; exit 1' 1 2 3 15 # ---------------------------------------------------------------------- # LDAP の設定を変更する。 # ---------------------------------------------------------------------- echo "### --- Update LDAP Config ---" mkldif_for_change_config ${DOMAIN_DN} ${ROOT_ID} ${ROOT_CPW} > ${TMP_LDIF} ldapmodify -Y EXTERNAL -H ldapi:/// -f ${TMP_LDIF} debug_pause # ---------------------------------------------------------------------- # 古い情報を削除する # ---------------------------------------------------------------------- echo "### --- Delete Old LDAP Informations ---" echo "ou=Group,${DOMAIN_DN}" | ldapdelete -D cn=${ROOT_ID},${DOMAIN_DN} -w ${ROOT_PW} echo "ou=User,${DOMAIN_DN}" | ldapdelete -D cn=${ROOT_ID},${DOMAIN_DN} -w ${ROOT_PW} echo "${ROOT_DN_ORIG}" | ldapdelete -D cn=${ROOT_ID},${DOMAIN_DN} -w ${ROOT_PW} debug_pause # ---------------------------------------------------------------------- # ルートDNを設定する。 # ---------------------------------------------------------------------- echo "### --- Add LDAP Informations (Group, User) ---" mkldif_for_add_rootdn ${DOMAIN_DN} ${ROOT_ID} ${ROOT_CPW} > ${TMP_LDIF} ldapmodify -D cn=${ROOT_ID},${DOMAIN_DN} -f ${TMP_LDIF} -a -w ${ROOT_PW} debug_pause # ---------------------------------------------------------------------- # 設定ファイルを更新する。 # ---------------------------------------------------------------------- echo "### --- Update /etc/ldap/ldap.conf" update_ldapconf ${DOMAIN_DN} ${ROOT_ID} ${ROOT_CPW} service slapd restart debug_pause ldapsearch -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={0}config,cn=config' oldRootDN ldapsearch -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={1}mdb,cn=config' olcRootDN ldapsearch -Y EXTERNAL -H ldapi:/// -b "${DOMAIN_DN}" rm -f /tmp/ldap-*.*.ldif