私はユーザーがログインするたびに(ssh、gdm、またはttyを介して)私に知らせるようにコンピュータを設定しようとしています。次に、sshdを設定して次に追加します/etc/pam.d/sshd
。
session optional pam_exec.so /etc/pam_scripts/notify.sh
何らかの理由でコマンドが失敗しても ssh でログインしたいので、これはオプションです。
まず:この行を配置しました。後ろに pam_selinux close
そして今後 pam_selinux open
、ようにここで提案。
whoami
スクリプトにaを配置して実行, I can see that the command is run as
ルートを記録すると、具体的には次のようになります。
uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:sshd_t:s0-s0:c0.c1023
問題は、ログを見ると、selinuxがcurl
内部で使用されているスクリプトの実行をブロックすることがわかるということです。
AVC avc: denied { name_connect } for pid=1810 comm="curl" dest=443 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
私のスクリプトには次のタグがあります。
unconfined_u:object_r:etc_t:s0
Change contextを試しましたが、chcon
常に権限が拒否されました(rootを使用しても)。それで、おそらく私が完全に理解していないことをしているようです。
ところで、私もseteuid
pamルールを使ってみましたが、何も変わりませんでした。
通常、selinuxが実行アクセスを許可するために必要なスクリプトコンテキストを決定する方法を理解していません。
また、スクリプトはうまく実行されますが、selinuxはカールを停止するため、スクリプト自体よりもカールに関連しているようです。
この問題をどのように解決できますか?
答え1
すでに答えを見つけましたが、この問題を解決しているので、子孫のためにここに残しておきます。
これらの selinux 拒否が発生した場合は、このaudit2allow
ツールを使用して、その操作を許可する更新された selinux ポリシーを作成できます。まず、selinuxを許可モードに切り替えることができます。
setenforce 0
ログインして、PAM設定が期待どおりに機能していることを確認してください。私たちはその可能性が非常に高いので、これを行います。追加selinuxは最初の後に拒否され、許可モードで実行するとすべて記録されます。
これで selinux を強制モードに戻すことができます。
setenforce 1
ランニングaudit2allow -a
。これにより、次の内容が生成されます。
#============= sshd_t ==============
#!!!! This avc can be allowed using one of the these booleans:
# authlogin_yubikey, nis_enabled
allow sshd_t http_port_t:tcp_socket name_connect;
私が「いいね」と言ったのは、(a)以前に述べたように、現在のPAM設定に関連する他の拒否がある可能性があり、(b)このコマンドは監査ログのすべてのエントリを確認するため、以前の拒否結果を取得できるためです。 。実際、現在の問題とは関係ありません。
この場合、既存の selinux ブール値を設定すると、拒否された操作を許可できることがわかります。それは次のとおりです。
setsebool nis_enabled=1
これがあなたに必要な場合があります。または、次のようにselinuxポリシーの更新を作成できます。
audit2allow -a -M local
これにより、新しいポリシーファイルが作成されますlocal.pp
。次のコマンドを実行してアクティブにできます。
semodule -i local.pp
selinuxの使用に関する良い情報があります。ここ、より詳細な使用法の概要が含まれていますaudit2allow
。
答え2
まあ、少し時間がかかりましたが、問題を解決できました。私の問題は、素晴らしい記事を読んだ後でもselinuxのルールをチェックする方法がわからないということです。Gentoo SELinuxチュートリアル以下を使用してルールを照会する方法を見つけましたsesearch
。
# sesearch --allow -s sshd_t -t unreserved_port_t -c tcp_socket -p name_connect
この場合、通知スクリプトを既知のポートから任意のポートに切り替えたため、監査ログで報告された宛先ではなく宛先unresolved_port_t
タイプでhttp_port_t
検索されました。
リストには次の規則があります。
allow sshd_t unreserved_port_t:tcp_socket name_connect; [ nis_enabled ]:True
これは許可されますが、booleanの影響を受け、nis_enabled
実際に私のシステムでは(検査によってgetsebool -a | grep nis_enable
)無効になっています。
このルールを一度有効にしましたが、setsebool nis_enabled on
今は正常に動作しています。