Debian.pro

Про Debian


Большой Мануал, часть 25: логгируем вызовы mail() из php.

Эта статья — часть Большого Мануала по настройке lamp-сервера на debian.

Предыдущая часть цикла — Боремся с вирусней на сайтах.

Следующая часть цикла — Not yet published


Исторически большая часть вирусни для php занимается именно тем, что шлёт спам. Навскидку я бы оценил количество этой вирусни в половину от всей. Поэтому логгирование вызовов mail() сильно сокращает время на поиск активной части вирусни. Да и просто для дебага «почему письмо не шлется» удобно. Тем более, что в php с версии 5.3 всё же прикрутили неплохое логгирование, которое указывает конкретный php-файл и строчку, где был вызов.

Но, сами понимаете, если бы всё было просто, статью писать я бы не стал. Лог-то прекрасно пишется, если просто включить настройку mail.log, но пишется он от имени пользователя, под которым запущен сам скрипт (соответственно, под апачем скорее всего www-data). А если каждый сайт под своим пользователем? Соответственно, все мануалы пестрят чем-то вроде «создайте файл /var/log/php-mail.log, сделайте chmod 777″. В принципе, незачем читать его кому-либо, кроме рута и группы adm, как это принято для всех логов, куда может попасть приватная инфа.

Поэтому отправлять лог мы будем не в файл, а в syslog. Что характерно, официальная документация на php.net об этом не напоминает, да и вообще пришлось поискать, как такое сделать (сначала я пытался сделать mail.log = /dev/log). В итоге, конечно, ничего сложного.

Сначала создаём каталог и файл для лога (вообще каталог не обязательно, я для аккуратности):

root@server:~# mkdir /var/log/php-mail/; chown root:adm /var/log/php-mail/; chmod 750 /var/log/php-mail/
root@server:~# touch /var/log/php-mail/mail.log; chown root:adm /var/log/php-mail/mail.log; chmod 640 /var/log/php-mail/mail.log

Далее заводим ini-файл для php, который включит логгирование (я пишу пример для apache, для fpm/cli просто положите по аналогии в соответствующие каталоги). Для php 5.X в debian файл следует поместить в /etc/php5/apache2/conf.d/90-mail-log.ini, для php7.0 — в /etc/php/7.0/apache2/conf.d/90-mail-log.ini, для 7.2 (если у вас пакет от Ondrej) — в /etc/php/7.2/apache2/conf.d/90-mail-log.ini
Содержимое файла (можете, в принципе, вписать в сам php.ini, но это не всегда удобно):

mail.log = syslog

Далее настраиваем rsyslog (он стоит по умолчанию в debian, для остальных сами гляньте, как откладывать в файл строчки по вхождению), чтобы нужная нам информация попадала в отдельный лог. Кстати, сойдёт за пример, как писать отдельный лог для любых строчек с каким-либо вхождением (в данном случае — «mail()»). Например, в файл /etc/rsyslog.d/99-php-maillog.conf

:msg, contains, "mail() " /var/log/php-mail/mail.log
& ~

Почти всё, остаётся только написать конфиг для logrotate, чтобы случайно не забить всё место. Ротировать будем при достижении файлом определенного размера (size 100M). Пишем, например, в /etc/logrotate.d/php-mail

/var/log/php-mail/mail.log {
    rotate 7
    size 100M
    copytruncate
    create 0640 root adm
    compress
    missingok
    notifempty
}

Всё, осталось только отрестартить нужные демоны:

root@server:~# apachectl restart
root@server:~# service rsyslog restart

Теперь у нас есть лог, в который могут писать любые сайты вне зависимости от пользователя, под которым сайт работает. Прочитать этот лог могут только root и пользователи группы adm, а сам лог изредка ротируется.
Строчки в логе будут выглядеть примерно так:

