pam_execを介して呼び出されたスクリプトからユーザー入力を取得中に問題が発生しました。

pam_execを介して呼び出されたスクリプトからユーザー入力を取得中に問題が発生しました。

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追加の入力では不可能です)。
  • 追加の入力を活用してください

おすすめ記事