web-dev-qa-db-ja.com

ユーザー空間プログラムはどこにログを保存することになっていますか?

特権なしで実行したいスクリプトを書いています。スクリプトで発生したエラーをログファイルに記録します。 /var/logに書き込む権限がありません。そして、私は自分のホームディレクトリにそれを置きたくありません。

ユーザースペーススクリプトがランタイム情報を記録する場所はありますか?潜在的なセキュリティ問題を発生させずにスクリプトログ情報を/var/logに送信するためのベストプラクティスは何ですか?スクリプトにuid/gidを設定するのをためらっています。

29
Lord Loh.

通常のユーザーとして/ var/logに書き込むことはできませんが、必要に応じてsyslogデーモンがそれを行います。メッセージを標準のシステムログ(/var/log/syslogなど)に記録する場合は、4.4BSDユーティリティloggerがシステムで使用できる可能性があります。 Debianにデフォルトでインストールされ、Debian派生物のbsdutilsパッケージに含まれています。

システムログをreadするための権限を必要とするデメリットとともに、既存のログローテーション、メンテナンス、モニタリングツールのメリットを利用できます。スクリプトのメッセージを他のプログラムからのメッセージと混在させること。

$ logger Hello
$ echo Goodbye | logger
$ Sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-Host jander: Hello
Feb 19 21:16:21 debian-Host logger: Goodbye

使用可能な構成オプションがいくつかあります。詳しくは、man loggerをご覧ください。

10
Jander

一般ユーザーがプログラムを実行することにした場合、そのログの通常の場所はホームディレクトリです。ホームディレクトリは、実行するプログラムのログであれ、その他のファイルであれ、すべてのファイルを格納するためのものです。

プログラムがシステムの一部として実行され、通常は専用のシステムユーザーとして実行されている場合、そのログの自然な場所は_/var/log_です。サブディレクトリ_/var/log/myapp_を作成し、適切な権限を付与して、アプリケーションがそこに書き込むことができるようにします。

該当し、オペレーティングシステムで許可されている場合は、ログファイルを追加専用としてマークします。 rootだけがこれを行うことができます。これには、アプリケーションが侵害された場合、過去のログを消去できないという利点があります。これは、侵害のフォレンジック分析に非常に役立ちます。ログをローテーションするには、ルートの介入が必要です:chownログファイルをアプリケーションで開くことができないようにするrenameログファイル、適切な新しい追加専用ファイルを作成します所有権を取得してから、アプリケーションに新しい空のファイルを開くよう通知します。

logger(1) または syslog(3) を呼び出すことで、システムログにアプリケーションログを作成できます。

一般に、デーモンの場合、ログファイルはrootによって作成され、権限のないユーザーが書き込みできるように権限が変更されます。次に、ローテーション中に権限を保持するようにlogrotateを設定します。

デーモンではなくコマンドの場合は、/tmp(できればmktempを使用)し、STDOUTを介してログの場所をユーザーに通知します。

4
bahamat

ユーザー空間プログラムはデフォルトでログを破棄することが期待されているという印象を受けています。さまざまなプログラムが好きな場所でログをダンプするのを見てきましたが、私のシステムでは特に歓迎されません。巨大になるまで/気づかれない限り気づかない場所に蓄積する傾向があります。

彼らのための明確な場所があれば私は好むだろう、私は彼らのために安定した場所を見つけようとして私のシステムで遊んでいる。

私の最初のアイデアは/var/run/user/$UID/logですが、私のシステムでは、それはTMPFSマウントであり、十分に大きくないか、ログでの使用に本当に適していることがわかりました。

彼らのための場所を作る

/ var/run/userを十分に理解できないため、ユーザー1000のために手動でエミュレートすることにしました。

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

このフォルダー内の構造については FHS/var/log spc を使用することをお勧めしますが、仕様は自由形式であるため、準拠する必要はありません。

Logrotate Config

システムが提供するこのディレクトリには既存のログローテーションはありません。システム用にログローテーションを作成することをお勧めします。

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

以下は私の以前の/ var/run/user/1000/logの投稿ですが、あなたが本当に何をしているかを知らない限り、私はそれをお勧めすることはできません。

たぶん次のようになりますが、私にはそれが理にかなっているので、私はこれを単に作りました。

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

/ var/log/user/1000と統合:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log
3
ThorSummoner