May 22 14:27:49 dev apache2: [22-May-2018 14:27:49 UTC] mail() on [/home/dev2/data/www/some_file.php:18]: To: example@example.com -- Headers:

sslh + ipv6 + <censored> — чудесная идея бесплатно.

Статья обфусцирована, сами знаете почему. С начала прошлой недели у меня была идея-фикс. Поднять open<censored> сервер на территории матушки-России, подцепиться к нему по ipv6 с территории страны-агрессора, а v4-клиентами из RM -RF выходить наружу уже оттуда, откуда нужно. Ну то есть точка входа здесь, точка выхода там, а сами точки общаются исключительно по ipv6 (от [...]

Запускаем один NoVNC для доступа к нескольким VNC. Например, к консолям KVM-виртуалок.

Статью пишу «по памяти», воспроизвести вживую негде (да и лень). Если найдете ошибки и что-то не заработает — обязательно пишите. Я бы пока не рассматривал эту статью, как решение из разряда «copy-paste и работает». Но если вы понимаете происходящее ниже — то никакой проблемы запустить эту штуку нет, там всё банально. Ценность здесь, скорее, именно [...]

Новость одной строкой — 1.1.1.1, новый публичный резолвер.

На фоне клёвых первоапрельских новостей многие могли пропустить весьма важную новость. Компания Cloudflare совместно с APNIC запустила новый публичный резолвер на адресе 1.1.1.1 Что вдвойне приятно — с поддержкой dns over TLS (то бишь запросы до этого резолвера можно шифровать). Так же есть поддержка DNS over HTTPS, но его использовать может пока только FireFox в [...]

seedbox на коленке: deluged+deluge-web

Всем хороша связка rtorrent+rutorrent. Только настраивать её очень уж геморрно, да и уязвимость там нашли, помнится. Я давно уже использую deluge. Да и вообще мне интерфейс deluge-web больше нравится — выглядит посовременнее, сам он читаемый, да и вообще «не PHP и ладненько». Поэтому сегодня и расскажу, как настроить связку из deluged и родного вебинтерфейса к [...]

Пишем свой unit для SystemD

В некоторых следующих статьях помимо прочего придется запускать некоторые сервисы без «изкоробочного» init-скрипта или юнита. В 2018 году мне уже пришлось смириться с победой systemd и показывать в тех статьях init-скрипты я уже не буду. Но и рассказывать в каждой статье всю последовательность действий мне будет лень. Поэтому здесь я расскажу, что делать с unit-ом [...]

Скрипт для проверки локалхоста на spectre/meltdown

Сижу я в один прекрасный день, значит, смотрю на свою LTS-убунту на ноутбучке и понимаю, что несмотря на apt-get upgrade, сделанный полчаса назад, она всё ещё уязвима к spectre (не спрашивайте как, просто жопой почуял). Про сами уязвимости в процах, думаю, рассказывать в сотый раз не стоит, а вот про то, как linux-хост проверить на [...]

Unbound: локальный резолвер на сервере — честный, с форвардингом и с зашифрованным форвардингом.

Для начала поговорим о том, для чего нужен локальный dns-резолвер. Вообще, полезен он и на сервере, и на вашем ноутбучке (только для разного, пожалуй), а написать эту статью меня вынудил именно новый провайдер (самизнаетепочему). Локальный резолвер позволяет получать мгновенный ответ от dns (кроме случая, когда мы впервые спрашиваем определенную запись). Резолверы провайдера/хостера бывают перегружены, запрос [...]

Настраиваем FTP-сервер. Издание второе, улучшенное и дополненное: vsftpd.

Одной из первых статей в этом блоге была статья Debian, ftpd, vtpd, vsftpd. Very fast way. Восемь, мать его, лет назад! Собственно, по той статье некоторое время назад настроить vsftpd в дебиане стало невозможно. Поэтому я решил написать новую. Формально статья могла бы стать одной из частей Большого мануала, но я очень не хочу, чтобы [...]