Desenvolvi (não sou programador, apenas um curioso que faz gambiarras [algumas dão choque]) um script que suspende automaticamente a conta cpanel de quem exceder o limite imposto por hora. Como sabem, podemos limitar a quantidade de emails que um domínio pode enviar por hora, e então estes e-mails são automaticamente descartados.
O problema é que este processo de descartar os emails, muitas vezes em milhares, consome muito CPU, até que o cliente/script desista de enviar. Isto deveria ser tratado pelos desenvolvedores do cpanel/exim para que não comesse tanto CPU.
Como ninguém fez isso até hoje, pensei em simplesmente suspender a conta automaticamente, visto que na maioria das vezes(70%) trata-se de spam, mesmo que não diretamente pelo cliente, mas por código vulnerável em seu site.
Fiz um mod simples no /etc/exim.pl.local
Criei uma sub:
sub suspendmax {
my $domain = shift;
if ( -e '/tmp/'.$domain.'.suspending.maxemailsperhour' ) {
return 'yes';
} else {
system("touch /tmp/$domain.suspending.maxemailsperhour");
system("/path/to/suspensaoscript $domain 1 1");
}
}
e chamei essa sub aqui:
if ( reached_max_emails_per_hour( $domain, $maxmails, $now ) ) {
$checkspam_message = "Domain $domain has exceeded the max emails per hour ($maxmails) allowed. Message discarded.";
suspendmax($domain);
return 'yes';
}
Isso faz com que o exim chame o /usr/bin/sus logo que o domínio exceder a quantidade permitida de emails por hora..
no /path/to/suspensaoscript tenho:
#!/bin/bash
login=`cat /etc/userdomains |grep -w $1: -m1 |cut -d: -f2 |replace ' ' ''`
dono=`cat /etc/trueuserowners |grep -w $login -m1 |cut -d: -f2 |replace ' ' ''`
email=`cat /home/$dono/.contactemail`
donodomain=`cat /var/cpanel/users/$dono |grep 'DNS=' |cut -d'=' -f2 |replace ' ' ''`
if [ "${2}" ]; then
if [ `ps aux |grep suspenda|grep -v grep |wc -l` -gt 0 ]; then
echo "Aborted. Suspension in progress"
exit;
else
/scripts/suspendacct $login "Contactar host" 1
echo -e "Email:$email:$donodomain\r"
fi
if [ "${3}" ]; then
data=`date +%Y-%m-%d`
host=`hostname`
hora=`date`
abuso=`cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data | head -1 | cut -d"-" -f1`
cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data >> $1_log_$data
replace '500' '350' -- $1_log_$data >> /dev/null
mv $1_log_$data /usr/local/apache/htdocs/
chown nobody:nobody /usr/local/apache/htdocs/$1_log_$data
prova="http://$host/$1_log_$data"
mensagem=`lynx -dump "http://www.servidorcentral.com.br/suspender.php?donodomain=$donodomain&domain=$1&email=$email&reason=5&prova=$prova&who=exim.pl.local"`
fi
fi
Esse sus é um script que utilizo para suspender contas em sistemas de detecção de abusos automáticos, como este do exim o qual vos exponho. Notem que há um total desapego com a segurança e que um programador de verdade pode sofrer um derrame se alguém um dia chamar isto de código. Como disse, não sou programador, apenas me divirto!
Voltando tecnicamente ao assunto, este sus também chama um script que criei em PHP, responsável por abrir um chamado automaticamente para o cliente. No caso utilizo o supportsuite da kayako e o ticket é criado automaticamente com o email do cliente (ou do dono da revenda), informando o motivo da suspensão e a prova do abuso. Posso expor este PHP caso tenham interesse.
Notem que para evitar loops eu criei um arquivo no /tmp/ e de 30 em 30 minutos todos os arquivos do gênero são apagados por um cron.

