私は現在使用しています
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
ただし、実際のファイルには、他のrequired
行required pam_unix.so
の後にrequired pam_env.so
などがありますが、これは無視されます!では、どうすればreallyこれを解決しますか?
他の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
_には他のrequired
before(_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
チェーンをかなり壊して、すべてのauth
をlogin
に手動でコピーする必要があります。