web-dev-qa-db-ja.com

SELinux:プロセスが特定のディレクトリに任意のファイルを作成できるようにする

呼び出されると、dmesgの内容がファイルに書き込まれるスクリプトがあります。ファイルの名前は基本的にタイムスタンプです。 SELinuxはこれを防ぎます。 FedoraのSELinuxトラブルシューティングアプリのアドバイスに従って、私は次のことを試しました。

grep dmesg /var/log/audit/audit.log | audit2allow -M mypol

semodule -i mypol.pp

ただし、これは機能していないようです。おそらく、作成するファイルの名前が毎回異なるためです。では、dmesgが特定のディレクトリに任意のファイルを作成(および書き込み)できるようにSELinuxに指示するにはどうすればよいですか?または、問題のスクリプト(およびそれが生成するすべてのプロセス)がそれを実行できることを伝えますか?

4
Matthew Cline

AVC拒否をフィルタリングする方法と、特定のアクション(この場合はスクリプト)へのアクセスを許可するカスタムポリシーモジュールを作成する方法を学ぶ必要があります。

上に挿入したモジュールを削除することから始めて、新たに開始します。

_# semodule -r mymodule.pp
_

その後、スクリプトを実行します。

_# date && ./my_script.sh
_

date呼び出しは、タイムスタンプに基づいてAVC拒否をフィルタリングするのに役立ちます。

次に、通常の方法を使用してAVC拒否をデバッグします。これは、ausearch(8)コマンドを使用します。

_# ausearch -m avc -ts $timestamp | audit2allow
_

使用できるスイッチの詳細、特に_-ts_フラグについては、マンページを確認してください。

この情報を使用すると、既存のポリシーに基づいて何が拒否されているかがわかります。

ここで、このアクセスを許可するかどうかを決定する必要があります。アクセスを許可するとします。付与するアクセスを定義するルールを記述したカスタムポリシーモジュールを作成する必要があります。これは、スクリプトの複雑さに応じて、多かれ少なかれ単純です。

_# ausearch -m avc -ts 10:40:00 | audit2allow -m my_script > my_script.te
_

これにより、_type enforcement_の説明が生成されます。

コードのレビューに進んでコードが正しいことを確認し、_type enforcement_コードをmoduleにコンパイルする必要があります。

_# checkmodule -M -m -o my_script.mod my_script.te
_

モジュールを自由にロードおよびアンロードできるようにするには、モジュールを_policy package_にパッケージ化する必要があります。

_# semodule_package -o my_script.pp -m my_script.mod
_

これで、次を使用してポリシーをロードできます。

_# semodule -i my_script.pp
_

正しくロードされていることを確認してください。

_# semodule -l | grep my_script
_

次に、拒否を再度トリガーして、この同じプロセスに関する監査ログにさらに(異なる)アラートがあるかどうかを確認します。

_type enforcement_コードのそれ以降のエディションでは、version(_1.0_)を更新する必要があります。そうしないと、パッケージのロードが失敗します。コンパイルおよびパッケージ化されると、_policy package_の更新が完了します。

_# semodule -u my_script.pp
_

SELinuxを始めるときに学ぶべきことがたくさんあります。いくつかの有用な参考文献:

  • コマンドのマンページ。
  • _apropos selinux_の出力も確認してください。

RHELドキュメントから

Dave Quigleyによる優れた紹介プレゼンテーション:

1
dawud

semanage permissive -a dmesg_tを実行できます。次に、タイプが/bin/dmesgであるdmesg_tは、許容モードで実行されます。アクセスは許可されますが、SELinuxは引き続きAVCメッセージを生成します。

1
jdh8