web-dev-qa-db-ja.com

pam認証を使用してスクリプトを実行しようとしています

Pamが認証を行うときにカスタムスクリプトを実行できるようにしたいのですが、合格できないように見えるエラーが表示されます。

Feb 20 17:39:47 DC03R07DS25-08 sockd[2874]: pam_exec(sockd:auth): send password to child
Feb 20 17:39:47 DC03R07DS25-08 sockd[2893]: pam_exec(sockd:auth): Calling /tmp/test.sh ...
Feb 20 17:39:47 DC03R07DS25-08 sockd[2874]: pam_exec(sockd:auth): waitpid returns with -1: No child processes

これは非常に基本的なスクリプトで、0を出力してすべてを許可します。

#!/bin/bash
# read the users password from stdin (pam_exec.so gives the provided password
# if invoked with expose_authtok)

read password
echo $password > /tmp/a.txt

exit 0

そして、これが私のpam.d設定です。

auth required pam_exec.so debug expose_authtok /tmp/test.sh
account required    pam_permit.so

そのスクリプトのパスワードにアクセスできるように、本当にexpose_authtokが必要です。

Ubuntu14.04を使用しています。

1
Romeo Mihalcea

刈り取りレースのようです。プロセス(sockd?)を呼び出すと、SIGCHLDハンドラーが設定され、pam_execの代わりにtest.shが取得されます。 https://lists.andrew.cmu.edu/pipermail/cyrus-sasl/2009-January/001627.html を参照してください。

編集:申し訳ありませんが、上のリンクで何を見つけることができるかを説明しましょう:このバグに遭遇したとき、pam_exec.cにいくつかの変更を加えてpam_exec.soを再コンパイルする必要がありました。 fork()の前にSIGCHLDハンドラーをデフォルトに設定し、waitpid()の後およびforkが失敗した後(pid ==-1ブランチ)にリセットします。何かのようなもの:

セットする:

struct sigaction newact, oldact;
newact.sa_handler = SIG_DFL;
newact.sa_flags = 0;
sigfillset(&newact.sa_mask);
sigaction (SIGCHLD, &newact, &oldact);

リセット:

sigaction (SIGCHLD, &oldact, NULL);
1
bandie