SELinux + logrotate + prerotate = 権限が拒否されました

SELinux + logrotate + prerotate = 権限が拒否されました

私はかなり簡単な作業を行う必要があります。カスタムログファイルセットを一晩データベースに移行することです。

単純な事前回転操作にはlogrotate(cron.daily)を使用します。

/var/log/myapplog/*.log
{
    daily
    copytruncate
    rotate 366
    dateext
    dateformat .%Y-%m-%d
    compress
    missingok
    compresscmd /usr/bin/xz
    compressoptions -ze9
    compressext .xz
    prerotate
        /usr/local/myapp/bin/DBWriter $1
    endscript
}

残念ながらSELinuxはそうは思わない。これでsetenforce 0スクリプトが完全に実行されます。ログを回転してデータベースに送信するなどの操作を実行します setenforce 1が、次のように返します。

logrotate_script: line 1: /usr/local/myapp/bin/DBWriter: Permission denied

最近設定したDBWriterのコンテキストを変更してみましたが、unconfined_u:unconfined_r:unconfined_t動作しません。

理想的には、SELinuxを有効にしておく必要があります。重要な場合、DBWriter は java .jar ファイルとしても使用できます。しかし、走るjava -jar DBWriter.jar結果は同じです。

よろしくお願いします!


編集:Win.Tの下の答えで私の問題を修正しました。

semanage permissive -a logrotate_t

問題の一部は私がやろうとしていることです正確にSELinuxは、以下を防止するように設計されています。プロセスAは不明なファイルBを実行し、システムCに混乱を招きます。

プロジェクト設計の考慮事項と制約により、私たちはこの道を選びました。

顧客は、常にセキュリティや将来の保証などのカラフルな流行語を聞きたくはありません。

答え1

ビュー/var/log/messages/var/log/audit/audit.log(実行中の場合auditd)。また、これを使用してaudit2allowSELinuxエラーメッセージと考えられる解決策を確認することもできます。

また、semanage permissive -a logrotate_tSELinuxで拒否せずにlogrotateを実行できるようにしてください。

答え2

SELinuxかどうかわからない場合は、まずSELinux forceを一時的に無効にしてみてください。sudo setenforce 0 SELinuxリファレンスそして失敗したコードを実行してください。 SELinuxなら読んでください..

私は最近この問題に直面し、SELinuxに初めて触れたので、これは私にとって学習曲線でした。chmod&(DAC)を使用する標準のposixモード権限とは異なり、chownSELinux権限はより詳細です。場合によっては、TCP / 443を介したインターネット接続などの特定の操作を拒否したり、呼び出し元(アプリケーション)に応じて/ fooおよび/ barへの書き込みを許可したり、他の操作は許可しません。

ls -Zファイル(MAC)必須アクセス制御権限またはユーザーを表示するには、id -Z次の出力形式を使用しますuser:role:type:level

Centos7では、ログファイルを回転させる前にアップロードする事前回転スクリプトを含むlogrotate.d confファイルのスクリプトを呼び出しました。私は/var/log/audit/audit.log何度も拒否(ログイン)しました。インストールする特定のポリシーパッケージを作成するために使用できるツールがあることを理解してください。コード用の.rpmパッケージを生成するので、インストール中にポリシーパッケージを作成してインストールするために、.specファイルに次の手順をすべて追加します。

何が必要です:policycoreutils-python、checkpolicy(インストール可能)

私が理解したのは、このセキュリティポリシーを展開する予定であれば、* .teファイルを転送してその場所でポリシーを作成するだけでよいと思います。したがって、ポリシーが依存する定義が更新されると、その定義は更新されます。インストール時に継承されます。

#拒否メッセージを探す

watch "tail /var/log/audit/audit.log | grep 'denied'"

# te (タイプ適用) ファイルの生成 (人が読めるセキュリティポリシー)

grep 1561055176.928:11371 /var/log/audit/audit.log|audit2allow -m myapp > myapp.te

#いくつかの失敗を特定して、すべてaudit2allowにパイプすることもできます。

cat /var/log/audit/audit.log | grep logrotate | audit2allow -m myapp > myapp.te

#audit2whyを使用して、回復手順が時々失敗する理由を説明することもできます。

cat /var/log/audit/audit.log | grep logrotate | audit2why

警告するこの段階で、私はスクリプトを実行するとうまくいくとaudit2whyが報告したことを発見しましたsetsebool -P nis_enabled 1。聞くにはいいけど、いつもこれらのコマンドの実行がセキュリティに与える影響を見つけてください。これを設定すると攻撃面が増加する可能性があるため、ユーザーは注意する必要があります。

# タイプ適用ファイルからポリシーモジュールを構築する

checkmodule -M -m -o myapp.mod myapp.te

#ポリシーモジュールでポリシーパッケージを構築する

semodule_package -o myapp.pp -m myapp.mod

#ポリシーパッケージをロードするには、root権限を使用します。

semodule -i myapp.pp

コードを実行するために必要なすべての小さな権限を蓄積するまで、この手順を何度も実行する必要がありました。

- 更新 -

logrotate cron操作の前にスクリプトインラインを実行してlogrotate_tの権限を拡張する必要はありませんでした。失敗したときにファイルを回転したくないので、事前回転に入れましたが、この構文は依然としてその要件を満たしています。 "&&"構文を使用すると、最初のコマンドが失敗した場合、2番目のコマンドは実行されません。

10 * * * * root /usr/bin/sudo -i -u otheruser /opt/send_logs.sh && /usr/sbin/logrotate -f /path/to/myapp_logrotate.conf > /tmp/myapp_rotate.log 2&1

関連情報