Debian passwdコマンドで認証トークン操作エラー
以前このブログで認証管理のサービスであるPAMを取り上げたことがありますが、PAM設定ファイルの書き換わりによりエラーが起きてしまったので対応しました。
アップデートが原因
それまで問題なく使えていたDebianのchpasswdコマンドで、パスワードを変更できなくなってしまいました。「 認証トークン操作エラー 」がでます。
ちょうど変更ができなくなる時期にPAMライブラリを追加したり、apt upgradeを実行したりしていたので、そのあたりが原因ではないかとは思います。
ネットをいろいろ調べていて、「passwd」コマンドで同様の症状が出たら、一度「pwunconv」を実行してそのあと「pwconv」を実行をするといいと書いてあったので試してみましたが改善されません。そもそも「passwd」コマンドでのパスワード変更ではエラーになりません。
悩んだ挙句、使わなくなったDebianPCを持ち出して、PAMのファイルを比較したら原因が判明しました。/etc/pam.d/ディレクトリにあるPAM設定ファイルが書き換わってしまったみたいです。PAMに関する詳しいことは先にあげたリンク先の記事を読んでいただければと思いますが、このディレクトリにchpasswdというコマンドと同名のPAM設定ファイルが存在し、これが書き換わっていたことが原因のようです。
後日、passwdコマンドでも同様の書き換わりがおきエラーが出ました。こちらも/etc/pam.d/passwdファイルを修正することで解決しました。
chpasswd
... @include common-password ...
inculdeによる参照だけに変更されているようです。参照先を確認しています。
common-password
... password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 ...
これに対して旧バージョンのchpasswdのPAM設定ファイルは次のようになっていました。
chpassword
... password [success=1 default=ignore] pam_unix.so obscure sha512 ...
という事で、/etc/pam.d/chpasswdのcommon-passwordへの参照をやめ、旧バージョンの記述に戻したらエラーが出なくなりました。
修正後の/etc/pam.d/chpasswd
# コメントアウト # @include common-password password [success=1 default=ignore] pam_unix.so obscure sha512 password requisite pam_deny.so password required pam_permit.so
根本的な原因と対処法
エラーになる原因はcommon-passwordのpam_unixの行にある引数のuse_authtokでした。
問題の設定をキーワード毎に読み解いていくと、まずpasswordインターフェースで、これは問題ありません。
次のフラグ[success=1 default=ignore]では、モジュール成功時は1行読み飛ばしてpam_permit.so行に進み、それ以外は無視してpam_deny.soの行に到達し拒否が返されるようになっています。
その後モジュールの、pam_unix.soが指定されています。あとはパラメータが続きます。
obscureはパスワードの拡張チェックで新しいパスワードが、新旧で文字順の入替だけになっていないか、大文字小文字を入れ替えただけでないか、似ていないか、簡単すぎないか、をチェックする指示です。
問題となったuse_authtokは一旦飛ばして、残りの部分を説明をしてしまいます。
次のtry_first_passは同じモジュールまたはスタックでパスワードを入力した際は入力を省略できるオプション、最後のsha512はハッシュの指定です。
use_authtokにもどります。このauthtokは「authentication token」の略でこれを和訳すれば「認証トークン」です。このことからも原因はこれなのだという事がわかりますが、use_authtokを消したり、[]の中に「authtok_err=1」等の条件を書くことなどでも確認ができます。
この設定は何をするものかというと、pam_unix.soではパスワード入力用のプロンプトを出さずにひとつ前の入力を利用する設定です。
たとえば、ひとつ前にパスワードの強度をチェックするpam_cracklib.soを入れた一般的な使い方は次のようになります。(pam_cracklibではパスワードが脆弱だった場合それを修正させるために3回のリトライを追加で与えています)
passwd password required pam_cracklib.so retry=3 passwd password required pam_unix.so use_authtok
このような記述なら「認証トークン操作エラー」になることはありません。しかし、common-passwordのデフォルトの記述だと前段階にあたる部分(先の例ではpam_cracklib.so)が記述されていないためエラーとなります。
なぜこのようなデフォルト設定になっているかはよくわかりません。もし、パスワードの脆弱性チェックの実装を促すものだとしたらcommon-password設定ファイルを次のようにして@icludeの行をコメントアウトせずにそのまま利用するのが正しい修正方法なのかもしれません。
passwd password required pam_cracklib.so retry=3 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 password requisite pam_deny.so password required pam_permit.so
これはlibpam-cracklibがインストールされていないと利用できません。また、pam_cracklibは引数でパスワード長や他様々な制限を付与できるので利用する場合はそれらの設定も検討ください。