<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.zhouba.cz/index.php?action=history&amp;feed=atom&amp;title=ZhoubaWiki%3AHowToSetupSpamFilterAmavis</id>
	<title>ZhoubaWiki:HowToSetupSpamFilterAmavis - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.zhouba.cz/index.php?action=history&amp;feed=atom&amp;title=ZhoubaWiki%3AHowToSetupSpamFilterAmavis"/>
	<link rel="alternate" type="text/html" href="https://wiki.zhouba.cz/index.php?title=ZhoubaWiki:HowToSetupSpamFilterAmavis&amp;action=history"/>
	<updated>2026-05-14T12:46:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://wiki.zhouba.cz/index.php?title=ZhoubaWiki:HowToSetupSpamFilterAmavis&amp;diff=12&amp;oldid=prev</id>
		<title>Garak: Created page with &quot;&lt;!-- Category section --&gt; Category:Bugweis &lt;!-- Contents --&gt; {| align=&quot;right&quot;  | __TOC__  |} '''How to set up Spam-filter Amavis (en)'''&lt;br&gt;&lt;br&gt; In this howto, Postfix int...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.zhouba.cz/index.php?title=ZhoubaWiki:HowToSetupSpamFilterAmavis&amp;diff=12&amp;oldid=prev"/>
		<updated>2021-05-22T16:20:42Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;!-- Category section --&amp;gt; &lt;a href=&quot;/index.php?title=Category:Bugweis&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:Bugweis (page does not exist)&quot;&gt;Category:Bugweis&lt;/a&gt; &amp;lt;!-- Contents --&amp;gt; {| align=&amp;quot;right&amp;quot;  | __TOC__  |} &amp;#039;&amp;#039;&amp;#039;How to set up Spam-filter Amavis (en)&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; In this howto, Postfix int...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;!-- Category section --&amp;gt;&lt;br /&gt;
[[Category:Bugweis]]&lt;br /&gt;
&amp;lt;!-- Contents --&amp;gt;&lt;br /&gt;
{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
 | __TOC__&lt;br /&gt;
 |}&lt;br /&gt;
