OpenLDAP Software is an open source implementation of the Lightweight Directory Access Protocol.
Many graphical interfaces are available for managing user accounts in OpenLDAP like PHPLDAPAdmin (http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page) or LAM (https://www.ldap-account-manager.org/lamcms/).
When generating a bulk amount of accounts with automation or just managing user details with a simple script, allows much more flexibility and can be even quicker.
LDAP passwords can be stored or changed by using an LDIF file. This LDIF file needs 3 required lines:
- The “
dn
” you are about to change - the “
changetype
” set to “modify
“ - A “
replace
” line containing the field you want to change (in our case, since we are changing the password, this will be “userPassword
“)
Your LDAP password can be stored either in clear-text (which is not advisable) or by sending a SHA-hash
. The SHA-hash
must include the salt at the end and must be base64
encoded.
The code snippit below will call a subroutine called generate_password()
which comes from a previous article (Secure Password Generator in Perl).
At the end of the script, it will print out the LDIF file content, which needs to be saved to change.ldif
. As last, it will print the ldapmodify
command to make the actual change. You will need to know the admin
password for this. Alternatively, you could also make this change using your own dn
for authentication.
use Digest::SHA; use MIME::Base64; my $random_password = generate_password(24); my $random_salt = generate_password(3); my $ctx = Digest::SHA->new; $ctx->add($random_password); $ctx->add($random_salt); my $hashedPasswd = encode_base64($ctx->digest . $random_salt, ''); print "password: $random_password\n"; print "salt: $random_salt\n"; print <<EOF; # LDIF dn: uid=user1,ou=users,dc=shihai-corp,dc=at changetype: modify replace: userPassword userPassword: {SSHA}$hashedPasswd EOF print "\n"; print q{LDAP cmd: ldapmodify -H "ldap://ldap_server01" -Z -x -W -D "cn=ldapadmin,ou=admins,dc=shihai-corp,dc=at" -f change.ldif} . "\n\n"