LoginSignup
12
8

More than 5 years have passed since last update.

LDAP2.4でslapd.confを使わずにパスワードポリシーを適用させる

Last updated at Posted at 2018-07-02

はじめに

現在のLDAP/openLDAPのバージョンだとかつてあったslapd.confファイルはなくなり、LDAPの設定はslapd.d内のスキーマファイルで管理されている。
LDAPアカウントにパスワードポリシーを適用させる必要が出てきたが、既存記事だとslapd.confファイルをダミー化させてパスワードポリシーを適用させるという方法が多かった。
今回はその方法を取らず、シンプルにスキーマをいじってポリシーをいじって適用させる手順を記録する。

ゴール

ldap2.4にパスワードポリシー を適用させる

ポリシースキーマの有効化

デフォルトではポリシーは無効化されているので、まずはそれを有効化させる。

$ldapmodify -x -a -H ldap:/// -D cn=admin、dc=domain,dc=net -W -f/etc/ldap/schema/ppolicy.ldif

スキーマが有効化されていることを確認する

$ldapsearch -Q -LLL -H ldapi:/// -Y EXTERNAL -b cn=schema,cn=config dn

dn: cn=schema,cn=config

dn: cn={0}core,cn=schema,cn=config

dn: cn={1}cosine,cn=schema,cn=config

dn: cn={2}nis,cn=schema,cn=config

dn: cn={3}inetorgperson,cn=schema,cn=config

dn: cn={4}ppolicy,cn=schema,cn=config

dn: cn={5}dhcp,cn=schema,cn=config

dn: cn={6}dnszone,cn=schema,cn=config

dn: cn={7}mail,cn=schema,cn=config

dn: cn={8}mmc,cn=schema,cn=config

dn: cn={9}openssh-lpk,cn=schema,cn=config

dn: cn={10}quota,cn=schema,cn=config

dn: cn={11}radius,cn=schema,cn=config

dn: cn={12}samba,cn=schema,cn=config

dn: cn={13}zarafa,cn=schema,cn=config

オーバーレイの有効化

オーバーレイを適用化させるファイルを作成

$vi ppolicy-module.ldif

dn: cn=module{0},cn=config
changeType: modify
add: olcModuleLoad
olcModuleLoad: ppolicy

これをldapmodifyコマンドで適用させる

$ldapmodify -x -H ldap:/// -D cn=admin,dc=domain,dc=net -W -f ppolicy-module.ldif

モジュールが有効化されているかの確認

$ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" "(objectClass=olcModuleList)"

dn: cn=module{0},cn=config
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}ppolicy

オーバーレイの中身設定

オーバーレイの中身を定義するファイルを作成する

$vi ppolicy-conf.ldif

dn: olcOverlay=ppolicy,olcDatabase={1}hdb,cn=config
objectClass: olcPpolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=ppolicy,dc=domain,dc=net
olcPPolicyUseLockout: FALSE
olcPPolicyHashCleartext: TRUE

上記の設定を適用させる

$ldapmodify -x -a -H ldap:/// -D cn=admin,dc=domain,dc=net -W -f ppolicy-conf.ldif

設定の確認

$ldapsearch -x -H ldap:/// -D cn=admin,dc=domain,dc=net -W -b cn=config "(objectClass=olcPpolicyConfig)" -LLL

dn: olcOverlay={0}ppolicy,olcDatabase={1}hdb,cn=config
objectClass: olcPPolicyConfig
olcOverlay: {0}ppolicy
olcPPolicyDefault: cn=ppolicy,dc=ldaptuto,dc=net
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: FALSE

パスワードポリシーの中身を定義する

パスワードポリシーの定義ファイルを作成する

$vi ppolicy-defaut.ldif

