パスワードポリシー
パスワードの最短長、パスワード再利用の制限などを付与する.
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 ~]#

ppolicyモジュールの登録

前段から

[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の有効化

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」で確認すると下記のようになる
2022y11m26d_233109893.png

メモ

パスワードの複雑さはこの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が登録されたことが分かる
2022y11m27d_002329865.png

次に「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 は記号(!,",#,$,%,&,',(,),=,~,^,@ら)を意図する.

っとまぁ複雑にできるけど、度が過ぎると嫌われるものでもある. 単純に「数字を一個いれてね」で位がいいかなと思う.


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2022-11-28 (月) 01:11:22 (12h)