web-dev-qa-db-ja.com

条件付きPAM認証を実現する方法は?

私は現在使用しています

auth required pam_unix.so try_first_pass nullok
auth optional pam_ssh.so  use_first_pass

(さらに、Arch Linuxがデフォルトで追加した他のおそらく無関係なエントリ)。これは、 pam_ssh のおかげで~/.ssh/login-keys.d/に保存されている(またはリンクされている)sshキーのロック解除を試みるためにもログインパスワードが使用されることを意味します。 パスフレーズプロンプトを取得するために、代わりにtry_first_passを使用することもできます。ログインパスワードでsshキーのロックが解除されていない場合)。

SSHキーのパスフレーズがログインのパスフレーズと同じである限り、これは正常に機能します。しかし、私が_(のように達成したいのは、基本的に2つの異なるパスワードのいずれかでログインできることです-ログイン1つまたはSSHキー1つ)。

だから私はpam_sshが最初にSSHキーのロックを解除しようとし、失敗した場合にのみpam_unixが必要であり、そうでない場合はスキップする必要があると考えました。これはどういうわけか達成できますか?


最初は、解決策はpam_sshを最初に置くことにあると思いましたが、さらにsufficientではなくoptionalにする必要があります。

auth sufficient pam_ssh.so  try_first_pass
auth required pam_unix.so try_first_pass nullok

ただし、実際のファイルには、他のrequiredrequired pam_unix.soの後にrequired pam_env.soなどがありますが、これは無視されます!では、どうすればreallyこれを解決しますか?

5
Tobias Kienzler

他の2つのSE投稿( SOに1つSFに1つ )のおかげで、答えは 高度なcontrol構文 を使用することにあります。ザ・

_auth required pam_unix.so try_first_pass nullok
# and sometime later
auth optional pam_ssh.so  use_first_pass
_

したがって、

_auth [success=1 new_authtok_reqd=1 ignore=ignore default=ignore] pam_unix.so try_first_pass nullok
auth required pam_ssh.so use_first_pass
_

Now _pam_ssh_は、後続のモジュールのNをスキップすることを意味するため、_pam_unix_行が_success=N_行の直前にあることが不可欠です。

また、そこにいる間は_session pam_ssh.so_行を忘れないでください!


私の最初の試みでは、私は使用しました

_auth [success=1 default=ignore] pam_ssh.so try_first_pass
auth required pam_unix.so use_first_pass nullok
_

代わりに、この方法ではSSHキーを持たないすべてのユーザーがロックアウトされます。 _default=ignore_では不十分であることが判明しました。_auth_err=ignore_は明らかにnotdefaultの一部と見なされるため、追加する必要があります。また、この試行は、ユーザーがhas SSHキーであるかどうかに応じて、「パスワード」または「SSHパスフレーズ」プロンプトが表示されることを意味します。


Arch Linuxでは、loginが使用する_pam_unix_行はincludeチェーンにあることに注意してください。

_login -> system-local-login -> system-login -> system-auth
_

_system-login_には他のrequiredbefore(_system-auth_を含む)があるため、_auth [success=1 default=ignore] pam_ssh.so try_first_pass_をloginの_auth include system-local-login_の前に単純に入れることはできません-スキップします間違ったrequiredそして_pam_unix.so use_first_pass_のおかげで(_try_first_pass_の代わりに)あなたはまだあなたのログインパスワードでしかログインできませんでした!一方、_system-auth_を変更することで、sshdなどのotherサービスが、ログインパスワードの認証オプションとしてSSHキーを使用できるようになります。本当にloginだけにこれを使用させたい場合は、includeチェーンをかなり壊して、すべてのauthloginに手動でコピーする必要があります。

6
Tobias Kienzler