Ubuntuはpam_exec.soを使用してスクリプトを呼び出し、ユーザーに入力を要求し、スクリプトが終了コード0で終了したときにユーザーがSSH経由でログインできるようにします。私はそれを動作させることはできません。そのため、pam_exec.soをテストして元のスクリプトに問題があるかどうかを確認するために、次の簡単なスクリプトを作成しました。ただし、この単純なスクリプトを使用しても同じ問題が発生します。
/usr/local/bin/test.sh
#!/bin/bash
echo -n "Please enter your name:"
read name
echo "Hello $name"
@include common-auth
/etc/pam.d/sshdに次の行を追加して呼び出しました。
auth required pam_exec.so stdout /usr/local/bin/test.sh
ただし、システムにSSHを介して接続すると(下の表示)、入力するように求められません。パスワードを入力するとログインになります。ただし、スクリプトの出力は表示されます。
その後、入力がない場合は、終了コード1で終了するように上記のスクリプトを次のように変更しました。
#!/bin/bash
echo -n "Please enter your name:"
read name
if [ -z "$name" ]
then
exit 1
else
echo "Hello $name"
exit 0
fi
その後、正しいパスワードを入力してもシステムにSSHで接続できず(下のスクリーンショット)、スクリプトの出力は表示されません。
だから私が知りたいのは、この問題を修正し、pam_exec.soを使用してスクリプトを実行し、ユーザー入力を受け取り、スクリプトが終了コード0で終了した場合にのみssh認証を許可する方法です。
ベストアンサー1
私はpam_exec.so
実装に慣れていませんが、小さなPAMを実行し、PAM会話がどのように機能するか(pam_conv_*
関数)とサードパーティのスクリプトを読むかどうかを知る必要がありますstdin
(スクリプトはexec
フォアグラウンドのモジュールでしか読み取れないため)。
喜んで投入する努力の量に応じてPAMを構築することは複雑ではなく、次の例を簡単に読むことができます。Pythonまたはゴラン
別の(おそらくより速い)オプションは使用stdin
中のオプションですpam_exec.so
。
セキュリティは控えておいて、ユースケースに応じてパスワードをスクリプトの標準入力に送信するため、これだけで十分です。
スクリプト入力をパスワードに関連付けるオプションがある場合(たとえば、パスワードフィールドにパスワード+ OTPを入力する2FAのいくつかの実装):
- 行
stdin
にオプションを追加pam_exec.so
- スクリプトでパスワードを2番目の入力から分離します。
- パスワード認証自体を処理します(
pam_unix
追加の入力では不可能です)。 - 追加の入力を活用してください