Logrotate больше не читает символьный файл конфигурации из-за отсутствия прав root


15

В настоящее время мы обновляем Ubuntu 12.04 LTS до 14.04 LTS на нашем ruby ​​на серверах приложений rails и заметили, что файлы журнала больше не вращаются.

На обеих машинах у нас есть файл /var/app-name/config/logrotate принадлежит нашему пользователю Unix deployer который содержит действительный файл logrotate следующим образом:

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

Это затем вставлено в /etc/logrotate.d/ каталог как app-name

На нашем сервере Ubuntu 12.04 у нас есть logrotate 3.7.8, который отлично работает. Это входит в var/app-name/log/ каталог и вращает все файлы журнала

Но на сервере Ubuntu 14.04 у нас есть logrotate 3.8.7, который не вращает файлы журнала для нашего приложения.

Когда я отлаживаю это через sudo logrotate -d -f /etc/logrotate/.conf Я получаю следующий вывод:

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

Вслед за этим в коде кажется, что это изменение было добавлено в поток релиза 3.8.x: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526

Если я изменю владельца файла, ссылка на который /var/app-name/config/logrotate в root затем он начинает работать снова. Но, учитывая, что этот файл является частью моего приложения и создан с помощью среды развертывания capistrano, которую мы используем в этом состоянии, я бы предпочел не менять владельца, если он работал нормально.

Итак, рекомендуются / поддерживаются ли файлы символьных ссылок в logrotate?

И если это так, если это отказ от использования моего файла (принадлежит deployer ) который является символом в /etc/logrotate.d каталог, будет рассматриваться как ошибка?

Или есть другой рекомендуемый подход для ротации журнала для конкретного приложения?

(также спросил на Unix StackExchange )


Хороший вопрос! Я вижу, что там было некоторое обсуждение позже о проверке имени пользователя «root» вместо uid == 0, но это также не вызвало вопроса, почему требуется владение root.
agtoever

Ответы:


6

Проблема в том, что файл конфигурации logrotate может работать любой команда от имени пользователя root (используя разделы prerotate / postrotate). Таким образом, вы бы эффективно deployer привилегии пользователя root, предоставляя ему доступ на запись к файлам в /etc/logrotate.d/, Так что нет, это не ошибка.

Если вы доверяете своему пользователю-установщику, то, я думаю, вы могли бы решить эту проблему, предоставив ему права sudo для копирования файлов в /etc/logrotate.d/, Разумеется, если предположить, что пользователь, выполняющий развертывание, не тот же пользователь, с которым работает веб-приложение.


Наш подход всегда заключался в том, чтобы отдавать предпочтение символической ссылке из каталогов, внешних по отношению к приложению, в файлы приложения, так что каждое развертывание не только выталкивает новое приложение, но и любые изменения файла конфигурации. Даже предоставление развертывателю прав на развертывание кода за пределами каталога приложения нарушает этот подход, но в равной степени необходимость разбивать файл приложения на права после развертывания ощущается как плохая вещь (tm). Возможно, оригинальный подход больше не может хорошо работать с logrotate 3.8.0+
phantomwhale

2
@phantomwhale Ваш оригинальный подход неявным образом предоставил пользователю развертывания полные привилегии суперпользователя. Это не ново в logrotate 3.8. Если вы хотите ограничить права развертывателя, в то же время позволяя ему обновлять конфигурацию, то я думаю, что вам нужно использовать что-то другое, чем logrotate.
pelle

2

Я понимаю, что немного опаздываю на вечеринку, но у меня была похожая проблема, и я решил поделиться своим решением.

Мои проблемы начались, когда logrotate не будет читать конфигурацию, которую я написал. Я не хотел развертывать новые конфигурации в папке, принадлежащей пользователю root, потому что я не хотел, чтобы у пользователя развертывания был доступ к root что-нибудь ,

Сначала я попытался запустить logrotate как пользователь развертывания, но он пожаловался на доступ к файлу состояния в /var/lib/logrotate/state, Затем я прочитал справочную страницу. Вы можете указать файл состояния, который logrotate использует! Таким образом, мне показалось лучшим решением настроить ежедневный cron для выполнения logrotate как пользователь развертывания с пользовательским файлом состояния. Таким образом, пользователю или приложению не требуется root-доступ.

Вот как вы указываете файл состояния:

logrotate --state /path/to/status /path/to/custom_logrotate.conf

Теперь вы можете запустить logrotate как любой пользователь и владелец конфигурации, который вам нравится!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.