OPCIONAL: Hace falta realizar pruebas.
PHP y Apache no hacen seguimiento de los usuarios que envían correos a través del usuario nobody (usuario estándar de PHP), causando debilidades en el uso de formmail y la posibilidad de no poder detectar usuarios malintencionados que envían spam.
Revisar el exim_mainlog no es de gran ayuda, se ve la salida del correo electrónico, pero no se puede hacer seguimiento de qué usuario o secuencia de comandos lo envió.
Si se analiza el archivo php.ini notamos que el programa de correo electrónico está establecido en: /usr/sbin/sendmail y el 99,99 % de los scripts PHP sólo utilizarán la función mail () por lo que todo irá a través de la /usr/sbin/sendmail.
Para poder disponer de un registro de eventos de emails enviados usando nobody debemos realizar el siguiente procedimiento:
Ingresar en la consola con el usuario root y apagar el servicio exim mientras se completa este procedimiento:
/etc/init.d/exim stop
Respaldar el archivo original /usr/sbin/sendmail :
mv /usr/sbin/sendmail /usr/sbin/sendmail.hidden
Crear el script de monitoreo de SPAM para el nuevo sendmail:
nano /usr/sbin/sendmail
Colocar en el archivo lo siguiente:
#!/usr/local/bin/perl
# use strict;
use Env;
my $date = `date`;
chomp $date;
open (INFO, ">>/var/log/spam_log") || die "Failed to open file ::$!";
my $uid = $>;
my @info = getpwuid($uid);
if($REMOTE_ADDR) {
print INFO "$date - $REMOTE_ADDR ran $SCRIPT_NAME at $SERVER_NAME n";
}
else {
print INFO "$date - $PWD - @infon";
}
my $mailprog = '/usr/sbin/sendmail.hidden';
foreach (@ARGV) {
$arg="$arg" . " $_";
}
open (MAIL,"|$mailprog $arg") || die "cannot open $mailprog: $!n";
while (<stdin> ) {
print MAIL;
}
close (INFO);
close (MAIL);</stdin>
Salir y Guardar.
Debemos cambiar los permisos de ejecución de sendmail
chmod +x /usr/sbin/sendmail
Creamos un nuevo archivo log para guardar el histórico de todos los correos emitidos desde el servidor utilizando programas web:
touch /var/log/spam_log
chmod 0777 /var/log/spam_log
Volvemos a arrancar el EXIM:
/etc/init.d/exim start
Podemos entonces monitorear el archivo spam_log para ubicar el spam. Es posible usar cualquier aplicación de formmail o un script que use la función mail() de php.
tail - f /var/log/spam_log
Un ejemplo de lo guardado en el histórico sería:
Mon Apr 11 07:12:21 EDT 2005 - /home/usuario/public_html/directorio/subdirectorio - nobody x 99 99 Nobody / /sbin/nologin
Detalles de Rotación del Log
El archivo spam_log no se ha inicializado para ser rotado por lo que podría llegar a ser muy grande rápidamente. Debe entonces ser agregado logrotation, para ello debemos editar el archivo de configuración del mismo:
nano /etc/logrotate.conf
Buscar:
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
Y agregar debajo de eso:
# SPAM LOG rotation
/var/log/spam_log {
monthly
create 0777 root root
rotate 1
}
También podríamos querer evitar que nuestro sendmail sea sobre-escrito para lo cual podemos ejecutar:
chattr + i /usr/sbin/sendmail