Назад | Перейти на главную страницу

Скажите Apache создать error.log / access.log от имени другого пользователя

Если вы укажете Apache использовать файлы CustomLog, Apache2 создаст эти файлы при запуске. И он всегда передает их пользователю root: root. Как я могу изменить этот поведение?

Задний план

Apache работает с

SuexecUserGroup www-data www-data

и в то же время я использую CustomLog, который передает его вывод в сценарий. Сценарий удаляет два байта из IP и затем записывает в файл журнала. Поскольку вы не можете указать Apache исключить IP-адрес из error.log, этот конвейерный вывод важен (в отношении немецкого закона о конфиденциальности).

Сценарий не может получить доступ к моему настраиваемому журналу, если он не принадлежит www-data.

Если я меняю владельца, все работает нормально.

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

Однако, если я остановлю процесс Apache, удалю файлы журнала, а затем перезапущу процесс Apache, будут созданы новые файлы с правами root: root.

Как я могу сказать Apache создать новые, пустые файлы как / для www-data на старте?

Это предложение:

Скрипт не может получить доступ к моему пользовательскому журналу, если он не принадлежит www-data.

Находится в прямом противоречии с http://httpd.apache.org/docs/current/logs.html#piped:

Транслируемые процессы журналов порождаются родительским процессом Apache httpd и наследуют идентификатор пользователя этого процесса. Это означает, что программы конвейерного журнала обычно запускаются от имени пользователя root. Поэтому очень важно, чтобы программы были простыми и безопасными.

Если описанный вами сценарий в чем-то верен, вы все равно можете обойти проблему,

  1. Игнорирование имени файла журнала, указанного в файле конфигурации
  2. Придумайте собственное имя файла журнала в сценарии
  3. Перенаправление stdout в файл по вашему выбору, как в (2)

Я столкнулся с той же проблемой, но, не имея возможности изменить сценарий, который записывает журнал, я мог изменить сценарий, который его интерпретировал.

Настроить:

  1. Apache запускается и создает файлы журнала как root:root вместо того www-data:www-data. Это из-за ситуации, упомянутой в вопросе OP.
  2. Я хочу запустить сценарий анализа в файле журнала как пользователь без полномочий root (www-data), но он не может прочитать файл. Я делаю это как cron от корней crontab
  3. Поэтому перед запуском сценария анализа я запускаю (как root) команда chown www-data:www-data /var/log/apache2/*.log. Это изменяет владельца файлов журнала (но не родительского каталога) на www-data как и предполагалось, и сценарий анализа сможет прочитать файл.

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

gpjod упоминает что это может быть проблема безопасности. Документация Apache говорит, что каталог для журналов не должен быть доступен для записи другим пользователям.

Это верно, но, скорее всего, верно для всех ситуаций, которые решают вопрос о OP, и вы можете прочитать советы по безопасности в связанной документации. Поскольку в этом конкретном случае право собственности изменилось с root к www-data как и задумано (см. исходный вопрос), я не вижу дополнительных потоков, связанных с моим решением.