tally2で正しいパスワードでもアカウントロックしてしまう話

Linuxの認証機能でPAMを使い、複数回アクセスに失敗した場合アカウントロックさせる方法としてtally2と言うモジュールを使用するのですが、その際に正しいクレデンシャルでもアカウントロックしてしまう話。

これはtally2の仕様らしいのですが、何となく腑に落ちなかったのでソースコード読んで確認しました。

まず以下のようなPAMの設定を行っていたとします。

auth required pam_tally2.so deny=3

account required pam_tally2.so

この場合、3回認証に失敗すると、それ以降認証されなくなってしまうのですが、それ以外にも4件以上の同時多重アクセスが行われるとアカウントロック状態となってしまう場合があります。

PAMの認証はauth、account、password、sessionと言うモジュールインターフェースで別れており、tally2はauthとaccountで動作します。
tally2のauthモジュールインターフェースではアクセス試行回数のカウントアップを行い、denyオプションがある場合その値を超えていれば認証失敗とし、accountモジュールインターフェースでauthが成功していた場合にのみアクセス試行回数をリセットすると言う仕組みになっています。
そのため、tally2以外のauthのモジュールが呼ばれている間に、同時多重アクセスがあるとaccountモジュールインターフェースのtally2に辿り着く前に、authモジュールインターフェースのtally2が処理されてしまう場合があるということです。

4多重アクセスの場合、アクセス試行回数が1・2・3・4とカウントアップされ、4以降はdenyオプションの値を超えているため認証失敗となります。
さらに、最悪のタイミングの場合次のようなことが起こります。
accountモジュールインターフェースのtally2では、リセットを行う前の判定として、pam_dataから情報を取得しoldtimeが入っていなければ、データ無しのためリセットの必要性がないと判断されリセット処理を回避してしまいます。
tally2ではこのpam_dataの他にtallylogと言うファイルにアクセス試行の回数や日時を記録してあり、pam_dataとtallylogの読み書きのタイミングによっては、4回目のアクセスでtallylogが読まれた直後に1回目リセットが走り、2・3回目のリセットが回避され、その後に4回目のtallylogの記録が行われるとアカウントがロックされた状態が続いてしまう可能性があるわけです。

この問題を回避する方法として、tally2にはSerializeオプションが用意されており、これを利用することでtallyファイルをロックし、アクセスを直列化することができます。
ただしこれはmanにも書いてある通り、fcntlでロックするのでマルチスレッドで実行される環境では避けたほうが無難です。
別プロセスで同時多重にアクセスする分についてはこれで回避可能です。ただし、ロックされている間待ちが発生するので、タイムアウト等別の問題に派生する可能性は考慮してください。

以上、気になった話でした。
間違い等ご指摘あればご気軽にお願いします。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)