Linux – Monitorowanie funkcji sendmail (php)

Często zdarzyć się może, że serwer pod naszą kontrolą wysyła spam (zainfekowana strona, złośliwy plik php, zły plugin do strony).
W bardzo łatwy sposób możemy wychwycić to zachowanie tworząc tzw. 'wrapper’ dla polecenie sendmail, z którego korzysta bardzo dużo skryptów PHP.

1. Tworzymy plik /usr/local/bin/phpsendmail:

vi /usr/local/bin/phpsendmail
### początek ###
#!/usr/bin/php
<?php

/**
  This script is a sendmail wrapper for php to log calls of the php mail() function.
  Author: Till Brehm, www.ispconfig.org
  (Hopefully) secured by David Goodwin <david @ _palepurple_.co.uk>
*/

$sendmail_bin = '/usr/sbin/sendmail';
$logfile = '/tmp/mail_php.log';

//* Get the email content
$logline = '';
$pointer = fopen('php://stdin', 'r');

while ($line = fgets($pointer)) {
        if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line)) {
                $logline .= trim($line).' ';
        }
        $mail .= $line;
}

//* compose the sendmail command
$command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
        $command .= escapeshellarg($_SERVER['argv'][$i]).' ';
}

//* Write the log
file_put_contents($logfile, date('Y-m-d H:i:s') . ' ' . $_ENV['PWD'] . ' ' . $logline, FILE_APPEND);
//* Execute the command
return shell_exec($command);
?>
### koniec ###

Oczywiście należy dostosować skrypt do lokalizacji sendmaila:

which sendmail

Jeżeli lokalizacja jest inna niż /usr/sbin/sendmail należy go zmienić w skrypcie

Ustawiamy uprawnienia na nasz skrypt:

chmod +x /usr/local/bin/phpsendmail
#tworzymy logi
touch /var/log/mail.form
chmod 777 /var/log/mail.form

2.  Następnie edytujemy plik php.ini

vi /etc/php5/apache2/php.ini
#zmieńmy ten kod:
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =
## na ten:
[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/local/bin/phpsendmail

Jeżeli używamy PHP jako CGI lub suPHP, należy także edytować plik: /etc/php5/cgi/php.ini

Resetujemy usługę:

service apache2 restart

3. Przetestujmy nasz wrapper

Utwórz plik mailtest.php w katalogu ze stroną np. /var/www/example.com/public_html

<?php
mail('yourname@yourdomain.com','This is a test message subject','This is a test message body');
echo 'Mail sent.'; 
?>

Otwórzmy stronę w przeglądarce

Sprawdzmy czy plik logu zapisał zdarzenie

cat /var/log/mail.form

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*