web-dev-qa-db-ja.com

パスワードの有効期限が切れるときの認証トークン操作エラー(passwd --expire)

Arch Linuxの新規インストールで、最初のログイン時にユーザーにパスワードの変更を要求しようとしています。passwd --expire usernameを使用してパスワードを期限切れにしましたが、ユーザーはログインできなくなりました。次のメッセージが表示されます。

You are required to change your password immediately (administrator enforced)

Authentication token manipulation error

数秒後、ログインプロンプトに戻ります。

このエラーの原因は何ですか?ユーザーがパスワードを変更できるように修正できますか?

パスワードを設定しても、passwd --deleteでパスワードを削除しても、同じ動作が発生します。

1
larsch

私はその動作に興味があったので、自分のマシンでテストしました。

再生

  1. 新しいユーザーを作成します

    # useradd -m -s /bin/bash test
    
  2. ダミーのパスワードを作成します

    # passwd test
    Geben Sie ein neues Passwort ein: 
    Geben Sie das neue Passwort erneut ein: 
    
  3. これまでに行ったことを別の端末でテストする

    $ su - test
    Passwort:
    $ # I'm in.
    $ exit # I'm out.
    
  4. 私のルートターミナルに戻って、私はあなたがしたことをやろうとします...

    # passwd --expire test
    passwd: Passwortablauf-Informationen geändert.
    
  5. 通常の端末に戻って、新しいユーザーに接続しようとします。

    $ su - test
    Passwort: 
    You are required to change your password immediately (administrator enforced)
    su: Fehler beim Ändern des Authentifizierungstoken
    

    興味深いことに、私はあなたと同じようになります。

ハスキング

気になったのでマニュアルを調べました

# LC_ALL=en_US.UTF-8 man passwd  #Comment# LC_ALL is needed because otherwise, I get the manual in german.

そして不思議なことにそれは言う:

-e, --expire
       Immediately expire an account's password. This in effect can force a user to change their password at the
       user's next login.

説明されている動作が機能しないのは奇妙だと結論付けました...


pam.dがログインの責任を負っていることを知っているので、私はそれをジャーナルに探しました。

# journalctl -g pam -xe

ログには、次のようなものがあります。

Jul 28 xx:xx:xx funilrys su[xxxxx]: pam_unix(su-l:auth): authentication failure; logname= uid=1000 euid=0 tty=pts/4 ruser=funilrys rhost=  user=test
Jul 28 xx:xx:xx funilrys su[xxxxx]: pam_unix(su-l:account): expired password for user test (root enforced)
Jul 28 xx:xx:xx funilrys su[xxxxx]: pam_warn(su-l:chauthtok): function=[pam_sm_chauthtok] flags=0x4020 service=[su-l] terminal=[pts/4] user=[test] ruser=[funilrys] rhost=[<unknown>]

注:suでログインすると、su-lが使用されるサービスになります。

つまり、pam.dは正しく機能しますが、パスワードの変更は処理されません。


しかし、私は確信が持てなかったので、SSHでテストし(SSH構成をあなたに任せます)、それは機能しました。

$ ssh -p xxxxx [email protected]
Passwort: 
You are required to change your password immediately (administrator enforced)
Ändern des Passworts für test.
Current password: 
Geben Sie ein neues Passwort ein: 
Geben Sie das neue Passwort erneut ein: 
$ 

どこが違うの?

私が見つけたのは、/etc/pam.d/sshdファイルにこの行があることです

password  include   system-remote-login

私のサービスはsu-lだったので、その行を/etc/pam.d/su-lに追加しました

その後、再試行しました。

$ su - test
Passwort: 
You are required to change your password immediately (administrator enforced)
Ändern des Passworts für test.
Current password: 
Geben Sie ein neues Passwort ein: 
Geben Sie das neue Passwort erneut ein: 

そしてそれはうまくいきました!

結論

使用するサービスに応じて、/etc/pam.d/login/etc/pam.d/su-lまたはその他の構成に次の行を追加した場合。ユーザーは次回のログイン時にパスワードを変更できます。

password  include   system-remote-login

推奨事項(編集1)

私の分析では、調査しましたが、詳しく調べた結果、system-remote-loginが機能していても、実際にはSSHであると考えられていたため、回避する必要があることを認めなければなりません。

したがって、この問題が発生した場合は、使用するサービスに応じて、(代わりに)次の行を/etc/pam.d/login/etc/pam.d/su-lまたはその他の構成に追加することをお勧めします。

password  include   system-local-login
1
funilrys