Subject: Re: Junk mail and virus filtering on netbsd mailserver
To: Scott R. Burns <Scott.Burns@Netcontech.Com>
From: Martti Kuparinen <martti.kuparinen@iki.fi>
List: netbsd-help
Date: 08/25/2003 08:53:00
This is what I have:

- postfix with pcre support
- spamassassing
- procmail

Feel free to ask me more.

Martti


Install the software
====================

# cd /usr/pkgsrc/mail/spamassassin
# make install clean clean-depends

# cd /usr/pkgsrc/mail/procmail
# make install clean clean-depends

# echo POSTFIX_USE_PCRE=YES >> /etc/mk.conf
# cd /usr/pkgsrc/mail/postfix
# make install clean clean-depends

Configure the software
======================

## Disable all incoming mails with dangerous attachments
# cat > /usr/pkg/etc/postfix/body_checks << EOF
#
# Block mails with the following attachments:
#
# bat|chm|cmd|com|exe|hta|jse?|lnk|pif|reg|scr|shb|shs|vb[esx]|vdx|ws[fh]
#
/^begin\s+\d{3}\s+.+?\.(bat|chm|cmd|cnm|com|exe|hta|jse?|lnk|pif|reg|scr|shb|shs|vb[esx]|vdx|ws[fh])\n?$/
   REJECT Windows executable blocked

/^Content-(Disposition|Type):\s+.+?(file)?name="?.+?\.(bat|chm|cmd|cnm|com|exe|hta|jse?|lnk|pif|reg|scr|shb|shs|vb[esx]|vdx|ws[fh])"?\n?$/
   REJECT Windows executable blocked

/^\s+(file)?name="?.+?\.(bat|chm|cmd|cnm|com|exe|hta|jse?|lnk|pif|reg|scr|shb|shs|vb[esx]|vdx|ws[fh])"?\n?$/
   REJECT Windows executable blocked
EOF

# vi /usr/pkg/etc/postfix/main.cf

   smtpd_client_restrictions =
         permit_mynetworks,
         reject_rbl_client list.dsbl.org,
         reject_rbl_client relays.ordb.org,
         reject_rbl_client sbl.spamhaus.org,
         permit
   smtpd_sender_restrictions =
         check_sender_access regexp:$config_directory/reject_sender,
         permit_mynetworks,
         reject_rbl_client list.dsbl.org,
         reject_rbl_client relays.ordb.org,
         reject_rbl_client sbl.spamhaus.org,
         reject_non_fqdn_sender,
         reject_unknown_sender_domain
   smtpd_recipient_restrictions =
         check_recipient_access regexp:$config_directory/reject_rcpt,
         permit_mynetworks,
         permit_mx_backup,
         reject_non_fqdn_recipient,
         reject_invalid_hostname,
         reject_unknown_recipient_domain,
         reject_rbl_client sbl.spamhaus.org,
         reject_rbl_client relays.ordb.org,
         reject_rbl_client list.dsbl.org,
         reject_unauth_destination,
         reject_unauth_pipelining,
         check_relay_domains

   # Check for harmful attachments
   mime_header_checks = pcre:$config_directory/body_checks

## Add known trouble makers to my local black list
# cat > /usr/pkg/etc/postfix/reject_rcpt << EOF
# Address syntax
/[@!%].*[@!%]/                  550 Please use user@domain address forms only
EOF
# cat > /usr/pkg/etc/postfix/reject_sender << EOF
# Address syntax
/[@!%].*[@!%]/                  550 Please use user@domain address forms only
EOF

# mkdir -p /usr/local/bin
# cat > /usr/local/bin/deliver-wrapper.c << EOF
/*
  * Wrapper for cyrus 'deliver' to allow anyone to run it
  * with restricted set of parameters.
  *
  * This should be
  *
  * # chown root:wheel deliver-wrapper.c
  * # chmod 600 deliver-wrapper.c
  *
  * # gcc -Wall -static -o deliver-wrapper deliver-wrapper.c
  *
  * # chown cyrus:mail deliver-wrapper
  * # chmod 6711 deliver-wrapper
  */

#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>

int
main(int argc, char *argv[])
{
     char *const envp[] = { NULL };
     struct passwd *ent = getpwuid(getuid());
     const char *uname = (ent && ent->pw_name && ent->pw_name[0])
                         ? ent->pw_name : "anonymous";

     if (argc != 2) {
             fprintf(stderr, "Usage: %s mailbox\n", argv[0]);
             return 64; /* EX_USAGE */
     }

     execle("/usr/pkg/cyrus/bin/deliver", "deliver", "-e",
            "-a", uname, "-m", argv[1],
            NULL, envp);

     perror("exec /usr/cyrus/bin/deliver");
     return 71; /* EX_OSERR */
}
EOF

# cd /usr/local/bin
# gcc -Wall -static -o deliver-wrapper deliver-wrapper.c
# chown cyrus:mail deliver-wrapper
# chmod 6711 deliver-wrapper

Activate spam tagging
=====================

# cat > ${HOME}/.procmailrc << EOF
SHELL=/bin/sh
DELIVER=/usr/local/bin/deliver-wrapper
FORMAIL=/usr/pkg/bin/formail
VACATION=/usr/bin/vacation
SPAMASSASSIN=/usr/pkg/bin/spamassassin
USER=myusername
HOME=/home/$USER
MAILDIR=$HOME/mail
ON_VACATION=no

# SpamAssassin
:0 fw
| $SPAMASSASSIN

# spam
:0:$HOME/.cyrus.lock
* ^Subject: \[SPAM\?\].*
| $FORMAIL -I "From " | $DELIVER user.$USER.spam

# root
:0:$HOME/.cyrus.lock
* ^TO_(root|helpdesk)@
| $FORMAIL -I "From " | $DELIVER user.$USER.root

# everything else
:0
{
         :0 cwi
         * ON_VACATION ?? ^^yes^^
         | $VACATION $USER
         :0:$HOME/.cyrus.lock
         | $FORMAIL -I "From " | $DELIVER user.$USER
}

# The last resort - if all other recipes fail
:0:
IN-ERROR
EOF

# cat > ${HOME}/.forward << EOF
"|exec /usr/pkg/bin/procmail || exit 75"
EOF