パスワードポリシー
パスワードの最短長、パスワード再利用の制限などを付与する.
LDAPの各ユーザのパスワードを収める「userPassword」って制約がないみたいで、そのままならゆるゆる.
初期パスワードを渡して変更してもらうにも簡単なのでは困る場合がある.
っでこのパスワードポリシーを openLDAP に実装してみる.
いまどんなスキーマを載せているの?以前なら slapd.conf に書かれていたけど「cn=config」になったらどうするか.
これが正しいわけではないでしょうが、下記コマンドからでいいのかなと
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config config*
dn: cn=config
dn: cn=module{0},cn=config
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}samba,cn=schema,cn=config
dn: cn={5}radius,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}mdb,cn=config
dn: olcOverlay={0}syncprov,olcDatabase={2}mdb,cn=config
[root@ldap-server ~]#
ってなことでppolicy.schemaはまだの様子. なので登録します
[root@ldap-server ~]# ldapadd -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config config* | grep ppolicy
dn: cn={6}ppolicy,cn=schema,cn=config
[root@ldap-server ~]#
前段から
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config config* | grep cn=module{0},cn=config
dn: cn=module{0},cn=config
[root@ldap-server ~]#
とあるのでモジュールを受け入れる器はあるみたい. そこに ppolicy モジュールの登録を行います
すでにsyncprov.laが登録されていて、/usr/lib64/openldapにsyncprov.laがある. ppolicy.la も「/usr/lib64/openldap/ppolicy.la」として存在している
[root@ldap-server ~]# vi ldap/module-ppolicy.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la
[root@ldap-server ~]# ldapadd -H ldapi:/// -f ldap/module-ppolicy.ldif
(確認)
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config | grep olcModuleLoad:
olcModuleLoad: {0}syncprov.la
olcModuleLoad: {1}ppolicy.la <-- これ
[root@ldap-server ~]#
ppolicyの動作設定を登録します. 別のcnでポリシーを定義させるようで、ここでは組織単位「ou=policies」を新設して、そのかなに
「cn=default,ou=policies,dc=sybyl,dc=local」を作って、その内容でパスワードポリシーが決まるようにします.
LDAP/failoverと同様に「olcDatabase={2}mdb,cn=config」にppolicyオーバーレイを載せる.
これまでの作業は「ppolicy.schema」の登録、「ppolicy」モジュールのありか、場所の登録で、今回はそのppolicyの設定になる
[root@ldap-server ~]# vi ldap/ppolicy.ldif
dn: olcOverlay=ppolicy,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPpolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=sybyl,dc=local <--定義の場所
olcPPolicyUseLockout: TRUE
[root@ldap-server ~]# ldapadd -H ldapi:/// -f ldap/ppolicy.ldif
(確認)
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config config*
:
dn: olcOverlay={0}syncprov,olcDatabase={2}mdb,cn=config
dn: olcOverlay={1}ppolicy,olcDatabase={2}mdb,cn=config
[root@ldap-server ~]# ldapsearch -Q -LLL -H ldapi:/// -b cn=config | less
:
dn: olcOverlay={1}ppolicy,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: {1}ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=sybyl,dc=local
olcPPolicyUseLockout: TRUE
[root@ldap-server ~]#
次に参照先を用意する. 「ou=policies,dc=sybyl,dc=local」を掘って、作った「ou=policies」に「cn=default,ou=policies,dc=sybyl,dc=local」を用意します
「cn=default,ou=policies,dc=sybyl,dc=local」の内容がそもそものパスワードポリシーになる
この2つの操作を1つで行ってます
[root@ldap-server ~]# vi ldap/ppolicy-default.ldif
dn: ou=policies,dc=sybyl,dc=local
ou: policies
objectClass: top
objectClass: organizationalUnit
dn: cn=default,ou=policies,dc=sybyl,dc=local
objectClass: top
objectClass: device
objectClass: pwdPolicy
cn: default
pwdCheckQuality: 2 パスワードの品質保証?条件にそっているか確認. 0はしない(意味なし). 1と2チェックあり
pwdAttribute: userPassword 適用される属性
pwdMinAge: 0 パスワード変更禁止期間
pwdMaxAge: 0 パスワード有効期限. 既定の「7776002 」は90day
pwdInHistory: 0 過去のパスワードを記録して、それが使えない過去のパスワード数. 既定は3
pwdExpireWarning: 432000 パスワードの有効期限が近いよと掲示する開始時間. 既定「432000」は5day
pwdGraceAuthNLimit: 0 パスワードの有効期限が切れても猶予でログインさせてあげる回数
pwdMinLength: 5 パスワードの長さ
pwdLockout: TRUE パスワードロックを使うか
pwdMaxFailure: 5 何回パスワードを間違えたらロックさせるの回数.
pwdFailureCountInterval: 60 ロックされる前にログイン試行回数を0にするtime(sec)
pwdLockoutDuration: 900 ロックされる時間(sec). 0ならロックされたまま. 管理者が対処
pwdMustChange: TRUE 初回ログインで既設パスワードを変更させる
pwdAllowUserChange: TRUE 自分自身でパスワードが変更できる
pwdSafeModify: FALSE パスワード変更時に前のパスワードを求めるか. passwdコマンドの仕様に寄らず
[root@ldap-server ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f ldap/ppolicy-default.ldif
「LDAP Admin」で確認すると下記のようになる
パスワードの複雑さはこのppolicy の範疇外. 大文字、小文字、数字の混合割合とか、辞書に載っているパスワードの排除とかはこのppolicyではしない.
ログインを指定回数失敗するとログインできない
っでそのユーザの確認と解除方法なのだが、、、目印は「pwdAccountLockedTime」. だがこの目印. LDAP Adminから探せない. あとldapviからも探せない
どこにあるのかわからない. だが検索すると引っかかる. そうゆうもの?
(ロックされたユーザの確認)
[root@ldap-server ~]# ldapsearch -x -H ldaps://ldap-server -b dc=sybyl,dc=local pwdAccountLockedTime=* pwdAccountLockedTime -D cn=Manager,dc=sybyl,dc=local -W
Enter LDAP Password:
(略
# saber, People, sybyl.local
dn: uid=saber,ou=People,dc=sybyl,dc=local
pwdAccountLockedTime: 20221126162403Z
(略
[root@ldap-server ~]#
このロックを解除するにはldifファイルで行う. ldapviで出来るだろうと思ったのだが、、探してもpwdAccountLockedTimeが見当たらない..
[root@ldap-server ~]# cat ldap/unlock.ldif
dn: uid=saber,ou=People,dc=sybyl,dc=local
changetype: modify
delete: pwdAccountLockedTime
[root@ldap-server ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f ldap/unlock.ldif
で解除できる.
ユーザが初めてログインする際は、アカウント名がそのままパスワードで、認証直後にパスワードの変更が求められるって筋書き.
[root@ldap-server ~]# vi ldap/saber.ldif
dn: uid=saber,ou=people,dc=sybyl,dc=local
changetype: add
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
uid: saber
cn: saber
sn: saber
givenName: sybyl
mail: saber@sybyl.local
uidNumber: 3002
gidNumber: 2001
homeDirectory: /home/saber
userPassword: saber <-- パスワードはハッシュせずそのまま. 初期パスワードなので
loginShell: /bin/bash
pwdReset: TRUE <-- これで初回にパスワード変更が促される
[root@ldap-server ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f ldap/saber.ldif
ユーザでログインすると下記プロセスが始まる
[supervisor@c ~]$ ssh -l saber ldap-client
saber@ldap-client's password: <-- 渡された初期パスワードを入力
Password expired. Change your password now.
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user saber.
Current Password: <-- 渡された初期パスワードを再度入力
New password: <-- パスワードポリシーが満たす新規パスワードを入力
Retype new password:
passwd: all authentication tokens updated successfully.
Connection to ldap-client closed.
[supervisor@c ~]$
パスワード変更が完了すると元に戻ります.
パスワードを忘れてしまった際も同じプロセスで回せばよく、 ldappasswdでそのアカウント名をパスワードにさせて、pwdReset をTRUEに書き換える
[supervisor@c ~]$ ldappasswd -x -D cn=Manager,dc=sybyl,dc=local -W -S uid=saber,ou=People,dc=sybyl,dc=local -s saber
[supervisor@c ~]$ cat ldap/resetPW.ldif
dn: uid=saber,ou=People,dc=sybyl,dc=local
changetype: modify
replace: pwdReset
pwdReset: TRUE
[supervisor@c ~]$ ldapmodify -x -D cn=Manager,dc=sybyl,dc=local -W -f ldap/resetPW.ldif
これで相手方に「アカウント名をパスワードに変更しました」と伝えれば、あとは独自に変えてくれるかと.
「/usr/lib64/openldap」を見ると「check_password.so」がある. これがそれに対応するみたい.
っでこれと取り込む
[root@ldap-server ~]# vi ldap/check_password.ldif
dn: cn=default,ou=policies,dc=sybyl,dc=local
changetype: modify
add: objectClass
objectClass: pwdPolicyChecker
dn: cn=default,ou=policies,dc=sybyl,dc=local
changetype: modify
add: pwdCheckModule
pwdCheckModule: check_password.so
[root@ldap-server ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f ldap/check_password.ldif
「LDAP Admin」で確認するとpwdCheckModuleが登録されたことが分かる
次に「check_password.so」の定義ですが、こちらは平文で「/etc/openldap/check_password.conf」で定義します
この「/etc/openldap/check_password.conf」は openldap-server パッケージの付属品.
中身はこんな感じ
[root@ldap-server ~]# cat /etc/openldap/check_password.conf
# OpenLDAP pwdChecker library configuration
#useCracklib 1
#minPoints 3
#minUpper 0
#minLower 0
#minDigit 0
#minPunct 0
[root@ldap-server ~]# ^
既定値は#が付いていて無効化されている. useCracklibは辞書に載っている文字列化を調べる.
minPoints はパスワードの文字列長、minPunct は記号(!,",#,$,%,&,',(,),=,~,^,@ら)を意図する.
っとまぁ複雑にできるけど、度が過ぎると嫌われるものでもある. 単純に「数字を一個いれてね」で位がいいかなと思う.