バグ #77
未完了Redmineのログがlogrotateされない
説明
Redmineのログ(/var/lib/redmine/log/production.log)が、logrotate対象に設定しても
ログローテーションされない。
/var/log/audit/audit.logを確認したら次のメッセージが記録されていた。
type=AVC msg=audit(1517256361.226:212391): avc: denied { read } for pid=18562 comm="logrotate" name="redmine" dev=vda3 ino=6815801 scontext=system_u:system_r :logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:var_lib_t:s0 tclass=l nk_file
高橋 徹 さんが約7年前に更新
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
audit.logを読み解くと
- logrotateプロセスのSELinuxコンテキストは
system_u system_r logrotate_t
- /var/lib/redmine/log/production.logふぁいるのSELinuxコンテキストは
unconfined_u object_r var_lib_t
ここで、通常logrotate対象のログファイルが置かれている/var/logディレクトリ以下のログファイルのSELinuxコンテキストを調べてみると、var_log_t
が付いているものが多い。
解決方針案として、/var/lib/remdine/log/ディレクトリ下のファイルに対して var_log_t コンテキストを永続的に付与する方法がありそうだ。
他には、logrotate_tのプロセスからvar_lib_tのファイルにアクセスできるようにするか・・・。
semanageでディレクトリ・ファイルにコンテキストを追加する。
$ sudo semanage fcontext -a -t var_log_t '/var/lib/redmine/log(/.*)?'
この設定は次のファイルに記載される。
- /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage # Do not edit directly. /var/lib/git(/.*)? system_u:object_r:httpd_git_rw_content_t:s0 /var/lib/git/[^/]+/hooks(/.*)? system_u:object_r:httpd_git_script_exec_t:s0 /var/lib/redmine/log(/.*)? system_u:object_r:var_log_t:s0
次に既存のディレクトリ・ファイルにコンテキストを設定する。
$ sudo restorecon -Frvv /var/lib/redmine/log restorecon reset /var/lib/redmine-3.4-stable/log context unconfined_u:object_r:var_lib_t:s0->system_u:object_r:var_lib_t:s0 restorecon reset /var/lib/redmine-3.4-stable/log/unicorn.stdout.log context unconfined_u:object_r:var_lib_t:s0->system_u:object_r:var_lib_t:s0 restorecon reset /var/lib/redmine-3.4-stable/log/unicorn.stderr.log context unconfined_u:object_r:var_lib_t:s0->system_u:object_r:var_lib_t:s0 restorecon reset /var/lib/redmine-3.4-stable/log/delete.me context unconfined_u:object_r:var_lib_t:s0->system_u:object_r:var_lib_t:s0 restorecon reset /var/lib/redmine-3.4-stable/log/production.log context unconfined_u:object_r:var_lib_t:s0->system_u:object_r:var_lib_t:s0
うーむ、本来はvar_log_tが設定されるはずが、var_lib_tとなっている。また、対象ファイルがシンボリックリンク先の実体になっているのも気になる・・・。
要調査
高橋 徹 さんが約7年前に更新
試み1
semanageで指定するパスをワイルドカード指定してみる。
$ sudo semanage fcontext -d '/var/lib/redmine/log(/.*)?' $ sudo semanage fcontext -a -t var_log_t '/var/lib/redmine.*/log(/.*)?' $ sudo restorecon -Frvv /var/lib/redmine :
/var/lib/redmine/log のコンテキストは
ls -Z -rw-rw-r--. redmine redmine system_u:object_r:var_log_t:s0 delete.me -rw-rw-r--. redmine redmine system_u:object_r:var_log_t:s0 production.log -rw-r--r--. root root system_u:object_r:var_log_t:s0 unicorn.stderr.log -rw-r--r--. root root system_u:object_r:var_log_t:s0 unicorn.stdout.log
と var_log_tが付いた。
高橋 徹 さんが約7年前に更新
まだ解決せず。audit.logには
type=AVC msg=audit(1519497002.867:238973): avc: denied { read } for pid=16531 comm="logrotate" name="redmine" dev=vda3 ino=6815801 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:var_lib_t:s0 tclass=lnk_file
とある(日時は2018-02-25T03:30+09:00)。
/var/lib/redmine のコンテキストは、たしかに var_log_t はついていない。
そこで、次を実行して様子を見ることにする。
$ sudo semanage fcontext -a -t var_log_t '/var/lib/redmine' $ sudo restorecon -Frvv /var/lib/redmine :
高橋 徹 さんが約7年前に更新
- ステータス を 解決 から フィードバック に変更
- 進捗率 を 80 から 50 に変更
Redmineの画像がダウンロードできなくなってしまった。
Wikiなどで画像は表示されるが、画像をクリックしダウンロードしようとするとエラー(403)になる。
redmineのログ上は、正常に完了(200)している。
Started GET "/attachments/download/624/idea_start-1.png" for 127.0.0.1 at 2018-02-27 21:13:01 +0900 Processing by AttachmentsController#download as HTML Parameters: {"id"=>"624", "filename"=>"idea_start-1.png"} Current user: torutk (id=3) Sent file /var/lib/redmine-3.4-stable/files/2017/06/170611005222_idea_start-1.png (0.1ms) Completed 200 OK in 17ms (ActiveRecord: 5.1ms)
nginxのログを見ると、
2018/02/27 21:13:02 [error] 12926#12926: *7978595 open() "/var/lib/redmine/files /2017/06/170611005222_idea_start-1.png" failed (13: Permission denied), client: 116.0.158.34, server: www.torutk.com, request: "GET /attachments/download/624/id ea_start-1.png HTTP/1.1", upstream: "http://unix:/tmp/unicorn_redmine.sock/attac hments/download/624/idea_start-1.png", host: "www.torutk.com", referrer: "http:/ /www.torutk.com/attachments/624"
と、エラーになっている。
他にも多数のファイルがnginxでエラーになっているので、今回の処置は「まずい」。
高橋 徹 さんが約7年前に更新
- ステータス を フィードバック から 進行中 に変更
タイプ var_log_t の設定を削除することとします。
/etc/selinux/targetd/contexts/files/file_contexts.local には、今回の設定で次が追加されている。
/var/lib/redmine.*/log(/.*)? system_u:object_r:var_log_t:s0 /var/lib/redmine system_u:object_r:var_log_t:s0
まず、これを削除する。
$ sudo semanage fcontext -d /var/lib/redmine $ sudo semanage fcontext -d '/var/lib/redmine.*/log(/.*)?' $ sudo restorecon -Frvv /var/lib/redmine
これで画像のサムネイルから原寸表示、画像のダウンロードなどができるようになりました。
logrotateの問題は再度取り組みとします。
高橋 徹 さんが約7年前に更新
SELinuxの観点では、logrotated (logrotate_tドメイン)は /var/log以下(var_log_tタイプ)へアクセスするポリシーなので、redmineのログを、これまでの /var/lib/redmine/log から /var/log/redmine に移動させるのが楽と思われる。
まず、/var/log/redmine/ を作成し、次に /var/lib/redmine/log/* を、/var/log/redmine/に移動した。
/etc/logrotate.d/redmineを次のように修正
- /var/lib/redmine/log/*log {
+ /var/log/redmine/*log {
missingok
notifempty
copytruncate
compress
su redmine redmine
}
しばし様子見
高橋 徹 さんが約7年前に更新
logrotateを手動実行する方法
デバッグ
logrotate -fd /etc/logrotate.d/redmine
実行
logrotate -f /etc/logrotate.d/redmine
デバッグでは詳細なメッセージが出る。見てみると、エラーが出ていた。
error: /etc/logrotate.d/redmine:6 unknown option 'su' -- ignoring line error: /etc/logrotate.d/redmine:6 unexpected text
logrotate に suオプションが追加されたのはバージョン3.8以降。
CentOS 6.9のlogrotateは、バージョン3.78と僅かに足りず。