Newer
Older
ldap / src / ldap-init.sh
#!/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