特権なしで実行したいスクリプトを書いています。スクリプトで発生したエラーをログファイルに記録します。 /var/log
に書き込む権限がありません。そして、私は自分のホームディレクトリにそれを置きたくありません。
ユーザースペーススクリプトがランタイム情報を記録する場所はありますか?潜在的なセキュリティ問題を発生させずにスクリプトログ情報を/var/log
に送信するためのベストプラクティスは何ですか?スクリプトにuid/gidを設定するのをためらっています。
通常のユーザーとして/ 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
をご覧ください。
一般ユーザーがプログラムを実行することにした場合、そのログの通常の場所はホームディレクトリです。ホームディレクトリは、実行するプログラムのログであれ、その他のファイルであれ、すべてのファイルを格納するためのものです。
プログラムがシステムの一部として実行され、通常は専用のシステムユーザーとして実行されている場合、そのログの自然な場所は_/var/log
_です。サブディレクトリ_/var/log/myapp
_を作成し、適切な権限を付与して、アプリケーションがそこに書き込むことができるようにします。
該当し、オペレーティングシステムで許可されている場合は、ログファイルを追加専用としてマークします。 rootだけがこれを行うことができます。これには、アプリケーションが侵害された場合、過去のログを消去できないという利点があります。これは、侵害のフォレンジック分析に非常に役立ちます。ログをローテーションするには、ルートの介入が必要です:chown
ログファイルをアプリケーションで開くことができないようにするrename
ログファイル、適切な新しい追加専用ファイルを作成します所有権を取得してから、アプリケーションに新しい空のファイルを開くよう通知します。
一般に、デーモンの場合、ログファイルはroot
によって作成され、権限のないユーザーが書き込みできるように権限が変更されます。次に、ローテーション中に権限を保持するようにlogrotate
を設定します。
デーモンではなくコマンドの場合は、/tmp
(できればmktemp
を使用)し、STDOUT
を介してログの場所をユーザーに通知します。
ユーザー空間プログラムはデフォルトでログを破棄することが期待されているという印象を受けています。さまざまなプログラムが好きな場所でログをダンプするのを見てきましたが、私のシステムでは特に歓迎されません。巨大になるまで/気づかれない限り気づかない場所に蓄積する傾向があります。
彼らのための明確な場所があれば私は好むだろう、私は彼らのために安定した場所を見つけようとして私のシステムで遊んでいる。
私の最初のアイデアは/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 を使用することをお勧めしますが、仕様は自由形式であるため、準拠する必要はありません。
システムが提供するこのディレクトリには既存のログローテーションはありません。システム用にログローテーションを作成することをお勧めします。
# /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