Если вы укажете 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. Поэтому очень важно, чтобы программы были простыми и безопасными.
Если описанный вами сценарий в чем-то верен, вы все равно можете обойти проблему,
Я столкнулся с той же проблемой, но, не имея возможности изменить сценарий, который записывает журнал, я мог изменить сценарий, который его интерпретировал.
Настроить:
root:root
вместо того www-data:www-data
. Это из-за ситуации, упомянутой в вопросе OP.www-data
), но он не может прочитать файл. Я делаю это как cron от корней crontabroot
) команда chown www-data:www-data /var/log/apache2/*.log
. Это изменяет владельца файлов журнала (но не родительского каталога) на www-data
как и предполагалось, и сценарий анализа сможет прочитать файл.Не самое хорошее решение и определенно не то, что вам нужно на загруженном сервере, но на небольшой установке его вполне достаточно.
gpjod упоминает что это может быть проблема безопасности. Документация Apache говорит, что каталог для журналов не должен быть доступен для записи другим пользователям.
Это верно, но, скорее всего, верно для всех ситуаций, которые решают вопрос о OP, и вы можете прочитать советы по безопасности в связанной документации. Поскольку в этом конкретном случае право собственности изменилось с root
к www-data
как и задумано (см. исходный вопрос), я не вижу дополнительных потоков, связанных с моим решением.