The SA RBL checks make quite a difference to the amount of spam I catch,
so I wrote some code in my filter to perform the checks, score them the
same as SA would (given both Bayes and networking enabled), and then
modify the SA $report to reflect the tests.  I suppose a better way than
what I do below would be to read /usr/share/spamassassin/20_dnsrbl.cf and
50_scores.cf on the fly, but this stuff hasn't seemed to change too
frequently with the last few SA releases.

Realize this WILL slow down your processing, but we do about 30K inbound
mails/day and it hasn't been a problem.  Use at your own risk.  So here is
my filter_end....

[BTW I had to delete the last line of my report as set in my
/etc/mail/spamassassin/sa-mimedefang.cf and I add it after I get done
adding RBL hits to the report.  I also tolerate a blank line between the
report as generated by the call to spam_assassin_check and the RBL checks
I do in my code.  I am lazy and didn't feel like writing code to make it
look identical just for asthetics.]


 sub filter_end ($) {

    use Socket;

    my($entity) = @_;

    # If you want quarantine reports, uncomment next line
    # send_quarantine_notifications();

    # IMPORTANT NOTE:  YOU MUST CALL send_quarantine_notifications() AFTER
    # ANY PARTS HAVE BEEN QUARANTINED.  SO IF YOU MODIFY THIS FILTER TO
    # QUARANTINE SPAM, REWORK THE LOGIC TO CALL send_quarantine_notifications()
    # AT THE END!!!

    # No sense doing any extra work
    return if message_rejected();

    # Spam checks if SpamAssassin is installed
    if ($Features{"SpamAssassin"}) {
        if (-s "./INPUTMSG" < 200*1024) {
            # Only scan messages smaller than 200kB.  Larger messages
            # are extremely unlikely to be spam, and SpamAssassin is
            # dreadfully slow on very large messages.
            my($hits, $req, $names, $report) = spam_assassin_check();

            # check RBLs and add to $hits
            # this code emulates what spamass would do with net checks
            # when both net and bayes are enabled
            my($result);
            if ($result = (relay_is_blacklisted($RelayAddr, "dnsbl.njabl.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_NJABL
                $hits = $hits + 0.100;
                $names = $names . ",RCVD_IN_NJABL";
                $report = $report . " 0.1 RCVD_IN_NJABL\tReceived via a relay in 
dnsbl.njabl.org\n";
                if ($result eq '127.0.0.2') {
                    # RCVD_IN_NJABL_RELAY
                    $hits = $hits + 0.001;
                    $names = $names . ",RCVD_IN_NJABL_RELAY";
                    $report = $report . " 0.0 RCVD_IN_NJABL_RELAY\tNJABL: sender is 
confirmed open relay\n";
                } elsif ($result eq '127.0.0.3') {
                    # RCVD_IN_NJABL_DIALUP
                    $hits = $hits + 3.536;
                    $names = $names . ",RCVD_IN_NJABL_DIALUP";
                    $report = $report . " 3.5 RCVD_IN_NJABL_DIALUP\tNJABL: dialup 
sender did non-local SMTP\n";
                } elsif ($result eq '127.0.0.4') {
                    # RCVD_IN_NJABL_SPAM
                    $hits = $hits + 1.206;
                    $names = $names . ",RCVD_IN_NJABL_SPAM";
                    $report = $report . " 1.2 RCVD_IN_NJABL_SPAM\tNJABL: sender is 
confirmed spam source\n";
                } elsif ($result eq '127.0.0.5') {
                    # RCVD_IN_NJABL_MULTI
                    $hits = $hits + 0.001;
                    $names = $names . ",RCVD_IN_NJABL_MULTI";
                    $report = $report . " 0.0 RCVD_IN_NJABL_MULTI\tNJABL: sent through 
multi-stage open relay\n"
                } elsif ($result eq '127.0.0.8') {
                    # RCVD_IN_NJABL_CGI
                    $hits = $hits + 0;
                    $names = $names . ",RCVD_IN_NJABL_CGI";
                    $report = $report . " 0 RCVD_IN_NJABL_CGI\tNJABL: sender is an 
open formmail\n";
                } elsif ($result eq '127.0.0.9') {
                    # RCVD_IN_NJABL_PROXY
                    $hits = $hits + 0.500;
                    $names = $names . ",RCVD_IN_NJABL_PROXY";
                    $report = $report . " 0.5 RCVD_IN_NJABL_PROXY\tNJABL: sender is an 
open proxy\n";
                }
            }
            if ($result = (relay_is_blacklisted($RelayAddr, "dnsbl.sorbs.net"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_SORBS
                $hits = $hits + 0.100;
                $names = $names . ",RCVD_IN_SORBS";
                $report = $report . " 0.1 RCVD_IN_SORBS\tSORBS: sender is listed in 
SORBS\n";
                if ($result eq '127.0.0.2') {
                    # RCVD_IN_SORBS_HTTP
                    $hits = $hits + 1.101;
                    $names = $names . ",RCVD_IN_SORBS_HTTP";
                    $report = $report . " 1.1 RCVD_IN_SORBS_HTTP\tSORBS: sender is 
open HTTP proxy server\n"
                } elsif ($result eq '127.0.0.3') {
                    # RCVD_IN_SORBS_SOCKS
                    $hits = $hits + 1.204;
                    $names = $names . ",RCVD_IN_SORBS_SOCKS";
                    $report = $report . " 1.2 RCVD_IN_SORBS_SOCKS\tSORBS: sender is 
open SOCKS proxy server\n";
                } elsif ($result eq '127.0.0.4') {
                    # RCVD_IN_SORBS_MISC
                    $hits = $hits + 0.687;
                    $names = $names . ",RCVD_IN_SORBS_MISC";
                    $report = $report . " 0.7 RCVD_IN_SORBS_MISC\tSORBS: sender is 
open proxy server\n";
                } elsif ($result eq '127.0.0.5') {
                    # RCVD_IN_SORBS_SMTP
                    $hits = $hits + 2.700;
                    $names = $names . ",RCVD_IN_SORBS_SMTP";
                    $report = $report . " 2.7 RCVD_IN_SORBS_SMTP\tSORBS: sender is 
open SMTP relay\n";
                } elsif ($result eq '127.0.0.6') {
                    # RCVD_IN_SORBS_SPAM
                    $hits = $hits + 0;
                    $names = $names . ",RCVD_IN_SORBS_SPAM";
                    $report = $report . " 0 RCVD_IN_SORBS_SPAM\tSORBS: spam source or 
spam-supporting ISP\n";
                } elsif ($result eq '127.0.0.7') {
                    # RCVD_IN_SORBS_WEB
                    $hits = $hits + 0;
                    $names = $names . ",RCVD_IN_SORBS_WEB";
                    $report = $report . " 0 RCVD_IN_SORBS_WEB\tSORBS: sender is a 
abuseable web server\n";
                } elsif ($result eq '127.0.0.8') {
                    # RCVD_IN_SORBS_BLOCK
                    $hits = $hits + 0;
                    $names = $names . ",RCVD_IN_SORBS_BLOCK";
                    $report = $report . " 0 RCVD_IN_SORBS_BLOCK\tSORBS: sender demands 
to never be tested\n";
                } elsif ($result eq '127.0.0.9') {
                    # RCVD_IN_SORBS_ZOMBIE
                    $hits = $hits + 2.599;
                    $names = $names . ",RCVD_IN_SORBS_ZOMBIE";
                    $report = $report . " 2.6 RCVD_IN_SORBS_ZOMBIE\tSORBS: sender is 
on a hijacked network\n";
                } elsif ($result eq '127.0.0.10') {
                    # RCVD_IN_DYNABLOCK
                    $hits = $hits + 2.599;
                    $names = $names . ",RCVD_IN_DYNABLOCK";
                    $report = $report . " 2.6 RCVD_IN_DYNABLOCK\tSent directly from 
dynamic IP address\n";
                }
            }
            if ($result = (relay_is_blacklisted($RelayAddr, "opm.blitzed.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_OPM
                $hits = $hits + 1.001;
                $names = $names . ",RCVD_IN_OPM";
                $report = $report . " 1.0 RCVD_IN_OPM\tReceived via a relay in 
opm.blitzed.org\n";
                if ($result eq '1') {
                    # RCVD_IN_OPM_WINGATE
                    $hits = $hits + 2.700;
                    $names = $names . ",RCVD_IN_OPM_WINGATE";
                    $report = $report . " 2.7 RCVD_IN_OPM_WINGATE\tOPM: sender is open 
WinGate proxy\n";
                } elsif ($result eq '2') {
                    # RCVD_IN_OPM_SOCKS
                    $hits = $hits + 1.257;
                    $names = $names . ",RCVD_IN_OPM_SOCKS";
                    $report = $report . " 1.3 RCVD_IN_OPM_SOCKS\tOPM: sender is open 
SOCKS proxy\n";
                } elsif ($result eq '4') {
                    # RCVD_IN_OPM_HTTP
                    $hits = $hits + 1.101;
                    $names = $names . ",RCVD_IN_OPM_HTTP";
                    $report = $report . " 1.1 RCVD_IN_OPM_HTTP\tOPM: sender is open 
HTTP CONNECT proxy\n";
                } elsif ($result eq '8') {
                    # RCVD_IN_OPM_ROUTER
                    $hits = $hits + 0;
                    $names = $names . ",RCVD_IN_OPM_ROUTER";
                    $report = $report . " 0 RCVD_IN_OPM_ROUTER\tOPM: sender is open 
router proxy\n";
                } elsif ($result eq '16') {
                    # RCVD_IN_OPM_HTTP_POST
                    $hits = $hits + 1.001;
                    $names = $names . ",RCVD_IN_OPM_HTTP_POST";
                    $report = $report . " 1.0 RCVD_IN_OPM_HTTP_POST\tOPM: sender is 
open HTTP POST proxy\n";
                }
            }
            if ($result = (relay_is_blacklisted($RelayAddr, "list.dsbl.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_DSBL
                $hits = $hits + 0.706;
                $names = $names . ",RCVD_IN_DSBL";
                $report = $report . " 0.7 RCVD_IN_DSBL\tReceived via a relay in 
list.dsbl.org\n";
            }
            if ($result = (relay_is_blacklisted($RelayAddr, 
"ipwhois.rfc-ignorant.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_RFCI
                $hits = $hits + 0.100;
                $names = $names . ",RCVD_IN_RFCI";
                $report = $report . " 0.1 RCVD_IN_RFCI\tSent via a relay in 
ipwhois.rfc-ignorant.org\n";
            }
#           if ($result = (relay_is_blacklisted($RelayAddr, "dsn.rfc-ignorant.org"))) {
#               $result = inet_ntoa($result);
                # DNS_FROM_RFCI_DSN
#               $hits = $hits + 0;
#               $names = $names . ",DNS_FROM_RFCI_DSN";
#               $report = $report . " 0 DNS_FROM_RFCI_DSN\tFrom: sender listed in 
dsn.rfc-ignorant.org\n";
#           }
            if ($result = (relay_is_blacklisted($RelayAddr, "sa-hil.habeas.com"))) {
                $result = inet_ntoa($result);
                # HABEAS_VIOLATOR
                $hits = $hits + 16;
                $names = $names . ",HABEAS_VIOLATOR";
                $report = $report . " 16 HABEAS_VIOLATOR\tHas Habeas warrant mark and 
on Infringer List\n";
            }
            if ($result = (relay_is_blacklisted($RelayAddr, 
"sa-trusted.bondedsender.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_BSP_TRUSTED
                $hits = $hits - 4.3;
                $names = $names . ",RCVD_IN_BSP_TRUSTED";
                $report = $report . " -4.3 RCVD_IN_BSP_TRUSTED\tSender is in Bonded 
Sender Program (trusted relay)\n";
            }
            if ($result = (relay_is_blacklisted($RelayAddr, 
"sa-other.bondedsender.org"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_BSP_OTHER
                $hits = $hits - 0.1;
                $names = $names . ",RCVD_IN_BSP_OTHER";
                $report = $report . " -0.1 RCVD_IN_BSP_OTHER\tSender is in Bonded 
Sender Program (other relay)\n";
            }
            if ($result = (relay_is_blacklisted($RelayAddr, "bl.spamcop.net"))) {
                $result = inet_ntoa($result);
                # RCVD_IN_BL_SPAMCOP_NET
                $hits = $hits + 1.50;
                $names = $names . ",RCVD_IN_BL_SPAMCOP_NET";
                $report = $report . " 1.5 RCVD_IN_BL_SPAMCOP_NET\tReceived via a relay 
in bl.spamcop.net\n";
            }
            $report =~ s/[0-9]+\.[0-9]+ hits/$hits hits/;
            $report = $report . ": -------------------- End of Spam Details 
-----------------------------";


            my($score);
            if ($hits < 40) {
                $score = "*" x int($hits);
            } else {
                $score = "*" x 40;
            }
            if ($hits >= $req) {
                # just drop obnoxiously high messages
                if ($hits > 10) {
                    md_graphdefang_log('discarded spam',  $hits, $RelayAddr);
                    action_discard();
                } else {
                        action_change_header("Subject", "\*\*\*\*\*SPAM\*\*\*\*\* 
$Subject");

                        # If you find the SA report useful, add it, I guess...
                        action_add_part($entity, "text/plain", "-suggest",
                                "$report\n",
                                "SpamAssassinReport.txt", "inline");
                        md_graphdefang_log('spam', $hits, $RelayAddr);
                }
            } else {
                md_graphdefang_log('clean', $hits, $RelayAddr);
            }
            # We add a header which looks like this:
            # X-Spam-Score: 6.8 (******) NAME_OF_TEST,NAME_OF_TEST
            # The number of asterisks in parens is the integer part
            # of the spam score clamped to a maximum of 40.
            # MUA filters can easily be written to trigger on a
            # minimum number of asterisks...
            action_change_header("X-Spam-Score", "$hits ($score) $names");
        } else {
            md_graphdefang_log('clean', '0', $RelayAddr);
        }

    }
}


-- 
Matthew S. Cramer <[EMAIL PROTECTED]>          Office: 717-396-5032
Infrastructure Security Analyst                     Fax:    717-396-5590
Armstrong World Industries, Inc.                    Cell:   717-917-7099

_______________________________________________
Visit http://www.mimedefang.org and http://www.canit.ca
MIMEDefang mailing list
[EMAIL PROTECTED]
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

Reply via email to