web-dev-qa-db-ja.com

pam_cracklibは不正なパスワードを正しく報告しますが、pam_unixモジュールはまだパスワードを変更します

現在、debug.logに従って正しく失敗するpam_cracklibを使用しようとしていますが、PAM構成ファイルのpassword requisiteエントリとして設定されていても、パスワードの変更を可能にする次のpam_unixモジュールにフォールスルーします。パスワードの変更が許可されているのはなぜですか?

Sudoを介してログインドライバーアプリケーションを実行しています。これは、認証方法を知っている唯一の方法です。

これが私のPAM設定ファイル(/etc/pam.d/validateという名前)です:

auth  required    pam_env.so
auth  required    pam_tally.so onerr=fail deny=3
auth  sufficient  pam_unix.so nullok try_first_pass 
auth  requisite   pam_succeed_if.so uid >= 500 quiet
auth  required    pam_deny.so

account  required    pam_unix.so
account  required    pam_tally.so
account  sufficient  pam_succeed_if.so uid < 500 quiet
account  required    pam_permit.so

password requisite   pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
password sufficient  pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required    pam_deny.so

session  optional    pam_keyinit.so revoke
session  required    pam_limits.so
session  [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session  required    pam_unix.so

ユーザーパスワードを無効にして、変更を強制します。

# chage -d 0 <user>

Sudoを使用してカスタムアプリケーションを実行すると、/var/log/debug.logは次のように生成します。

pam_unix(validate:account): expired password for user mike (root enforced)
pam_cracklib(validate:chauthtok): bad password: it is WAY too short
pam_unix(validate:chauthtok): password changed for mike
3
jiveturkey

これは、Sudoがコマンドをrootとして実行するためです。

man pam_cracklibをチェックすると、次のように表示されます。

   enforce_for_root
       The module will return error on failed check also if the user
       changing the password is root. This option is off by default which
       means that just the message about the failed check is printed but
       root can change the password anyway. Note that root is not asked
       for an old password so the checks that compare the old and new
       password are not performed.

だから、あなたがする必要があるのはあなたのpam_cracklib.solineを言うように変えることです

password requisite   pam_cracklib.so debug retry=3 minlen=14 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root

Pam_cracklib.soソースを確認すると、804行目で次のようになります(とにかくFedora 20上で)

  if (getuid() || options.enforce_for_root || (flags & PAM_CHANGE_EXPIRED_AUTHTOK))

そのため、呼び出し元の実際のUIDをチェックし、実際のUIDが0であるかどうかに応じて変更を強制します。

したがって、バイナリをsetuidして、rootがそれを所有していることを確認するだけで、パスワードを変更してcracklibの決定を強制できるようになります。バイナリをsetuidすると、有効なuidは0にのみ設定され、実際のuidは設定されません。

3
Matthew Ife