Page 1 of 1
Auto suspender cliente que excede limite no cpanel/exim script para automatizar
#2
Posted 05 dezembro 2008 - 11:15
QUOTE(filipe.m @ Dec 5 2008, 04:10 PM) <{POST_SNAPBACK}>
Desenvolvi (não sou programador, apenas um curioso que faz gambiarras [algumas dão choque]) um script que suspende automaticamente a conta cpanel de quem exceder o limite imposto por hora. Como sabem, podemos limitar a quantidade de emails que um domínio pode enviar por hora, e então estes e-mails são automaticamente descartados.
O problema é que este processo de descartar os emails, muitas vezes em milhares, consome muito CPU, até que o cliente/script desista de enviar. Isto deveria ser tratado pelos desenvolvedores do cpanel/exim para que não comesse tanto CPU.
Como ninguém fez isso até hoje, pensei em simplesmente suspender a conta automaticamente, visto que na maioria das vezes(70%) trata-se de spam, mesmo que não diretamente pelo cliente, mas por código vulnerável em seu site.
Fiz um mod simples no /etc/exim.pl.local
Criei uma sub:
sub suspendmax {
my $domain = shift;
if ( -e '/tmp/'.$domain.'.suspending.maxemailsperhour' ) {
return 'yes';
} else {
system("touch /tmp/$domain.suspending.maxemailsperhour");
system("/path/to/suspensaoscript $domain 1 1");
}
}
e chamei essa sub aqui:
if ( reached_max_emails_per_hour( $domain, $maxmails, $now ) ) {
$checkspam_message = "Domain $domain has exceeded the max emails per hour ($maxmails) allowed. Message discarded.";
suspendmax($domain);
return 'yes';
}
Isso faz com que o exim chame o /usr/bin/sus logo que o domínio exceder a quantidade permitida de emails por hora..
no /path/to/suspensaoscript tenho:
#!/bin/bash
login=`cat /etc/userdomains |grep -w $1: -m1 |cut -d: -f2 |replace ' ' ''`
dono=`cat /etc/trueuserowners |grep -w $login -m1 |cut -d: -f2 |replace ' ' ''`
email=`cat /home/$dono/.contactemail`
donodomain=`cat /var/cpanel/users/$dono |grep 'DNS=' |cut -d'=' -f2 |replace ' ' ''`
if [ "${2}" ]; then
if [ `ps aux |grep suspenda|grep -v grep |wc -l` -gt 0 ]; then
echo "Aborted. Suspension in progress"
exit;
else
/scripts/suspendacct $login "Contactar host" 1
echo -e "Email:$email:$donodomain\r"
fi
if [ "${3}" ]; then
data=`date +%Y-%m-%d`
host=`hostname`
hora=`date`
abuso=`cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data | head -1 | cut -d"-" -f1`
cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data >> $1_log_$data
replace '500' '350' -- $1_log_$data >> /dev/null
mv $1_log_$data /usr/local/apache/htdocs/
chown nobody:nobody /usr/local/apache/htdocs/$1_log_$data
prova="http://$host/$1_log_$data"
mensagem=`lynx -dump "http://www.servidorcentral.com.br/suspender.php?donodomain=$donodomain&domain=$1&email=$email&reason=5&prova=$prova&who=exim.pl.local"`
fi
fi
Esse sus é um script que utilizo para suspender contas em sistemas de detecção de abusos automáticos, como este do exim o qual vos exponho. Notem que há um total desapego com a segurança e que um programador de verdade pode sofrer um derrame se alguém um dia chamar isto de código. Como disse, não sou programador, apenas me divirto!
Voltando tecnicamente ao assunto, este sus também chama um script que criei em PHP, responsável por abrir um chamado automaticamente para o cliente. No caso utilizo o supportsuite da kayako e o ticket é criado automaticamente com o email do cliente (ou do dono da revenda), informando o motivo da suspensão e a prova do abuso. Posso expor este PHP caso tenham interesse.
Notem que para evitar loops eu criei um arquivo no /tmp/ e de 30 em 30 minutos todos os arquivos do gênero são apagados por um cron.
O problema é que este processo de descartar os emails, muitas vezes em milhares, consome muito CPU, até que o cliente/script desista de enviar. Isto deveria ser tratado pelos desenvolvedores do cpanel/exim para que não comesse tanto CPU.
Como ninguém fez isso até hoje, pensei em simplesmente suspender a conta automaticamente, visto que na maioria das vezes(70%) trata-se de spam, mesmo que não diretamente pelo cliente, mas por código vulnerável em seu site.
Fiz um mod simples no /etc/exim.pl.local
Criei uma sub:
sub suspendmax {
my $domain = shift;
if ( -e '/tmp/'.$domain.'.suspending.maxemailsperhour' ) {
return 'yes';
} else {
system("touch /tmp/$domain.suspending.maxemailsperhour");
system("/path/to/suspensaoscript $domain 1 1");
}
}
e chamei essa sub aqui:
if ( reached_max_emails_per_hour( $domain, $maxmails, $now ) ) {
$checkspam_message = "Domain $domain has exceeded the max emails per hour ($maxmails) allowed. Message discarded.";
suspendmax($domain);
return 'yes';
}
Isso faz com que o exim chame o /usr/bin/sus logo que o domínio exceder a quantidade permitida de emails por hora..
no /path/to/suspensaoscript tenho:
#!/bin/bash
login=`cat /etc/userdomains |grep -w $1: -m1 |cut -d: -f2 |replace ' ' ''`
dono=`cat /etc/trueuserowners |grep -w $login -m1 |cut -d: -f2 |replace ' ' ''`
email=`cat /home/$dono/.contactemail`
donodomain=`cat /var/cpanel/users/$dono |grep 'DNS=' |cut -d'=' -f2 |replace ' ' ''`
if [ "${2}" ]; then
if [ `ps aux |grep suspenda|grep -v grep |wc -l` -gt 0 ]; then
echo "Aborted. Suspension in progress"
exit;
else
/scripts/suspendacct $login "Contactar host" 1
echo -e "Email:$email:$donodomain\r"
fi
if [ "${3}" ]; then
data=`date +%Y-%m-%d`
host=`hostname`
hora=`date`
abuso=`cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data | head -1 | cut -d"-" -f1`
cat /var/log/exim_mainlog | grep "Domain $1 has exceeded" | grep $data >> $1_log_$data
replace '500' '350' -- $1_log_$data >> /dev/null
mv $1_log_$data /usr/local/apache/htdocs/
chown nobody:nobody /usr/local/apache/htdocs/$1_log_$data
prova="http://$host/$1_log_$data"
mensagem=`lynx -dump "http://www.servidorcentral.com.br/suspender.php?donodomain=$donodomain&domain=$1&email=$email&reason=5&prova=$prova&who=exim.pl.local"`
fi
fi
Esse sus é um script que utilizo para suspender contas em sistemas de detecção de abusos automáticos, como este do exim o qual vos exponho. Notem que há um total desapego com a segurança e que um programador de verdade pode sofrer um derrame se alguém um dia chamar isto de código. Como disse, não sou programador, apenas me divirto!
Voltando tecnicamente ao assunto, este sus também chama um script que criei em PHP, responsável por abrir um chamado automaticamente para o cliente. No caso utilizo o supportsuite da kayako e o ticket é criado automaticamente com o email do cliente (ou do dono da revenda), informando o motivo da suspensão e a prova do abuso. Posso expor este PHP caso tenham interesse.
Notem que para evitar loops eu criei um arquivo no /tmp/ e de 30 em 30 minutos todos os arquivos do gênero são apagados por um cron.
Muito inteligente a idéia!
A propósito, já vale a pena enfiar a cara no mundo de programação por que determinação tu já tem!
Parabéns.
#3
Posted 24 dezembro 2008 - 05:04
Muito bom mesmo, isso não poderia ser feito por quantidade de email enviados por mês? Vamos supor que cada conta tenha permissão para enviar 5000 emails mês pode ser enviado todos de uma vez mas apenas 5000 mês. Isso é possível?
Share this topic:
Page 1 of 1

Help










