web-dev-qa-db-ja.com

PAMディレクティブを理解するのに助けが必要

RHEL5ボックスの/etc/pam.d/sshdファイルに次のディレクティブがあり、少し混乱しています。これらのディレクティブは、LDAP + RADIUS + OTPを機能させるためにあります。私がやろうとしているのは、LDAP + RADIUS + OTPのユーザーUID <499をチェックしないように、またUID = 30027をチェックから除外するようにpamに指示することです。

このディレクティブは意図したとおりに機能します。 UID> = 499かどうかをチェックし、そうである場合はスキップします(auth十分なpam_unix.so nullok_secure)。

auth [success=1 default=ignore] pam_succeed_if.so uid >= 499 quiet

私はここで混乱しています。これはsuccess = 1なのでLDAP + RADIUS + OTPを実行するはずですが、どういうわけかそれでも機能します。 trueの場合、次のルールをスキップするべきではありませんか?

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet
auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass

思い通りに動作するようになりましたが、そのロジックの背後で混乱しています。


更新

わかりました。これは、uidが30327のローカルユーザーを使用してsshを実行したときに/ var/log/secureに表示されるものです-

Aug  8 08:21:30 journey sshd[9357]: Accepted keyboard-interactive/pam for sidd from 10.1.1.178 port 51242 ssh2
Aug  8 08:21:30 journey sshd[9357]: pam_unix(sshd:session): session opened for user sidd by (uid=0)

これは、uidが0(<499)のrootを使用してsshを取得するものです。

Aug  8 08:25:51 journey sshd[9402]: Accepted keyboard-interactive/pam for root from 10.1.1.178 port 51246 ssh2
Aug  8 08:25:51 journey sshd[9402]: pam_unix(sshd:session): session opened for user root by (uid=0)

これは、LDAPパスワードのみでOTPなしのLDAPユーザーを使用したときに得られるものです-

Aug  8 08:27:04 journey sshd[9447]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:27:05 journey sshd(pam_google_authenticator)[9447]: Failed to read "/home/schoure/.google_authenticator"
Aug  8 08:27:07 journey sshd[9445]: error: PAM: Cannot make/remove an entry for the specified session for schoure from journey

これは、LDAP + OTPでLDAPユーザーを使用したときに得られるものです-

Aug  8 08:28:13 journey sshd[9452]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:28:13 journey sshd[9450]: Accepted keyboard-interactive/pam for schoure from 10.1.1.178 port 43068 ssh2
Aug  8 08:28:13 journey sshd[9450]: pam_unix(sshd:session): session opened for user schoure by (uid=0)

つまり、その通りです。SMTPユーザーの場合、pam_unixは失敗しますが、「十分」に設定されているため、ターミナルではありません。それを片付けてくれてありがとう。

あなたの他のポイントに関して-

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet

評価されていない、評価されているようです。そのディレクティブをコメントアウトすると、

Aug  8 08:34:39 journey sshd(pam_google_authenticator)[9537]: Failed to read "/home/sidd/.google_authenticator"
Aug  8 08:34:42 journey sshd[9535]: error: PAM: Cannot make/remove an entry for the specified session for sidd from journey

したがって、明らかに30327> 499であるため、これがどのように機能するかについてはまだ混乱しています。したがって、2行目をスキップする必要があります。 PAMが最初の2行の間に暗黙のORを追加する場合、これが機能していることがわかる唯一の理由。

更新2

ああ、何が起こっているのかわかります。事実上、その行は単なるプレースホルダーです。そのUIDを、存在しないランダムなUIDに変更しましたが、それでも機能しました。だから私は論理を理解しています-

  1. 1行目はUIDをチェックします。 499を超える場合は、3行目にスキップして、ローカルでチェックされます。 UID> 499はローカルではないため、その条件は失敗しますが、非終端記号であるため、LDAP + RADIUS + OTPに移動します。
  2. 特定のUIDが設定されている2行目をコメントアウトすると、success = 1のため、PAMはローカル認証を完全にスキップします。

だから事実上、私が何か間違ったことをしたことでそれはうまくいった。私は私がする必要があることを手に入れました、そしてそれは私のために働いています。

ローカルユーザーがLDAP + RADIUS + OTPを介して認証されることを望まないので、これらの3行で問題は解決します。これらは機能していますが、正しいことを確認したいだけです。 -

auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass
6
Sidd

pam_unix.soをスキップしてもよろしいですか?

sufficientは、障害時の「非終端」動作です。 pam_unix.soチェックが失敗した場合でも、認証は引き続きpam_radius_auth.soを試行します。

私の解釈は:

  • uid eq 30027チェックがtrueを返すことはありません。テストは、uidが499未満の場合にのみ実行されるため、uid eq 30027の条件を真にすることはできません。
  • pam_unix.soallシナリオで試行され、失敗した場合はpam_radius_auth.soが試行されます。
  • 両方が失敗した場合、pam_google_authenticator.soが試行されます。

ログをもう一度確認してください。 radiusログインは失敗していない可能性がありますが、pam_unix.soチェックはおそらくisが失敗をログに記録しています。それはあなたのログインを妨げているだけではありません。


この回答は、元の質問の範囲を正確にカバーしています。更新またはコメントを通じて提起された追加の質問はカバーされません。

3
Andrew B