'''How to set up Spam-filter Amavis (en)'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
In this howto, Postfix integration with amavis-new will be presented. Amavis-new is a wrapper that can call any number of content filtering programs for spam detection, antivirus, etc. In this howto, integration with Spamassassin and Clamav will be presented. This is a classical installation of Postfix + Amavis-new + Spamassassin + Clamav.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
To begin, install the following packages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install amavisd-new spamassassin clamav-daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install the optional packages for better spam detection:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install libnet-dns-perl pyzor razor&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install these optional packages to enable better scanning of attached archive files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo aptitude install arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip zip zoo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Clamav ===&lt;br /&gt;
&lt;br /&gt;
Add clamav user to the amavis group and vice versa in order for Clamav to have access to scan files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo adduser clamav amavis&lt;br /&gt;
sudo adduser amavis clamav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Spamassassin ===&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/default/spamassassin&amp;lt;/code&amp;gt; to activate the Spamassassin daemon change ENABLED=0 to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLED=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and to enable automatic rule updates change CRON=0 at the bottom to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRON=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start Spamassassin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /etc/init.d/spamassassin start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== If bayes doesn't work ===&lt;br /&gt;
Add this to &amp;lt;code&amp;gt;/etc/spamassassin/local.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bayes_path /var/lib/amavis/.spamassassin/bayes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and now you have to do this steps:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://spamassassin.apache.org/publiccorpus/20050311_spam_2.tar.bz2&lt;br /&gt;
wget http://spamassassin.apache.org/publiccorpus/20030228_easy_ham_2.tar.bz2&lt;br /&gt;
tar xvfj 20050311_spam_2.tar.bz2&lt;br /&gt;
tar xvfj 20030228_easy_ham_2.tar.bz2&lt;br /&gt;
sa-learn --spam -u spamd --dir spam_2/*&lt;br /&gt;
sa-learn --ham -u spamd --dir easy_ham_2/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check bayes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spamassassin -D --lint 2&amp;gt;&amp;amp;1 | grep bayes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problev with &amp;lt;code&amp;gt;DB expiry&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
sa-learn --force-expire -D&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Whitelist / Blacklist by content ===&lt;br /&gt;
Open &amp;lt;code&amp;gt;/etc/spamassassin/65_debian.cf&amp;lt;/code&amp;gt; and add rules to the end:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
header   RULE_NAME      Subject =~ /any string/i&lt;br /&gt;
score    RULE_NAME      -999.0&lt;br /&gt;
describe RULE_NAME      Whitelist by keyword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After changing any spamassasin configs run &amp;lt;code&amp;gt;--lint&amp;lt;/code&amp;gt; to test configuration for errors&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
spamassassin --lint&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Amavis ===&lt;br /&gt;
First, activate spam and antivirus detection in Amavis by editing &amp;lt;code&amp;gt;/etc/amavis/conf.d/15-content_filter_mode&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
# You can modify this file to re-enable SPAM checking through spamassassin&lt;br /&gt;
# and to re-enable antivirus checking.&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Default antivirus checking mode&lt;br /&gt;
# Uncomment the two lines below to enable it&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
@bypass_virus_checks_maps = (&lt;br /&gt;
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Default SPAM checking mode&lt;br /&gt;
# Uncomment the two lines below to enable it&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
@bypass_spam_checks_maps = (&lt;br /&gt;
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);&lt;br /&gt;
&lt;br /&gt;
1;  # insure a defined return&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next modify &amp;lt;code&amp;gt;/etc/amavis/conf.d/05-node_id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
# $myhostname is used by amavisd-new for node identification, and it is&lt;br /&gt;
# important to get it right (e.g. for ESMTP EHLO, loop detection, and so on).&lt;br /&gt;
&lt;br /&gt;
chomp($myhostname = &amp;lt;code&amp;gt;hostname --fqdn&amp;lt;/code&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
# To manually set $myhostname, edit the following line with the correct Fully&lt;br /&gt;
# Qualified Domain Name (FQDN) and remove the # at the beginning of the line.&lt;br /&gt;
#&lt;br /&gt;
$myhostname = &amp;quot;mail.hostname.tld&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
1;  # ensure a defined return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next modify @local_domains_acl = in &amp;lt;code&amp;gt;/etc/amavis/conf.d/05-domain_id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@local_domains_acl = ( &amp;quot;.$mydomain&amp;quot;,&amp;quot;.&amp;quot; );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now set the spam levels in &amp;lt;code&amp;gt;/etc/amavis/conf.d/20-debian_defaults&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sa_spam_subject_tag = '***SPAM*** ';&lt;br /&gt;
$sa_tag_level_deflt  = -999;  # add spam info headers if at, or above that level&lt;br /&gt;
$sa_tag2_level_deflt = 5; # add 'spam detected' headers at that level&lt;br /&gt;
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions&lt;br /&gt;
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After configuration Amavis needs to be restarted:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /etc/init.d/amavis restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Postfix integration ===&lt;br /&gt;
For postfix integration, you need to add the content_filter configuration variable to the Postfix configuration file &amp;lt;code&amp;gt;/etc/postfix/main.cf&amp;lt;/code&amp;gt;. This instructs postfix to pass messages to amavis at a given IP address and port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
content_filter = smtp-amavis:[127.0.0.1]:10024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following postconf command, run as root because of the preceding sudo command, adds the content_filter specification line above to main.cf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postconf -e &amp;quot;content_filter = smtp-amavis:[127.0.0.1]:10024&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next edit &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt; and add the following to the end of the file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smtp-amavis     unix    -       -       -       -       2       smtp&lt;br /&gt;
        -o smtp_data_done_timeout=1200&lt;br /&gt;
        -o smtp_send_xforward_command=yes&lt;br /&gt;
        -o disable_dns_lookups=yes&lt;br /&gt;
        -o max_use=20&lt;br /&gt;
&lt;br /&gt;
127.0.0.1:10025 inet    n       -       -       -       -       smtpd&lt;br /&gt;
        -o content_filter=&lt;br /&gt;
        -o local_recipient_maps=&lt;br /&gt;
        -o relay_recipient_maps=&lt;br /&gt;
        -o smtpd_restriction_classes=&lt;br /&gt;
        -o smtpd_delay_reject=no&lt;br /&gt;
        -o smtpd_client_restrictions=permit_mynetworks,reject&lt;br /&gt;
        -o smtpd_helo_restrictions=&lt;br /&gt;
        -o smtpd_sender_restrictions=&lt;br /&gt;
        -o smtpd_recipient_restrictions=permit_mynetworks,reject&lt;br /&gt;
        -o smtpd_data_restrictions=reject_unauth_pipelining&lt;br /&gt;
        -o smtpd_end_of_data_restrictions=&lt;br /&gt;
        -o mynetworks=127.0.0.0/8&lt;br /&gt;
        -o smtpd_error_sleep_time=0&lt;br /&gt;
        -o smtpd_soft_error_limit=1001&lt;br /&gt;
        -o smtpd_hard_error_limit=1000&lt;br /&gt;
        -o smtpd_client_connection_count_limit=0&lt;br /&gt;
        -o smtpd_client_connection_rate_limit=0&lt;br /&gt;
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also add the following two lines immediately below the &amp;quot;pickup&amp;quot; transport service:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        -o content_filter=&lt;br /&gt;
        -o receive_override_options=no_header_body_checks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reload postfix:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /etc/init.d/postfix reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now content filtering with spam and virus detection is enabled.&lt;br /&gt;
&lt;br /&gt;
== Setting DKIM email signature (Optional) ==&lt;br /&gt;
[http://en.wikipedia.org/wiki/DomainKeys_Identified_Mail DKIM] serves for verifing email sender. This can have disadvantage - if signed domain is blocked change of sendout server won't help much.&lt;br /&gt;
&lt;br /&gt;
=== SPF DNS record ===&lt;br /&gt;
[http://en.wikipedia.org/wiki/Sender_Policy_Framework SPF] record specify list of IP addresses that are official send out servers for your domain. Use soft fail rule &amp;lt;code&amp;gt;~all&amp;lt;/code&amp;gt; to support forwarding.&lt;br /&gt;
Add to DNS record (for GoDaddy its TXT section with host set to &amp;quot;@&amp;quot;).&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
v=spf1 ip4:207.210.202.96 ip4:64.186.145.28 ~all&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DKIM signing ===&lt;br /&gt;
We will use Amavis to sign outgoing emails [http://www.ijs.si/software/amavisd/amavisd-new-docs.html#dkim-impatient official documentation].&lt;br /&gt;
If setting dkim on SMTP only consider using  OpenDKIM, [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy install howto]&lt;br /&gt;
&lt;br /&gt;
All commands should be done as super user.&lt;br /&gt;
&lt;br /&gt;
If not existing create folder for certificate:&lt;br /&gt;
&amp;lt;c bash&amp;gt;&lt;br /&gt;
mkdir -p /var/db/dkim&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Generate certificate for domain:&lt;br /&gt;
&amp;lt;c bash&amp;gt;&lt;br /&gt;
amavisd-new genrsa /var/db/dkim/KEYNAME.key.pem&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;/etc/amavis/conf.d/50-User&amp;lt;/code&amp;gt; and enable signing. SELECTOR can be used to specify key for specific user or send location - we just use '&amp;lt;strong&amp;gt;default&amp;lt;/strong&amp;gt;'.&lt;br /&gt;
&amp;lt;c config&amp;gt;&lt;br /&gt;
$enable_dkim_signing = 1;&lt;br /&gt;
dkim_key('DOMAINNAME', 'SELECTOR', '/var/db/dkim/KEYNAME.key.pem');&lt;br /&gt;
@dkim_signature_options_bysender_maps = (&lt;br /&gt;
    { '.' =&amp;gt; { ttl =&amp;gt; 21*24*3600, c =&amp;gt; 'relaxed/simple' } } );&lt;br /&gt;
# uncomment to limit signing to specific IP&lt;br /&gt;
#@mynetworks = qw(0.0.0.0/8 127.0.0.0/8);;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mark all emails coming in throw port 10024 as '''originating''' so they are signed:&lt;br /&gt;
&amp;lt;c config&amp;gt;&lt;br /&gt;
$policy_bank{'ORIGINATING'} = {&lt;br /&gt;
  # indicates client is ours, allows signing&lt;br /&gt;
  originating =&amp;gt; 1,&lt;br /&gt;
  smtpd_discard_ehlo_keywords =&amp;gt; ['8BITMIME'],&lt;br /&gt;
};&lt;br /&gt;
# Use ORIGINATING policy to enable DKIM signing&lt;br /&gt;
$interface_policy{'10024'} = 'ORIGINATING';&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now get public key and publish it in DNS record:&lt;br /&gt;
&amp;lt;c config&amp;gt;&lt;br /&gt;
amavisd-new showkeys&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Copy down domain name with selector example (&amp;lt;code&amp;gt;default._domainkey.wisemarketing.com&amp;lt;/code&amp;gt;. For public key remove '&amp;quot;' and spaces to get something like:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
v=DKIM1; p=VERYLOOOOONGSTRING&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS record shoud be in TXT section with &amp;lt;code&amp;gt;default._domainkey&amp;lt;/code&amp;gt; as host followed by KEY data. See your specific provider howtos / forums.&lt;br /&gt;
&lt;br /&gt;
After key is published test if DNS record match Amavis settings&lt;br /&gt;
&amp;lt;c bash&amp;gt;&lt;br /&gt;
amavisd-new testkeys&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If test pass, restart Amavis&lt;br /&gt;
&amp;lt;c bash&amp;gt;&lt;br /&gt;
service amavis restart&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test send mail. It should have DKIM signature header.&lt;br /&gt;
&lt;br /&gt;
amavisd testkeys&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
First, test that the amavis SMTP is listening:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
telnet localhost 10024&lt;br /&gt;
Trying 127.0.0.1...&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
220 [127.0.0.1] ESMTP amavisd-new service ready&lt;br /&gt;
^]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On messages that go through the content filter you should see:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X-Virus-Scanned: Debian amavisd-new at mail.hostname.tld&lt;br /&gt;
X-Spam-Flag:&lt;br /&gt;
X-Spam-Score:&lt;br /&gt;
X-Spam-Level:&lt;br /&gt;
X-Spam-Status:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Done!&lt;/div&gt;</summary>
		<author><name>Garak</name></author>
	</entry>
</feed>