Я хочу написать небольшое приложение PHP для мониторинга журналов на сервере Debian, включая журналы системного журнала и сообщения Apache / PHP. Проблема здесь в том, что пользователь Apache (www-data) не имеет доступа к каталогу / var / log. Как лучше всего предоставить доступ к журналам для PHP-приложения? Предположим, что файлы журналов могут быть действительно большими, например, до сотен мегабайт.
Есть идеи:
Напишите сценарий оболочки, который будет запускаться через sudo, и последние 512 КБ журнала в конце журнала в отдельный файл, который может быть прочитан приложением - это неэффективно из-за разветвления нового процесса и необходимости дважды читать данные
Добавить www-данные в группу adm (которая может читать журналы) - это небезопасно
Каждую минуту запускать PHP-процесс через cron для чтения журналов - это не очень хорошо, потому что не позволяет осуществлять мониторинг в реальном времени. Кроме того, этот скрипт будет запускаться, даже если я не читаю журналы и потребляю процессорное время (сервер находится в облаке, и мне придется за него заплатить)
Создайте жесткую ссылку для всех файлов журнала с пониженными разрешениями - я думаю, это не сработает, потому что logrotate может воссоздать файлы журнала, и они изменят номер inode.
Запустите отдельный сервер nginx / Apache под привилегированным пользователем, который может читать журналы.
Может у кого есть решение получше?
Что ж, хотя исходному посту уже несколько месяцев, я хотел бы поделиться с вами своим подходом:
В моем случае я просто хочу отслеживать /var/log/mail.log. Поэтому я добавляю в / etc / sudoers следующую строку:
www-data ALL=(:adm) NOPASSWD:/bin/cat /var/log/mail.log
Это позволяет www-data запускать команду /bin/cat /var/log/mail.log
как участник группы адм.
В PHP я просто вызываю
$output = shell_exec('sudo -g adm cat /var/log/mail.log |/pipe/anywhere');
Надеюсь, этот подход будет кому-то полезен ...
Если вы считаете, что я упустил некоторые проблемы с безопасностью, оставьте комментарий
Я бы рекомендовал использовать rsyslogd для входа непосредственно в базу данных mysql, к которой можно получить доступ через php. Это поддерживаемая конфигурация rsyslog. Я считаю, что lenny + для debian rsyslog является системным журналом по умолчанию, поэтому ему нужно просто установить mysql, если его еще нет, настроить безопасность, настроить таблицы и настроить rsyslog.
http://www.rsyslog.com/doc/rsyslog_mysql.html
пример:
*.* :ommysql:database-server,database-name,database-userid,database-password
Надеюсь, это поможет вам.
Как намекает Пабло - файлы журнала не нужно записывать в / var / log. Их не нужно записывать на локальный компьютер - эти параметры можно настроить прямо из коробки. Проблема с использованием MySQL заключается в том, что ваша система ведения журнала внезапно становится очень сложной - и что происходит с записями журнала, вызываемыми, когда dbms не работает?
Вы можете сделать файлы доступными для чтения «другим» (а каталоги должны быть исполняемыми для других). Взгляните на страницу руководства для logrotate, чтобы узнать, как контролировать разрешения для файлов журнала.
Но процесс, который читает журналы, не обязательно должен запускаться с помощью apache uid. В самом деле, я бы порекомендовал запустить задание cron - или, предпочтительно, демон - как другой пользователь, чтобы читать журналы - и извлекать необходимую информацию в общий репозиторий.
С.