私はVPSにFedora 22をインストールし、簡単な作業をしようとしています。 pam_execを介してすべてのSSHログインで情報スクリプトを実行します。しかし、予期せぬ困難にぶつかりました。 pam_execが終了コード13で失敗しました。
/etc/pam.d/sshd の末尾にカスタム行を追加しました。
session optional pam_exec.so seteuid /usr/local/bin/loginformer.py
もちろん、loginformer.pyには実行フラグがあります:
$ ls -l /usr/local/bin/loginformer.py
-rwxr-xr-x. 1 root root 4254 Jun 8 09:35 /usr/local/bin/loginformer.py
しかし、ここには痛みを伴う抜粋がありますjournalctl -lb SYSLOG_FACILITY=10
。
Jun 08 11:58:49 fedora22 sshd[671]: pam_exec(sshd:session): execve(/usr/local/bin/loginformer.py,...) failed: Permission denied
Jun 08 11:58:49 fedora22 sshd[663]: pam_exec(sshd:session): /usr/local/bin/loginformer.py failed: exit code 13
私はいつも私のArchLinuxで実行されているので、何が起こっているのかわかりません。私はこれがSELinuxの制限かもしれないと思いますが、わかりません。
私は何が間違っていましたか?
修正する
まあ、私はSELinuxを深く理解し、スクリプトを変更する必要があるSELinuxコンテキストを理解しようとしました。
これでSELinuxのコンテキストは次のようになります。
$ ls -Z /usr/local/bin/loginformer.py
unconfined_u:object_r:user_home_t:s0 /usr/local/bin/loginformer.py
しかし、スクリプトにどのようなコンテキストを設定する必要がありますか?
アップデート2
また、SELinux AVCログは問題を検出するのに非常に役立つと思います。早くあげられなくてすみません。
cat /var/log/audit/audit.log | grep loginformer.py
同じ文字列をたくさん返します。
type=AVC msg=audit(1433784991.570:265): avc: denied { execute } for pid=7866 comm="sshd" name="loginfomer.py" dev="vda1" ino=11924 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
答え1
pam_exec
そしてpam_selinux
呼び出される順序が重要です。マニュアルページpam_selinux
メモ:
PAMスタックにpam_selinuxを追加すると、アプリケーションを実行している他のPAMモジュールの動作が中断される可能性があります。これを防ぐためにpam_selinux.soを開くPAMスタックの対応するモジュールの背後に配置する必要があります。 pam_selinux.so 閉じるそれはそれらの前に置かれるべきである。そのような配置が不可能な場合、pam_selinux.soの回復元のセキュリティコンテキストを一時的に復元するために使用できます。
同様に、ダンウォルシュが書いた。トピックについて:
pam_mountなど、ユーザーが実行できないコマンドを実行するためにpam_moduleを追加するには、それを追加する必要があります。今後pam_selinux.so オープンコマンド。ユーザーが実行できるコマンドを実行するために pam_module を追加する場合は、次のものが必要になる場合があります。後ろにpam_selinux.soが行を開きます。
さらに、スクリプトのuser_home_t
現在のセキュリティコンテキストはデフォルトのポリシーと互換性がない可能性があります(ファイルを移動するとファイルコンテキストが保持されます。ホームディレクトリにファイルを作成した場合は、ファイルを移動すると元のコンテキストが保持されます)。おそらくデフォルトのbin_t
コンテキストを使用する必要があります。デフォルトのコンテキストを復元するには、次の手順を実行します。
restorecon /usr/local/bin/loginformer.py
スクリプトがあまりにも特別な操作をしない場合は、コンテキストの前に配置してpam_exec
文字pam_selinux
列を再指定すると、問題を解決するのに十分です。