スティッキービットを付けたログディレクトリにいろいろな uid のプロセスからログを書き込みできるようにしたくて mkdir -m 1777 /var/log/oreore
みたいなディレクトリのログを logrotate しよとしたところ、次のようなエラーになりました。
error: skipping "/var/log/oreore/ore.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
root 以外のグループが書込み可能なディレクトリなディレクトリでは su
を使用する必要があるとのことです。
logrotate のそれっぽいところを見てみると・・・
/* Check if parent directory of this log has safe permissions */
if ((log->flags & LOG_FLAG_SU) == 0 && getuid() == 0) {
char *ld = ourDirName(log->files[logNum]);
if (stat(ld, &sb)) {
/* If parent directory doesn't exist, it's not real error
and rotation is not needed */
if (errno != ENOENT) {
message(MESS_ERROR, "stat of %s failed: %s\n", ld,
strerror(errno));
free(ld);
return 1;
}
free(ld);
return 0;
}
/* Don't rotate in directories writable by others or group which is not "root" */
if ((sb.st_gid != 0 && sb.st_mode & S_IWGRP) || sb.st_mode & S_IWOTH) {
message(MESS_ERROR, "skipping \"%s\" because parent directory has insecure permissions"
" (It's world writable or writable by group which is not \"root\")"
" Set \"su\" directive in config file to tell logrotate which user/group"
" should be used for rotation.\n"
,log->files[logNum]);
free(ld);
return 1;
}
free(ld);
}
log->flags & LOG_FLAG_SU
は su
オプションが指定されているかどうか、つまり、
-
su
が未指定で - logrotate が root で実行されていて
- ディレクトリが
gid != root && g+w
またはo+w
だとエラーになります。
下記のように su しておけば黙らせられます。
/var/log/oreore/*.log {
su root root
}