dn: cn=ppolicy,dc=gauss,dc=local
objectClass: top
objectClass: inetOrgPerson
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: ppolicy
sn: ppolicy
pwdAttribute: userPassword
pwdMaxFailure: 3
pwdMustChange: FALSE
pwdMinLength: 8
pwdInHistory: 1
pwdCheckQuality: 1
pwdMinAge: 0
pwdLockout: TRUE
pwdMaxAge: 0
pwdExpireWarning: 0
pwdReset: FALSE
pwdLockoutDuration: 600
pwdGraceAuthNLimit: 3

具体的なオプションの意味は参考ページを参照してください

定義ファイルを適用させる

$ldapadd -H ldapi:/// -D "cn=admin,dc=gauss,dc=local" -W -f ppolicy-default.ldif

適用されたかを確認する

$ldapsearch -x -H ldap:/// -D cn=admin,dc=domain,dc=local -W -b dc=domain,dc=local "(objectClass=pwdPolicy)" -LLL

dn: cn=ppolicy,dc=gauss,dc=local
objectClass: top
objectClass: inetOrgPerson
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: ppolicy
sn: ppolicy
pwdAttribute: userPassword
pwdMaxFailure: 3
pwdMustChange: FALSE
pwdMinLength: 8
pwdInHistory: 1
pwdCheckQuality: 1
pwdMinAge: 0
pwdLockout: TRUE
pwdMaxAge: 0
pwdExpireWarning: 0
pwdReset: FALSE
pwdLockoutDuration: 600
pwdGraceAuthNLimit: 3

これで適用完了

本当に適用されているかを確認する

パスワードを変えてみる

$ldappasswd -x -D 'cn=user,ou=people,dc=domain,dc=net' -W -S

今回、パスワードの最低文字数が8なので、8未満だとポリシー違反で弾かれ、8以上だと設定変更できる、はず

ポリシーを変更してみる

一度適用させたポリシーを変更させるファイルを作成し、適用させる

$vi ppolicy-modify.ldif

dn: dc=domain,dc=net
changetype: modify
replace: pwdMaxAge
pwdMaxAge: 3600

$ldapmodify -x -D "cn=admin,dc=domain,dc=local" -W -f ppolicy-modify.ldif

ロックアウトされたアカウントを解除する

pwdLockoutがTRUEだとパスワードを複数回間違えた際にロックされる

そのロックの解除方法

#ロックされたアカウントの確認
$ldapsearch -x -D "cn=admin,dc=domain,dc=net" -W -b "dc=domain,dc=net" pwdAccountLockedTime=* pwdAccountLockedTime

#ロック解除のファイルを作成、適用
$vi ppolicy-unlock.ldif

dn:uid=user,ou=people,dc=domain,dc=net
changetype:modify
delete: pwdAccountLockedTime

$ldapmodify -x -D "cn=admin,dc=domain,dc=net" -W -f ppolicy-unlock.ldif

#解除されたかを確認
$ldapsearch -x -D "cn=admin,dc=domain,dc=net" -W -b "dc=domain,dc=net" pwdAccountLockedTime=* pwdAccountLockedTime

おまけ

普段のLDAP操作はphpldapadminを使用している
ldappasswdコマンドではパスワードポリシーは適用されるが、phpldapadmin上でユーザーがパスワードを変更する際、パスワードが暗号化されているとポリシーチェックにおいて文字数を数えられなくなってしまう
ポリシーを適用させるためには、[ssha]などのハッシュを無くし、平文で保存する[clear]を選択する必要がある

しかしパスワードの平文保存をするのは、これはこれでセキュリティ的にもどうなの?というところもあるため、
なにかもっといい方法がないか要審議

ご注意を

終わりに

コマンド実行時はSASL認証とadminアカウントでの認証どちらかでしか通らなかったりしてその違いがまだよくわからず、理解がまだ足りない。
ldapの情報自体少なくここまでくるのに時間がかかってしまったが、なんとか設定できてよかった
今後はロックされたアカウントを解除させるシェルを作ったり、パスワード期限が近づいた際にアラートを発信できるようにしたい

参考ページ

OpenLDAP password policy
パスワードポリシーの詳細
LDAPのデータ更新
LDAP パスワードポリシーについて

12
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8