Skip to content

Instantly share code, notes, and snippets.

@fumiyas
Created January 22, 2024 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fumiyas/c3252d33dbb3a52517b7b1edc2af1ba3 to your computer and use it in GitHub Desktop.
Save fumiyas/c3252d33dbb3a52517b7b1edc2af1ba3 to your computer and use it in GitHub Desktop.
OpenLDAP: 既存パスワードのバックアップと新パスワード割り当て / リストア
#!/bin/bash
##
## OpenLDAP: 既存パスワードのバックアップと新パスワード割り当て / リストア
## Copyright (c) 2024 SATOH Fumiyasu @ OSSTech Corp., Japan
##
## License: GNU General Public License version 3
##
##
## * OpenLDAP DIT の動作テスト時に利用することを想定したスクリプトです。
## * エントリのパスワードやアクセス権などをテストする際に
## 割り当て済みのパスワードが不明な場合に利用できます。
## * LDAP DIT 外の slapd.conf(5) の rootpw ディレクティブ、
## slapd-config(5) の olcRootPW 属性のパスワードには対応してません。
##
set -u
set -e
set -o pipefail || exit $?
umask 0077
export LANG=C
export PATH="/opt/osstech/bin:$PATH"
pdie() {
echo "$0: ERROR: $*" 1>&2
exit 1
}
## ======================================================================
ldap_opts=(
-H ldapi:///
-Y external
-Q
)
ldap_search() {
ldapsearch "${ldap_opts[@]}" \
-LLL \
-o ldif-wrap=no \
"$@" \
|ldifunbase64 \
;
}
ldap_modify() {
ldapmodify "${ldap_opts[@]}" \
"$@" \
;
}
ldap_passwd() {
ldappasswd "${ldap_opts[@]}" \
"$@" \
;
}
## ======================================================================
if [[ $# -ne 2 ]]; then
echo "Usage: $0 <backup|restore> DN"
exit 1
fi
op="$1"; shift
dn="$1"; shift
## ======================================================================
backup_ldif_fname="$dn.password.backup.ldif"
case "$op" in
backup)
echo "Backuping the password hash to $backup_ldif_fname.$$.tmp..."
if [[ -s $backup_ldif_fname ]]; then
pdie "Backup file already exists: $backup_ldif_fname"
fi
{
echo "dn: $dn"
echo "changetype: modify"
echo "replace: userPassword"
ldap_search \
"(entryDN=$dn)" \
userPassword \
|tail -n +2 \
;
} \
>"$backup_ldif_fname.$$.tmp" \
;
echo
echo "Changing password for $dn..."
if ! ldap_passwd -S "$dn"; then
ret="$?"
rm "$backup_ldif_fname.$$.tmp"
exit "$ret"
fi
echo
echo "Renaming $backup_ldif_fname.$$.tmp to $backup_ldif_fname..."
mv "$backup_ldif_fname.$$.tmp" "$backup_ldif_fname"
;;
restore)
echo "Restoring the password hash from $backup_ldif_fname..."
if [[ ! -s $backup_ldif_fname ]]; then
pdie "Backup file not found: $backup_ldif_fname"
fi
ldap_modify -f "$backup_ldif_fname" >/dev/null
echo "Removing $backup_ldif_fname..."
rm "$backup_ldif_fname"
;;
*)
pdie "Invalid operation name: $op"
;;
esac
echo
echo "Done!"
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment