diff --git a/docker/amavis/Dockerfile b/docker/amavis/Dockerfile index 318b64e4..22e0ba10 100644 --- a/docker/amavis/Dockerfile +++ b/docker/amavis/Dockerfile @@ -1,46 +1,39 @@ -FROM almalinux:8 +FROM apheleia/almalinux8 -LABEL maintainer="contact@apheleia-it.ch" -LABEL dist=centos8 -LABEL tier=${TIER} - -ENV DISTRO=centos8 # ENV LANG=en_US.utf8 # ENV LC_ALL=en_US.utf8 # ENV APP_DOMAIN # ENV LMTP_DESTINATION # ENV DB_HOST # ENV DB_USERNAME # ENV DB_PASSWORD # ENV DB_DATABASE -# Add EPEL. -RUN dnf -y install dnf-plugin-config-manager && \ - dnf config-manager --set-enabled powertools && \ - dnf -y install epel-release && \ - rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8 && \ - dnf -y install \ +RUN dnf -y install \ amavis \ spamassassin \ clamav \ - clamav-update \ - procps-ng \ - iputils \ - bind-utils \ - vim-enhanced && \ + clamav-update && \ dnf clean all WORKDIR /root/ COPY /rootfs / -RUN mkdir -p /var/run/amavisd && \ - chmod -R 777 /var/run/amavisd && \ +RUN mkdir -p /var/run/amavisd /var/dkim && \ + chmod -R 777 /var/run/amavisd /var/dkim && \ mkdir -p /var/spool/amavisd && \ chmod 777 /var/spool/amavisd VOLUME [ "/var/spool/amavisd" ] +VOLUME [ "/var/lib/spamassassin" ] +VOLUME [ "/var/lib/clamav" ] +VOLUME [ "/var/dkim" ] + +ENV POSTFIX_HOST=postfix +ENV DKIM_IDENTIFIER=dkim20240318 +ENV DEBUG=false CMD ["/init.sh"] EXPOSE 13024/tcp diff --git a/docker/amavis/rootfs/etc/amavisd/amavisd.conf b/docker/amavis/rootfs/etc/amavisd/amavisd.conf new file mode 100644 index 00000000..a4766740 --- /dev/null +++ b/docker/amavis/rootfs/etc/amavisd/amavisd.conf @@ -0,0 +1,436 @@ +use strict; + +# a minimalistic configuration file for amavisd-new with all necessary settings +# +# see amavisd.conf-default for a list of all variables with their defaults; +# see amavisd.conf-sample for a traditional-style commented file; +# for more details see documentation in INSTALL, README_FILES/* +# and at http://www.ijs.si/software/amavisd/amavisd-new-docs.html + + +# COMMONLY ADJUSTED SETTINGS: + +# @bypass_virus_checks_maps = (1); # controls running of anti-virus code +# @bypass_spam_checks_maps = (1); # controls running of anti-spam code +# $bypass_decode_parts = 1; # controls running of decoders&dearchivers + +$max_servers = 2; # num of pre-forked children (2..30 is common), -m +$daemon_user = 'amavis'; # (no default; customary: vscan or amavis), -u +$daemon_group = 'amavis'; # (no default; customary: vscan or amavis), -g + +$mydomain = 'APP_DOMAIN'; # a convenient default for other settings +$myhostname = 'APP_DOMAIN'; # a convenient default for other settings + +$MYHOME = '/var/spool/amavisd'; # a convenient default for other settings, -H +$TEMPBASE = "$MYHOME/tmp"; # working directory, needs to exist, -T +$ENV{TMPDIR} = $TEMPBASE; # environment variable TMPDIR, used by SA, etc. +$QUARANTINEDIR = undef; # -Q +# $quarantine_subdir_levels = 1; # add level of subdirs to disperse quarantine +# $release_format = 'resend'; # 'attach', 'plain', 'resend' +# $report_format = 'arf'; # 'attach', 'plain', 'resend', 'arf' + +# $daemon_chroot_dir = $MYHOME; # chroot directory or undef, -R + +$db_home = "$MYHOME/db"; # dir for bdb nanny/cache/snmp databases, -D +# $helpers_home = "$MYHOME/var"; # working directory for SpamAssassin, -S +$lock_file = "/var/run/amavisd/amavisd.lock"; # -L +$pid_file = "/var/run/amavisd/amavisd.pid"; # -P +#NOTE: create directories $MYHOME/tmp, $MYHOME/var, $MYHOME/db manually + +$log_level = 2; # verbosity 0..5, -d +$sa_debug = 0; # 1 to enable +$log_recip_templ = undef; # disable by-recipient level-0 log entries + # choose from: emerg, alert, crit, err, warning, notice, info, debug + +$enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny) +$enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1 +$nanny_details_level = 2; # nanny verbosity: 1: traditional, 2: detailed +$enable_dkim_verification = 1; # enable DKIM signatures verification +$enable_dkim_signing = 1; # load DKIM signing code, keys defined by dkim_key + + +dkim_key( + 'APP_DOMAIN', + 'DKIM_IDENTIFIER', + '/var/dkim/APP_DOMAIN.DKIM_IDENTIFIER.pem' + ); + @dkim_signature_options_bysender_maps = ( { + "APP_DOMAIN" => { + d => 'APP_DOMAIN', + a => 'rsa-sha256', + # Use relaxed mode for body and headers, which normalizes the contents some (lowercasing, whitespace, ...) + c => 'relaxed/relaxed', + ttl => 10*24*3600 + } + } ); + +# $enable_ldap = 1; +# $default_ldap = { +# hostname => [ 'localhost' ], +# version => 3, +# timeout => 5, +# tls => 0, +# base => '$ldap_base_dn', +# query_filter => '$ldap_filter', +# bind_dn => '$ldap_bind_dn', +# bind_password => '$ldap_bind_pw' +# }; +# +#FIXME +# @lookup_sql_dsn = ( +# ['DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306', +# 'vimbadmin', +# 'password']); + +# $sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)'; + +@local_domains_maps = ( [".$mydomain"] ); # list of all local domains + +@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 + 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 ); + +$unix_socketname = "$MYHOME/amavisd.sock"; # amavisd-release or amavis-milter + # option(s) -p overrides $inet_socket_port and $unix_socketname + +$inet_socket_port = [13024,13026]; # listen on this local TCP port(s) +$inet_socket_bind = '0.0.0.0'; + +@inet_acl = qw(127.0.0.1 [::1] 172.16.0.0/12); + +$policy_bank{'MYNETS'} = { # mail originating from @mynetworks + originating => 1, # is true in MYNETS by default, but let's make it explicit + os_fingerprint_method => undef, # don't query p0f for internal clients +}; + +# it is up to MTA to re-route mail from authenticated roaming users or +# from internal hosts to a dedicated TCP port (such as 10026) for filtering +$interface_policy{'13026'} = 'ORIGINATING'; +$policy_bank{'ORIGINATING'} = { # mail supposedly originating from our users + originating => 1, # declare that mail was submitted by our smtp client + allow_disclaimers => 1, # enables disclaimer insertion if available + # notify administrator of locally originating malware + #virus_admin_maps => ["admin\@$mydomain"], + #spam_admin_maps => ["admin\@$mydomain"], + virus_admin_maps => undef, + spam_admin_maps => undef, + warnbadhsender => 1, + # forward to a smtpd service providing DKIM signing service + forward_method => 'smtp:[POSTFIX_HOST]:13025', + # force MTA conversion to 7-bit (e.g. before DKIM signing) + smtpd_discard_ehlo_keywords => ['8BITMIME'], + bypass_banned_checks_maps => [1], # allow sending any file names and types + terminate_dsn_on_notify_success => 0, # don't remove NOTIFY=SUCCESS option +}; + +$interface_policy{'SOCK'} = 'AM.PDP-SOCK'; # only applies with $unix_socketname + +# Use with amavis-release over a socket or with Petr Rehor's amavis-milter.c +# (with amavis-milter.c from this package or old amavis.c client use 'AM.CL'): +$policy_bank{'AM.PDP-SOCK'} = { + protocol => 'AM.PDP', + auth_required_release => 0, # do not require secret_id for amavisd-release +}; + +$sa_tag_level_deflt = -999; # add spam info headers if at, or above that level. We always add spam headers, since that includes our dkim validation results +$sa_tag2_level_deflt = 6.2; # add 'spam detected' headers at that level +$sa_kill_level_deflt = 6.9; # triggers spam evasive actions (e.g. blocks mail) +$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent +$sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From +# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off +$penpals_bonus_score = 8; # (no effect without a @storage_sql_dsn database) +$penpals_threshold_high = $sa_kill_level_deflt; # don't waste time on hi spam +$bounce_killer_score = 100; # spam score points to add for joe-jobbed bounces + +$sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger +$sa_local_tests_only = 0; # only tests which do not require internet access? + +# @lookup_sql_dsn = +# ( ['DBI:mysql:database=mail;host=127.0.0.1;port=3306', 'user1', 'passwd1'], +# ['DBI:mysql:database=mail;host=host2', 'username2', 'password2'], +# ["DBI:SQLite:dbname=$MYHOME/sql/mail_prefs.sqlite", '', ''] ); +# @storage_sql_dsn = @lookup_sql_dsn; # none, same, or separate database + +# $timestamp_fmt_mysql = 1; # if using MySQL *and* msgs.time_iso is TIMESTAMP; +# defaults to 0, which is good for non-MySQL or if msgs.time_iso is CHAR(16) + +$virus_admin = undef; # notifications recip. + +$mailfrom_notify_admin = undef; # notifications sender +$mailfrom_notify_recip = undef; # notifications sender +$mailfrom_notify_spamadmin = undef; # notifications sender +$mailfrom_to_quarantine = ''; # null return path; uses original sender if undef + +@addr_extension_virus_maps = ('virus'); +@addr_extension_banned_maps = ('banned'); +@addr_extension_spam_maps = ('spam'); +@addr_extension_bad_header_maps = ('badh'); +# $recipient_delimiter = '+'; # undef disables address extensions altogether +# when enabling addr extensions do also Postfix/main.cf: recipient_delimiter=+ + +$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin'; +# $dspam = 'dspam'; + +$MAXLEVELS = 14; +$MAXFILES = 1500; +$MIN_EXPANSION_QUOTA = 100*1024; # bytes (default undef, not enforced) +$MAX_EXPANSION_QUOTA = 300*1024*1024; # bytes (default undef, not enforced) + +$sa_spam_subject_tag = '***SPAM*** '; +$defang_virus = 1; # MIME-wrap passed infected mail +$defang_banned = 1; # MIME-wrap passed mail containing banned name +# for defanging bad headers only turn on certain minor contents categories: +$defang_by_ccat{+CC_BADH.",3"} = 1; # NUL or CR character in header +$defang_by_ccat{+CC_BADH.",5"} = 1; # header line longer than 998 characters +$defang_by_ccat{+CC_BADH.",6"} = 1; # header field syntax error + + +# OTHER MORE COMMON SETTINGS (defaults may suffice): + +$notify_method = 'smtp:[POSTFIX_HOST]:13025'; +$forward_method = 'smtp:[POSTFIX_HOST]:13025'; # set to undef with milter! + +$final_virus_destiny = D_DISCARD; +$final_banned_destiny = D_BOUNCE; +$final_spam_destiny = D_DISCARD; +$final_bad_header_destiny = D_BOUNCE; +# $bad_header_quarantine_method = undef; + +# $os_fingerprint_method = 'p0f:*:2345'; # to query p0f-analyzer.pl + +## hierarchy by which a final setting is chosen: +## policy bank (based on port or IP address) -> *_by_ccat +## *_by_ccat (based on mail contents) -> *_maps +## *_maps (based on recipient address) -> final configuration value + + +# SOME OTHER VARIABLES WORTH CONSIDERING (see amavisd.conf-default for all) + +# $warnbadhsender, +# $warnvirusrecip, $warnbannedrecip, $warnbadhrecip, (or @warn*recip_maps) +# +# @bypass_virus_checks_maps, @bypass_spam_checks_maps, +# @bypass_banned_checks_maps, @bypass_header_checks_maps, +# +# @virus_lovers_maps, @spam_lovers_maps, +# @banned_files_lovers_maps, @bad_header_lovers_maps, +# +# @blacklist_sender_maps, @score_sender_maps, +# +# $clean_quarantine_method, $virus_quarantine_to, $banned_quarantine_to, +# $bad_header_quarantine_to, $spam_quarantine_to, +# +# $defang_bad_header, $defang_undecipherable, $defang_spam + + +# REMAINING IMPORTANT VARIABLES ARE LISTED HERE BECAUSE OF LONGER ASSIGNMENTS + +@keep_decoded_original_maps = (new_RE( + qr'^MAIL\$', # retain full original message for virus checking + qr'^MAIL-UNDECIPHERABLE\$', # recheck full mail if it contains undecipherables + qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i, +# qr'^Zip archive data', # don't trust Archive::Zip +)); + + +# for $banned_namepath_re (a new-style of banned table) see amavisd.conf-sample + +$banned_filename_re = new_RE( + +### BLOCKED ANYWHERE +# qr'^UNDECIPHERABLE\$', # is or contains any undecipherable components + qr'^\.(exe-ms|dll)\$', # banned file(1) types, rudimentary +# qr'^\.(exe|lha|tnef|cab|dll)\$', # banned file(1) types + +### BLOCK THE FOLLOWING, EXCEPT WITHIN UNIX ARCHIVES: +# [ qr'^\.(gz|bz2)$' => 0 ], # allow any in gzip or bzip2 + [ qr'^\.(rpm|cpio|tar)\$' => 0 ], # allow any in Unix-type archives + + qr'.\.(pif|scr)$'i, # banned extensions - rudimentary +# qr'^\.zip$', # block zip type + +### BLOCK THE FOLLOWING, EXCEPT WITHIN ARCHIVES: +# [ qr'^\.(zip|rar|arc|arj|zoo)$'=> 0 ], # allow any within these archives + + qr'^application/x-msdownload\$'i, # block these MIME types + qr'^application/x-msdos-program\$'i, + qr'^application/hta\$'i, + +# qr'^message/partial$'i, # rfc2046 MIME type +# qr'^message/external-body$'i, # rfc2046 MIME type + +# qr'^(application/x-msmetafile|image/x-wmf)$'i, # Windows Metafile MIME type +# qr'^\.wmf$', # Windows Metafile file(1) type + + # block certain double extensions in filenames + qr'\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*\$'i, + +# qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?'i, # Class ID CLSID, strict +# qr'\{[0-9a-z]{4,}(-[0-9a-z]{4,}){0,7}\}?'i, # Class ID extension CLSID, loose + + qr'.\.(exe|vbs|pif|scr|cpl)\$'i, # banned extension - basic +# qr'.\.(exe|vbs|pif|scr|cpl|bat|cmd|com)$'i, # banned extension - basic+cmd +# qr'.\.(ade|adp|app|bas|bat|chm|cmd|com|cpl|crt|emf|exe|fxp|grp|hlp|hta| +# inf|ins|isp|js|jse|lnk|mda|mdb|mde|mdw|mdt|mdz|msc|msi|msp|mst| +# ops|pcd|pif|prg|reg|scr|sct|shb|shs|vb|vbe|vbs| +# wmf|wsc|wsf|wsh)$'ix, # banned ext - long +# qr'.\.(ani|cur|ico)$'i, # banned cursors and icons filename +# qr'^\.ani$', # banned animated cursor file(1) type + +# qr'.\.(mim|b64|bhx|hqx|xxe|uu|uue)$'i, # banned extension - WinZip vulnerab. +); +# See http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262631 +# and http://www.cknow.com/vtutor/vtextensions.htm + + +# ENVELOPE SENDER SOFT-WHITELISTING / SOFT-BLACKLISTING + +@score_sender_maps = ({ # a by-recipient hash lookup table, + # results from all matching recipient tables are summed + +# ## per-recipient personal tables (NOTE: positive: black, negative: white) +# 'user1@example.com' => [{'bla-mobile.press@example.com' => 10.0}], +# 'user3@example.com' => [{'.ebay.com' => -3.0}], +# 'user4@example.com' => [{'cleargreen@cleargreen.com' => -7.0, +# '.cleargreen.com' => -5.0}], + + ## site-wide opinions about senders (the '.' matches any recipient) + '.' => [ # the _first_ matching sender determines the score boost + + new_RE( # regexp-type lookup table, just happens to be all soft-blacklist + [qr'^(bulkmail|offers|cheapbenefits|earnmoney|foryou)@'i => 5.0], + [qr'^(greatcasino|investments|lose_weight_today|market\.alert)@'i=> 5.0], + [qr'^(money2you|MyGreenCard|new\.tld\.registry|opt-out|opt-in)@'i=> 5.0], + [qr'^(optin|saveonlsmoking2002k|specialoffer|specialoffers)@'i => 5.0], + [qr'^(stockalert|stopsnoring|wantsome|workathome|yesitsfree)@'i => 5.0], + [qr'^(your_friend|greatoffers)@'i => 5.0], + [qr'^(inkjetplanet|marketopt|MakeMoney)\d*@'i => 5.0], + ), + +# read_hash("/var/amavis/sender_scores_sitewide"), + + { # a hash-type lookup table (associative array) + 'nobody@cert.org' => -3.0, + 'cert-advisory@us-cert.gov' => -3.0, + 'owner-alert@iss.net' => -3.0, + 'slashdot@slashdot.org' => -3.0, + 'securityfocus.com' => -3.0, + 'ntbugtraq@listserv.ntbugtraq.com' => -3.0, + 'security-alerts@linuxsecurity.com' => -3.0, + 'mailman-announce-admin@python.org' => -3.0, + 'amavis-user-admin@lists.sourceforge.net'=> -3.0, + 'amavis-user-bounces@lists.sourceforge.net' => -3.0, + 'spamassassin.apache.org' => -3.0, + 'notification-return@lists.sophos.com' => -3.0, + 'owner-postfix-users@postfix.org' => -3.0, + 'owner-postfix-announce@postfix.org' => -3.0, + 'owner-sendmail-announce@lists.sendmail.org' => -3.0, + 'sendmail-announce-request@lists.sendmail.org' => -3.0, + 'donotreply@sendmail.org' => -3.0, + 'ca+envelope@sendmail.org' => -3.0, + 'noreply@freshmeat.net' => -3.0, + 'owner-technews@postel.acm.org' => -3.0, + 'ietf-123-owner@loki.ietf.org' => -3.0, + 'cvs-commits-list-admin@gnome.org' => -3.0, + 'rt-users-admin@lists.fsck.com' => -3.0, + 'clp-request@comp.nus.edu.sg' => -3.0, + 'surveys-errors@lists.nua.ie' => -3.0, + 'emailnews@genomeweb.com' => -5.0, + 'yahoo-dev-null@yahoo-inc.com' => -3.0, + 'returns.groups.yahoo.com' => -3.0, + 'clusternews@linuxnetworx.com' => -3.0, + lc('lvs-users-admin@LinuxVirtualServer.org') => -3.0, + lc('owner-textbreakingnews@CNNIMAIL12.CNN.COM') => -5.0, + + # soft-blacklisting (positive score) + 'sender@example.net' => 3.0, + '.example.net' => 1.0, + + }, + ], # end of site-wide tables +}); + + +@decoders = ( + ['mail', \&do_mime_decode], + ['asc', \&do_ascii], + ['uue', \&do_ascii], + ['hqx', \&do_ascii], + ['ync', \&do_ascii], + ['F', \&do_uncompress, ['unfreeze','freeze -d','melt','fcat'] ], + ['Z', \&do_uncompress, ['uncompress','gzip -d','zcat'] ], + ['gz', \&do_uncompress, 'gzip -d'], + ['gz', \&do_gunzip], + ['bz2', \&do_uncompress, 'bzip2 -d'], + ['lzo', \&do_uncompress, 'lzop -d'], + ['rpm', \&do_uncompress, ['rpm2cpio.pl','rpm2cpio'] ], + ['cpio', \&do_pax_cpio, ['pax','gcpio','cpio'] ], + ['tar', \&do_pax_cpio, ['pax','gcpio','cpio'] ], + ['deb', \&do_ar, 'ar'], +# ['a', \&do_ar, 'ar'], # unpacking .a seems an overkill + ['zip', \&do_unzip], + ['7z', \&do_7zip, ['7zr','7za','7z'] ], + ['rar', \&do_unrar, ['rar','unrar'] ], + ['arj', \&do_unarj, ['arj','unarj'] ], + ['arc', \&do_arc, ['nomarch','arc'] ], + ['zoo', \&do_zoo, ['zoo','unzoo'] ], + ['lha', \&do_lha, 'lha'], +# ['doc', \&do_ole, 'ripole'], + ['cab', \&do_cabextract, 'cabextract'], + ['tnef', \&do_tnef_ext, 'tnef'], + ['tnef', \&do_tnef], +# ['sit', \&do_unstuff, 'unstuff'], # broken/unsafe decoder + ['exe', \&do_executable, ['rar','unrar'], 'lha', ['arj','unarj'] ], +); + + +@av_scanners = ( + +### http://www.clamav.net/ +['ClamAV-clamd', + \&ask_daemon, ["CONTSCAN {}\n", "/var/run/amavisd/clamd.sock"], + qr/\bOK$/m, qr/\bFOUND$/m, + qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ], +# NOTE: run clamd under the same user as amavisd, or run it under its own +# uid such as clamav, add user clamav to the amavis group, and then add +# AllowSupplementaryGroups to clamd.conf; +# NOTE: match socket name (LocalSocket) in clamav.conf to the socket name in +# this entry; when running chrooted one may prefer socket "$MYHOME/clamd". + +# ### http://www.clamav.net/ and CPAN (memory-hungry! clamd is preferred) +# # note that Mail::ClamAV requires perl to be build with threading! +# ['Mail::ClamAV', \&ask_clamav, "*", [0], [1], qr/^INFECTED: (.+)/m ], + +# ['File::Scan', sub {Amavis::AV::ask_av(sub{ +# use File::Scan; my($fn)=@_; +# my($f)=File::Scan->new(max_txt_size=>0, max_bin_size=>0); +# my($vname) = $f->scan($fn); +# $f->error ? (2,"Error: ".$f->error) +# : ($vname ne '') ? (1,"$vname FOUND") : (0,"Clean")}, @_) }, +# ["{}/*"], [0], [1], qr/^(.*) FOUND$/m ], + +# ### fully-fledged checker for JPEG marker segments of invalid length +# ['check-jpeg', +# sub { use JpegTester (); Amavis::AV::ask_av(\&JpegTester::test_jpeg, @_) }, +# ["{}/*"], undef, [1], qr/^(bad jpeg: .*)$/m ], +# # NOTE: place file JpegTester.pm somewhere where Perl can find it, +# # for example in /usr/local/lib/perl5/site_perl + +); + + +@av_scanners_backup = ( + + ### http://www.clamav.net/ - backs up clamd or Mail::ClamAV + ['ClamAV-clamscan', 'clamscan', + "--stdout --no-summary -r --tempdir=$TEMPBASE {}", + [0], qr/:.*\sFOUND$/m, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ], + +# Always succeeds and considers mail clean. +# Potentially useful when all other scanners fail and it is desirable +# to let mail continue to flow with no virus checking (when uncommented). +# ['always-clean', sub {0}], + +); + + +1; # insure a defined return value diff --git a/docker/amavis/rootfs/etc/clam.d/amavisd.conf b/docker/amavis/rootfs/etc/clam.d/amavisd.conf deleted file mode 100644 index 39c35a94..00000000 --- a/docker/amavis/rootfs/etc/clam.d/amavisd.conf +++ /dev/null @@ -1,796 +0,0 @@ -use strict; - -# a minimalistic configuration file for amavisd-new with all necessary settings -# -# see amavisd.conf-default for a list of all variables with their defaults; -# see amavisd.conf-sample for a traditional-style commented file; -# for more details see documentation in INSTALL, README_FILES/* -# and at http://www.ijs.si/software/amavisd/amavisd-new-docs.html - - -# COMMONLY ADJUSTED SETTINGS: - -# @bypass_virus_checks_maps = (1); # controls running of anti-virus code -# @bypass_spam_checks_maps = (1); # controls running of anti-spam code -# $bypass_decode_parts = 1; # controls running of decoders&dearchivers - -$max_servers = 2; # num of pre-forked children (2..30 is common), -m -$daemon_user = 'amavis'; # (no default; customary: vscan or amavis), -u -$daemon_group = 'amavis'; # (no default; customary: vscan or amavis), -g - -$mydomain = 'APP_DOMAIN'; # a convenient default for other settings -$myhostname = 'APP_DOMAIN'; # a convenient default for other settings - -$MYHOME = '/var/spool/amavisd'; # a convenient default for other settings, -H -$TEMPBASE = "$MYHOME/tmp"; # working directory, needs to exist, -T -$ENV{TMPDIR} = $TEMPBASE; # environment variable TMPDIR, used by SA, etc. -$QUARANTINEDIR = undef; # -Q -# $quarantine_subdir_levels = 1; # add level of subdirs to disperse quarantine -# $release_format = 'resend'; # 'attach', 'plain', 'resend' -# $report_format = 'arf'; # 'attach', 'plain', 'resend', 'arf' - -# $daemon_chroot_dir = $MYHOME; # chroot directory or undef, -R - -$db_home = "$MYHOME/db"; # dir for bdb nanny/cache/snmp databases, -D -# $helpers_home = "$MYHOME/var"; # working directory for SpamAssassin, -S -$lock_file = "/var/run/amavisd/amavisd.lock"; # -L -$pid_file = "/var/run/amavisd/amavisd.pid"; # -P -#NOTE: create directories $MYHOME/tmp, $MYHOME/var, $MYHOME/db manually - -$log_level = 9; # verbosity 0..5, -d -$log_recip_templ = undef; # disable by-recipient level-0 log entries - # choose from: emerg, alert, crit, err, warning, notice, info, debug - -$enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny) -$enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1 -$nanny_details_level = 2; # nanny verbosity: 1: traditional, 2: detailed -$enable_dkim_verification = 1; # enable DKIM signatures verification -$enable_dkim_signing = 1; # load DKIM signing code, keys defined by dkim_key - -# $enable_ldap = 1; -# $default_ldap = { -# hostname => [ 'localhost' ], -# version => 3, -# timeout => 5, -# tls => 0, -# base => '$ldap_base_dn', -# query_filter => '$ldap_filter', -# bind_dn => '$ldap_bind_dn', -# bind_password => '$ldap_bind_pw' -# }; -# -#FIXME -# @lookup_sql_dsn = ( -# ['DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306', -# 'vimbadmin', -# 'password']); - -# $sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)'; - -@local_domains_maps = ( [".$mydomain"] ); # list of all local domains - -@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 - 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 ); - -$unix_socketname = "$MYHOME/amavisd.sock"; # amavisd-release or amavis-milter - # option(s) -p overrides $inet_socket_port and $unix_socketname - -$inet_socket_port = 13024; # listen on this local TCP port(s) -# $inet_socket_port = [10024,10026]; # listen on multiple TCP ports - -$policy_bank{'MYNETS'} = { # mail originating from @mynetworks - originating => 1, # is true in MYNETS by default, but let's make it explicit - os_fingerprint_method => undef, # don't query p0f for internal clients -}; - -# it is up to MTA to re-route mail from authenticated roaming users or -# from internal hosts to a dedicated TCP port (such as 10026) for filtering -$interface_policy{'10026'} = 'ORIGINATING'; - -$policy_bank{'ORIGINATING'} = { # mail supposedly originating from our users - originating => 1, # declare that mail was submitted by our smtp client - allow_disclaimers => 1, # enables disclaimer insertion if available - # notify administrator of locally originating malware - virus_admin_maps => ["virusalert\@$mydomain"], - spam_admin_maps => ["virusalert\@$mydomain"], - warnbadhsender => 1, - # forward to a smtpd service providing DKIM signing service - forward_method => 'smtp:[127.0.0.1]:10027', - # force MTA conversion to 7-bit (e.g. before DKIM signing) - smtpd_discard_ehlo_keywords => ['8BITMIME'], - bypass_banned_checks_maps => [1], # allow sending any file names and types - terminate_dsn_on_notify_success => 0, # don't remove NOTIFY=SUCCESS option -}; - -$interface_policy{'SOCK'} = 'AM.PDP-SOCK'; # only applies with $unix_socketname - -# Use with amavis-release over a socket or with Petr Rehor's amavis-milter.c -# (with amavis-milter.c from this package or old amavis.c client use 'AM.CL'): -$policy_bank{'AM.PDP-SOCK'} = { - protocol => 'AM.PDP', - auth_required_release => 0, # do not require secret_id for amavisd-release -}; - -$sa_tag_level_deflt = -10; # add spam info headers if at, or above that level -$sa_tag2_level_deflt = 6.2; # add 'spam detected' headers at that level -$sa_kill_level_deflt = 6.9; # triggers spam evasive actions (e.g. blocks mail) -$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent -$sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From -# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off -$penpals_bonus_score = 8; # (no effect without a @storage_sql_dsn database) -$penpals_threshold_high = $sa_kill_level_deflt; # don't waste time on hi spam -$bounce_killer_score = 100; # spam score points to add for joe-jobbed bounces - -$sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger -$sa_local_tests_only = 0; # only tests which do not require internet access? - -# @lookup_sql_dsn = -# ( ['DBI:mysql:database=mail;host=127.0.0.1;port=3306', 'user1', 'passwd1'], -# ['DBI:mysql:database=mail;host=host2', 'username2', 'password2'], -# ["DBI:SQLite:dbname=$MYHOME/sql/mail_prefs.sqlite", '', ''] ); -# @storage_sql_dsn = @lookup_sql_dsn; # none, same, or separate database - -# $timestamp_fmt_mysql = 1; # if using MySQL *and* msgs.time_iso is TIMESTAMP; -# defaults to 0, which is good for non-MySQL or if msgs.time_iso is CHAR(16) - -$virus_admin = undef; # notifications recip. - -$mailfrom_notify_admin = undef; # notifications sender -$mailfrom_notify_recip = undef; # notifications sender -$mailfrom_notify_spamadmin = undef; # notifications sender -$mailfrom_to_quarantine = ''; # null return path; uses original sender if undef - -@addr_extension_virus_maps = ('virus'); -@addr_extension_banned_maps = ('banned'); -@addr_extension_spam_maps = ('spam'); -@addr_extension_bad_header_maps = ('badh'); -# $recipient_delimiter = '+'; # undef disables address extensions altogether -# when enabling addr extensions do also Postfix/main.cf: recipient_delimiter=+ - -$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin'; -# $dspam = 'dspam'; - -$MAXLEVELS = 14; -$MAXFILES = 1500; -$MIN_EXPANSION_QUOTA = 100*1024; # bytes (default undef, not enforced) -$MAX_EXPANSION_QUOTA = 300*1024*1024; # bytes (default undef, not enforced) - -$sa_spam_subject_tag = '***SPAM*** '; -$defang_virus = 1; # MIME-wrap passed infected mail -$defang_banned = 1; # MIME-wrap passed mail containing banned name -# for defanging bad headers only turn on certain minor contents categories: -$defang_by_ccat{+CC_BADH.",3"} = 1; # NUL or CR character in header -$defang_by_ccat{+CC_BADH.",5"} = 1; # header line longer than 998 characters -$defang_by_ccat{+CC_BADH.",6"} = 1; # header field syntax error - - -# OTHER MORE COMMON SETTINGS (defaults may suffice): - -# $myhostname = 'host.example.com'; # must be a fully-qualified domain name! - -# $notify_method = 'smtp:[127.0.0.1]:10025'; -# $forward_method = 'smtp:[127.0.0.1]:10025'; # set to undef with milter! - -$final_virus_destiny = D_DISCARD; -$final_banned_destiny = D_BOUNCE; -$final_spam_destiny = D_DISCARD; -$final_bad_header_destiny = D_BOUNCE; -# $bad_header_quarantine_method = undef; - -# $os_fingerprint_method = 'p0f:*:2345'; # to query p0f-analyzer.pl - -## hierarchy by which a final setting is chosen: -## policy bank (based on port or IP address) -> *_by_ccat -## *_by_ccat (based on mail contents) -> *_maps -## *_maps (based on recipient address) -> final configuration value - - -# SOME OTHER VARIABLES WORTH CONSIDERING (see amavisd.conf-default for all) - -# $warnbadhsender, -# $warnvirusrecip, $warnbannedrecip, $warnbadhrecip, (or @warn*recip_maps) -# -# @bypass_virus_checks_maps, @bypass_spam_checks_maps, -# @bypass_banned_checks_maps, @bypass_header_checks_maps, -# -# @virus_lovers_maps, @spam_lovers_maps, -# @banned_files_lovers_maps, @bad_header_lovers_maps, -# -# @blacklist_sender_maps, @score_sender_maps, -# -# $clean_quarantine_method, $virus_quarantine_to, $banned_quarantine_to, -# $bad_header_quarantine_to, $spam_quarantine_to, -# -# $defang_bad_header, $defang_undecipherable, $defang_spam - - -# REMAINING IMPORTANT VARIABLES ARE LISTED HERE BECAUSE OF LONGER ASSIGNMENTS - -@keep_decoded_original_maps = (new_RE( - qr'^MAIL\$', # retain full original message for virus checking - qr'^MAIL-UNDECIPHERABLE\$', # recheck full mail if it contains undecipherables - qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i, -# qr'^Zip archive data', # don't trust Archive::Zip -)); - - -# for $banned_namepath_re (a new-style of banned table) see amavisd.conf-sample - -$banned_filename_re = new_RE( - -### BLOCKED ANYWHERE -# qr'^UNDECIPHERABLE\$', # is or contains any undecipherable components - qr'^\.(exe-ms|dll)\$', # banned file(1) types, rudimentary -# qr'^\.(exe|lha|tnef|cab|dll)\$', # banned file(1) types - -### BLOCK THE FOLLOWING, EXCEPT WITHIN UNIX ARCHIVES: -# [ qr'^\.(gz|bz2)$' => 0 ], # allow any in gzip or bzip2 - [ qr'^\.(rpm|cpio|tar)\$' => 0 ], # allow any in Unix-type archives - - qr'.\.(pif|scr)$'i, # banned extensions - rudimentary -# qr'^\.zip$', # block zip type - -### BLOCK THE FOLLOWING, EXCEPT WITHIN ARCHIVES: -# [ qr'^\.(zip|rar|arc|arj|zoo)$'=> 0 ], # allow any within these archives - - qr'^application/x-msdownload\$'i, # block these MIME types - qr'^application/x-msdos-program\$'i, - qr'^application/hta\$'i, - -# qr'^message/partial$'i, # rfc2046 MIME type -# qr'^message/external-body$'i, # rfc2046 MIME type - -# qr'^(application/x-msmetafile|image/x-wmf)$'i, # Windows Metafile MIME type -# qr'^\.wmf$', # Windows Metafile file(1) type - - # block certain double extensions in filenames - qr'\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*\$'i, - -# qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?'i, # Class ID CLSID, strict -# qr'\{[0-9a-z]{4,}(-[0-9a-z]{4,}){0,7}\}?'i, # Class ID extension CLSID, loose - - qr'.\.(exe|vbs|pif|scr|cpl)\$'i, # banned extension - basic -# qr'.\.(exe|vbs|pif|scr|cpl|bat|cmd|com)$'i, # banned extension - basic+cmd -# qr'.\.(ade|adp|app|bas|bat|chm|cmd|com|cpl|crt|emf|exe|fxp|grp|hlp|hta| -# inf|ins|isp|js|jse|lnk|mda|mdb|mde|mdw|mdt|mdz|msc|msi|msp|mst| -# ops|pcd|pif|prg|reg|scr|sct|shb|shs|vb|vbe|vbs| -# wmf|wsc|wsf|wsh)$'ix, # banned ext - long -# qr'.\.(ani|cur|ico)$'i, # banned cursors and icons filename -# qr'^\.ani$', # banned animated cursor file(1) type - -# qr'.\.(mim|b64|bhx|hqx|xxe|uu|uue)$'i, # banned extension - WinZip vulnerab. -); -# See http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262631 -# and http://www.cknow.com/vtutor/vtextensions.htm - - -# ENVELOPE SENDER SOFT-WHITELISTING / SOFT-BLACKLISTING - -@score_sender_maps = ({ # a by-recipient hash lookup table, - # results from all matching recipient tables are summed - -# ## per-recipient personal tables (NOTE: positive: black, negative: white) -# 'user1@example.com' => [{'bla-mobile.press@example.com' => 10.0}], -# 'user3@example.com' => [{'.ebay.com' => -3.0}], -# 'user4@example.com' => [{'cleargreen@cleargreen.com' => -7.0, -# '.cleargreen.com' => -5.0}], - - ## site-wide opinions about senders (the '.' matches any recipient) - '.' => [ # the _first_ matching sender determines the score boost - - new_RE( # regexp-type lookup table, just happens to be all soft-blacklist - [qr'^(bulkmail|offers|cheapbenefits|earnmoney|foryou)@'i => 5.0], - [qr'^(greatcasino|investments|lose_weight_today|market\.alert)@'i=> 5.0], - [qr'^(money2you|MyGreenCard|new\.tld\.registry|opt-out|opt-in)@'i=> 5.0], - [qr'^(optin|saveonlsmoking2002k|specialoffer|specialoffers)@'i => 5.0], - [qr'^(stockalert|stopsnoring|wantsome|workathome|yesitsfree)@'i => 5.0], - [qr'^(your_friend|greatoffers)@'i => 5.0], - [qr'^(inkjetplanet|marketopt|MakeMoney)\d*@'i => 5.0], - ), - -# read_hash("/var/amavis/sender_scores_sitewide"), - - { # a hash-type lookup table (associative array) - 'nobody@cert.org' => -3.0, - 'cert-advisory@us-cert.gov' => -3.0, - 'owner-alert@iss.net' => -3.0, - 'slashdot@slashdot.org' => -3.0, - 'securityfocus.com' => -3.0, - 'ntbugtraq@listserv.ntbugtraq.com' => -3.0, - 'security-alerts@linuxsecurity.com' => -3.0, - 'mailman-announce-admin@python.org' => -3.0, - 'amavis-user-admin@lists.sourceforge.net'=> -3.0, - 'amavis-user-bounces@lists.sourceforge.net' => -3.0, - 'spamassassin.apache.org' => -3.0, - 'notification-return@lists.sophos.com' => -3.0, - 'owner-postfix-users@postfix.org' => -3.0, - 'owner-postfix-announce@postfix.org' => -3.0, - 'owner-sendmail-announce@lists.sendmail.org' => -3.0, - 'sendmail-announce-request@lists.sendmail.org' => -3.0, - 'donotreply@sendmail.org' => -3.0, - 'ca+envelope@sendmail.org' => -3.0, - 'noreply@freshmeat.net' => -3.0, - 'owner-technews@postel.acm.org' => -3.0, - 'ietf-123-owner@loki.ietf.org' => -3.0, - 'cvs-commits-list-admin@gnome.org' => -3.0, - 'rt-users-admin@lists.fsck.com' => -3.0, - 'clp-request@comp.nus.edu.sg' => -3.0, - 'surveys-errors@lists.nua.ie' => -3.0, - 'emailnews@genomeweb.com' => -5.0, - 'yahoo-dev-null@yahoo-inc.com' => -3.0, - 'returns.groups.yahoo.com' => -3.0, - 'clusternews@linuxnetworx.com' => -3.0, - lc('lvs-users-admin@LinuxVirtualServer.org') => -3.0, - lc('owner-textbreakingnews@CNNIMAIL12.CNN.COM') => -5.0, - - # soft-blacklisting (positive score) - 'sender@example.net' => 3.0, - '.example.net' => 1.0, - - }, - ], # end of site-wide tables -}); - - -@decoders = ( - ['mail', \&do_mime_decode], - ['asc', \&do_ascii], - ['uue', \&do_ascii], - ['hqx', \&do_ascii], - ['ync', \&do_ascii], - ['F', \&do_uncompress, ['unfreeze','freeze -d','melt','fcat'] ], - ['Z', \&do_uncompress, ['uncompress','gzip -d','zcat'] ], - ['gz', \&do_uncompress, 'gzip -d'], - ['gz', \&do_gunzip], - ['bz2', \&do_uncompress, 'bzip2 -d'], - ['lzo', \&do_uncompress, 'lzop -d'], - ['rpm', \&do_uncompress, ['rpm2cpio.pl','rpm2cpio'] ], - ['cpio', \&do_pax_cpio, ['pax','gcpio','cpio'] ], - ['tar', \&do_pax_cpio, ['pax','gcpio','cpio'] ], - ['deb', \&do_ar, 'ar'], -# ['a', \&do_ar, 'ar'], # unpacking .a seems an overkill - ['zip', \&do_unzip], - ['7z', \&do_7zip, ['7zr','7za','7z'] ], - ['rar', \&do_unrar, ['rar','unrar'] ], - ['arj', \&do_unarj, ['arj','unarj'] ], - ['arc', \&do_arc, ['nomarch','arc'] ], - ['zoo', \&do_zoo, ['zoo','unzoo'] ], - ['lha', \&do_lha, 'lha'], -# ['doc', \&do_ole, 'ripole'], - ['cab', \&do_cabextract, 'cabextract'], - ['tnef', \&do_tnef_ext, 'tnef'], - ['tnef', \&do_tnef], -# ['sit', \&do_unstuff, 'unstuff'], # broken/unsafe decoder - ['exe', \&do_executable, ['rar','unrar'], 'lha', ['arj','unarj'] ], -); - - -@av_scanners = ( - -# ### http://www.clanfield.info/sophie/ (http://www.vanja.com/tools/sophie/) -# ['Sophie', -# \&ask_daemon, ["{}/\n", '/var/run/sophie'], -# qr/(?x)^ 0+ ( : | [\000\r\n]* $)/m, qr/(?x)^ 1 ( : | [\000\r\n]* $)/m, -# qr/(?x)^ [-+]? \d+ : (.*?) [\000\r\n]* $/m ], - -# ### http://www.csupomona.edu/~henson/www/projects/SAVI-Perl/ -# ['Sophos SAVI', \&sophos_savi ], - -#FIXME -# ### http://www.clamav.net/ -# ['ClamAV-clamd', -# \&ask_daemon, ["CONTSCAN {}\n", "$clamdsock"], -# qr/\bOK$/m, qr/\bFOUND$/m, -# qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ], -# # NOTE: run clamd under the same user as amavisd, or run it under its own -# # uid such as clamav, add user clamav to the amavis group, and then add -# # AllowSupplementaryGroups to clamd.conf; -# # NOTE: match socket name (LocalSocket) in clamav.conf to the socket name in -# # this entry; when running chrooted one may prefer socket "$MYHOME/clamd". - -# ### http://www.clamav.net/ and CPAN (memory-hungry! clamd is preferred) -# # note that Mail::ClamAV requires perl to be build with threading! -# ['Mail::ClamAV', \&ask_clamav, "*", [0], [1], qr/^INFECTED: (.+)/m ], - -# ### http://www.openantivirus.org/ -# ['OpenAntiVirus ScannerDaemon (OAV)', -# \&ask_daemon, ["SCAN {}\n", '127.0.0.1:8127'], -# qr/^OK/m, qr/^FOUND: /m, qr/^FOUND: (.+)/m ], - -# ### http://www.vanja.com/tools/trophie/ -# ['Trophie', -# \&ask_daemon, ["{}/\n", '/var/run/trophie'], -# qr/(?x)^ 0+ ( : | [\000\r\n]* $)/m, qr/(?x)^ 1 ( : | [\000\r\n]* $)/m, -# qr/(?x)^ [-+]? \d+ : (.*?) [\000\r\n]* $/m ], - -# ### http://www.grisoft.com/ -# ['AVG Anti-Virus', -# \&ask_daemon, ["SCAN {}\n", '127.0.0.1:55555'], -# qr/^200/m, qr/^403/m, qr/^403 .*?: ([^\r\n]+)/m ], - -# ### http://www.f-prot.com/ -# ['F-Prot fpscand', # F-PROT Antivirus for BSD/Linux/Solaris, version 6 -# \&ask_daemon, -# ["SCAN FILE {}/*\n", '127.0.0.1:10200'], -# qr/^(0|8|64) /m, -# qr/^([1235679]|1[01345]) |<[^>:]*(?i)(infected|suspicious|unwanted)/m, -# qr/(?i)<[^>:]*(?:infected|suspicious|unwanted)[^>:]*: ([^>]*)>/m ], - -# ### http://www.f-prot.com/ -# ['F-Prot f-protd', # old version -# \&ask_daemon, -# ["GET {}/*?-dumb%20-archive%20-packed HTTP/1.0\r\n\r\n", -# ['127.0.0.1:10200', '127.0.0.1:10201', '127.0.0.1:10202', -# '127.0.0.1:10203', '127.0.0.1:10204'] ], -# qr/(?i)]*>clean<\/summary>/m, -# qr/(?i)]*>infected<\/summary>/m, -# qr/(?i)(.+)<\/name>/m ], - -# ### http://www.sald.com/, http://www.dials.ru/english/, http://www.drweb.ru/ -# ['DrWebD', \&ask_daemon, # DrWebD 4.31 or later -# [pack('N',1). # DRWEBD_SCAN_CMD -# pack('N',0x00280001). # DONT_CHANGEMAIL, IS_MAIL, RETURN_VIRUSES -# pack('N', # path length -# length("$TEMPBASE/amavis-yyyymmddTHHMMSS-xxxxx/parts/pxxx")). -# '{}/*'. # path -# pack('N',0). # content size -# pack('N',0), -# '/var/drweb/run/drwebd.sock', -# # '/var/amavis/var/run/drwebd.sock', # suitable for chroot -# # '/usr/local/drweb/run/drwebd.sock', # FreeBSD drweb ports default -# # '127.0.0.1:3000', # or over an inet socket -# ], -# qr/\A\x00[\x10\x11][\x00\x10]\x00/sm, # IS_CLEAN,EVAL_KEY; SKIPPED -# qr/\A\x00[\x00\x01][\x00\x10][\x20\x40\x80]/sm,# KNOWN_V,UNKNOWN_V,V._MODIF -# qr/\A.{12}(?:infected with )?([^\x00]+)\x00/sm, -# ], -# # NOTE: If using amavis-milter, change length to: -# # length("$TEMPBASE/amavis-milter-xxxxxxxxxxxxxx/parts/pxxx"). - - ## http://www.kaspersky.com/ (kav4mailservers) - ['KasperskyLab AVP - aveclient', - ['/usr/local/kav/bin/aveclient','/usr/local/share/kav/bin/aveclient', - '/opt/kav/5.5/kav4mailservers/bin/aveclient','aveclient'], - '-p /var/run/aveserver -s {}/*', - [0,3,6,8], qr/\b(INFECTED|SUSPICION|SUSPICIOUS)\b/m, - qr/(?:INFECTED|WARNING|SUSPICION|SUSPICIOUS) (.+)/m, - ], - # NOTE: one may prefer [0],[2,3,4,5], depending on how suspicious, - # currupted or protected archives are to be handled - - ## http://www.kaspersky.com/ - ['KasperskyLab AntiViral Toolkit Pro (AVP)', ['avp'], - '-* -P -B -Y -O- {}', [0,3,6,8], [2,4], # any use for -A -K ? - qr/infected: (.+)/m, - sub {chdir('/opt/AVP') or die "Can't chdir to AVP: $!"}, - sub {chdir($TEMPBASE) or die "Can't chdir back to $TEMPBASE $!"}, - ], - - ## The kavdaemon and AVPDaemonClient have been removed from Kasperky - ## products and replaced by aveserver and aveclient - ['KasperskyLab AVPDaemonClient', - [ '/opt/AVP/kavdaemon', 'kavdaemon', - '/opt/AVP/AvpDaemonClient', 'AvpDaemonClient', - '/opt/AVP/AvpTeamDream', 'AvpTeamDream', - '/opt/AVP/avpdc', 'avpdc' ], - "-f=$TEMPBASE {}", [0,8], [3,4,5,6], qr/infected: ([^\r\n]+)/m ], - # change the startup-script in /etc/init.d/kavd to: - # DPARMS="-* -Y -dl -f=/var/amavis /var/amavis" - # (or perhaps: DPARMS="-I0 -Y -* /var/amavis" ) - # adjusting /var/amavis above to match your $TEMPBASE. - # The '-f=/var/amavis' is needed if not running it as root, so it - # can find, read, and write its pid file, etc., see 'man kavdaemon'. - # defUnix.prf: there must be an entry "*/var/amavis" (or whatever - # directory $TEMPBASE specifies) in the 'Names=' section. - # cd /opt/AVP/DaemonClients; configure; cd Sample; make - # cp AvpDaemonClient /opt/AVP/ - # su - vscan -c "${PREFIX}/kavdaemon ${DPARMS}" - - ## http://www.centralcommand.com/ - ['CentralCommand Vexira (new) vascan', - ['vascan','/usr/lib/Vexira/vascan'], - "-a s --timeout=60 --temp=$TEMPBASE -y $QUARANTINEDIR ". - "--log=/var/log/vascan.log {}", - [0,3], [1,2,5], - qr/(?x)^\s* (?:virus|iworm|macro|mutant|sequence|trojan)\ found:\ ( [^\]\s']+ )\ \.\.\.\ /m ], - # Adjust the path of the binary and the virus database as needed. - # 'vascan' does not allow to have the temp directory to be the same as - # the quarantine directory, and the quarantine option can not be disabled. - # If $QUARANTINEDIR is not used, then another directory must be specified - # to appease 'vascan'. Move status 3 to the second list if password - # protected files are to be considered infected. - - ## http://www.avira.com/ - ## Avira AntiVir (formerly H+BEDV) or (old) CentralCommand Vexira Antivirus - ['Avira AntiVir', ['antivir','vexira'], - '--allfiles -noboot -nombr -rs -s -z {}', [0], qr/ALERT:|VIRUS:/m, - qr/(?x)^\s* (?: ALERT: \s* (?: \[ | [^']* ' ) | - (?i) VIRUS:\ .*?\ virus\ '?) ( [^\]\s']+ )/m ], - # NOTE: if you only have a demo version, remove -z and add 214, as in: - # '--allfiles -noboot -nombr -rs -s {}', [0,214], qr/ALERT:|VIRUS:/, - - ## http://www.commandsoftware.com/ - ['Command AntiVirus for Linux', 'csav', - '-all -archive -packed {}', [50], [51,52,53], - qr/Infection: (.+)/m ], - - ## http://www.symantec.com/ - ['Symantec CarrierScan via Symantec CommandLineScanner', - 'cscmdline', '-a scan -i 1 -v -s 127.0.0.1:7777 {}', - qr/^Files Infected:\s+0$/m, qr/^Infected\b/m, - qr/^(?:Info|Virus Name):\s+(.+)/m ], - - ## http://www.symantec.com/ - ['Symantec AntiVirus Scan Engine', - 'savsecls', '-server 127.0.0.1:7777 -mode scanrepair -details -verbose {}', - [0], qr/^Infected\b/m, - qr/^(?:Info|Virus Name):\s+(.+)/m ], - # NOTE: check options and patterns to see which entry better applies - -# ## http://www.f-secure.com/products/anti-virus/ version 4.65 -# ['F-Secure Antivirus for Linux servers', -# ['/opt/f-secure/fsav/bin/fsav', 'fsav'], -# '--delete=no --disinf=no --rename=no --archive=yes --auto=yes '. -# '--dumb=yes --list=no --mime=yes {}', [0], [3,6,8], -# qr/(?:infection|Infected|Suspected): (.+)/m ], - - ## http://www.f-secure.com/products/anti-virus/ version 5.52 - ['F-Secure Antivirus for Linux servers', - ['/opt/f-secure/fsav/bin/fsav', 'fsav'], - '--virus-action1=report --archive=yes --auto=yes '. - '--dumb=yes --list=no --mime=yes {}', [0], [3,4,6,8], - qr/(?:infection|Infected|Suspected|Riskware): (.+)/m ], - # NOTE: internal archive handling may be switched off by '--archive=no' - # to prevent fsav from exiting with status 9 on broken archives - -# ## http://www.avast.com/ -# ['avast! Antivirus daemon', -# \&ask_daemon, # greets with 220, terminate with QUIT -# ["SCAN {}\015\012QUIT\015\012", '/var/run/avast4/mailscanner.sock'], -# qr/\t\[\+\]/m, qr/\t\[L\]\t/m, qr/\t\[L\]\t([^[ \t\015\012]+)/m ], - -# ## http://www.avast.com/ -# ['avast! Antivirus - Client/Server Version', 'avastlite', -# '-a /var/run/avast4/mailscanner.sock -n {}', [0], [1], -# qr/\t\[L\]\t([^[ \t\015\012]+)/m ], - - ['CAI InoculateIT', 'inocucmd', # retired product - '-sec -nex {}', [0], [100], - qr/was infected by virus (.+)/m ], - # see: http://www.flatmtn.com/computer/Linux-Antivirus_CAI.html - - ## http://www3.ca.com/Solutions/Product.asp?ID=156 (ex InoculateIT) - ['CAI eTrust Antivirus', 'etrust-wrapper', - '-arc -nex -spm h {}', [0], [101], - qr/is infected by virus: (.+)/m ], - # NOTE: requires suid wrapper around inocmd32; consider flag: -mod reviewer - # see http://marc.theaimsgroup.com/?l=amavis-user&m=109229779912783 - - ## http://mks.com.pl/english.html - ['MkS_Vir for Linux (beta)', ['mks32','mks'], - '-s {}/*', [0], [1,2], - qr/--[ \t]*(.+)/m ], - - ## http://mks.com.pl/english.html - ['MkS_Vir daemon', 'mksscan', - '-s -q {}', [0], [1..7], - qr/^... (\S+)/m ], - -# ## http://www.nod32.com/, version v2.52 (old) -# ['ESET NOD32 for Linux Mail servers', -# ['/opt/eset/nod32/bin/nod32cli', 'nod32cli'], -# '--subdir --files -z --sfx --rtp --adware --unsafe --pattern --heur '. -# '-w -a --action-on-infected=accept --action-on-uncleanable=accept '. -# '--action-on-notscanned=accept {}', -# [0,3], [1,2], qr/virus="([^"]+)"/m ], - -# ## http://www.eset.com/, version v2.7 (old) -# ['ESET NOD32 Linux Mail Server - command line interface', -# ['/usr/bin/nod32cli', '/opt/eset/nod32/bin/nod32cli', 'nod32cli'], -# '--subdir {}', [0,3], [1,2], qr/virus="([^"]+)"/m ], - -# ## http://www.eset.com/, version 2.71.12 -# ['ESET Software ESETS Command Line Interface', -# ['/usr/bin/esets_cli', 'esets_cli'], -# '--subdir {}', [0], [1,2,3], qr/virus="([^"]+)"/m ], - - ## http://www.eset.com/, version 3.0 - ['ESET Software ESETS Command Line Interface', - ['/usr/bin/esets_cli', 'esets_cli'], - '--subdir {}', [0], [1,2,3], - qr/:\s*action="(?!accepted)[^"]*"\n.*:\s*virus="([^"]*)"/m ], - - # http://www.nod32.com/, NOD32LFS version 2.5 and above - ['ESET NOD32 for Linux File servers', - ['/opt/eset/nod32/sbin/nod32','nod32'], - '--files -z --mail --sfx --rtp --adware --unsafe --pattern --heur '. - '-w -a --action=1 -b {}', - [0], [1,10], qr/^object=.*, virus="(.*?)",/m ], - -# Experimental, based on posting from Rado Dibarbora (Dibo) on 2002-05-31 -# ['ESET Software NOD32 Client/Server (NOD32SS)', -# \&ask_daemon2, # greets with 200, persistent, terminate with QUIT -# ["SCAN {}/*\r\n", '127.0.0.1:8448' ], -# qr/^200 File OK/m, qr/^201 /m, qr/^201 (.+)/m ], - - ## http://www.norman.com/products_nvc.shtml - ['Norman Virus Control v5 / Linux', 'nvcc', - '-c -l:0 -s -u -temp:\$TEMPBASE {}', [0,10,11], [1,2,14], - qr/(?i).* virus in .* -> \'(.+)\'/m ], - - ## http://www.pandasoftware.com/ - ['Panda CommandLineSecure 9 for Linux', - ['/opt/pavcl/usr/bin/pavcl','pavcl'], - '-auto -aex -heu -cmp -nbr -nor -nos -eng -nob {}', - qr/Number of files infected[ .]*: 0+(?!\d)/m, - qr/Number of files infected[ .]*: 0*[1-9]/m, - qr/Found virus :\s*(\S+)/m ], - # NOTE: for efficiency, start the Panda in resident mode with 'pavcl -tsr' - # before starting amavisd - the bases are then loaded only once at startup. - # To reload bases in a signature update script: - # /opt/pavcl/usr/bin/pavcl -tsr -ulr; /opt/pavcl/usr/bin/pavcl -tsr - # Please review other options of pavcl, for example: - # -nomalw, -nojoke, -nodial, -nohackt, -nospyw, -nocookies - -# ## http://www.pandasoftware.com/ -# ['Panda Antivirus for Linux', ['pavcl'], -# '-TSR -aut -aex -heu -cmp -nbr -nor -nso -eng {}', -# [0], [0x10, 0x30, 0x50, 0x70, 0x90, 0xB0, 0xD0, 0xF0], -# qr/Found virus :\s*(\S+)/m ], - -# GeCAD AV technology is acquired by Microsoft; RAV has been discontinued. -# Check your RAV license terms before fiddling with the following two lines! -# ['GeCAD RAV AntiVirus 8', 'ravav', -# '--all --archive --mail {}', [1], [2,3,4,5], qr/Infected: (.+)/m ], -# # NOTE: the command line switches changed with scan engine 8.5 ! -# # (btw, assigning stdin to /dev/null causes RAV to fail) - - ## http://www.nai.com/ - ['NAI McAfee AntiVirus (uvscan)', 'uvscan', - '--secure -rv --mime --summary --noboot - {}', [0], [13], - qr/(?x) Found (?: - \ the\ (.+)\ (?:virus|trojan) | - \ (?:virus|trojan)\ or\ variant\ ([^ ]+) | - :\ (.+)\ NOT\ a\ virus)/m, - # sub {$ENV{LD_PRELOAD}='/lib/libc.so.6'}, - # sub {delete $ENV{LD_PRELOAD}}, - ], - # NOTE1: with RH9: force the dynamic linker to look at /lib/libc.so.6 before - # anything else by setting environment variable LD_PRELOAD=/lib/libc.so.6 - # and then clear it when finished to avoid confusing anything else. - # NOTE2: to treat encrypted files as viruses replace the [13] with: - # qr/^\s{5,}(Found|is password-protected|.*(virus|trojan))/ - - ## http://www.virusbuster.hu/en/ - ['VirusBuster', ['vbuster', 'vbengcl'], - "{} -ss -i '*' -log=\$MYHOME/vbuster.log", [0], [1], - qr/: '(.*)' - Virus/m ], - # VirusBuster Ltd. does not support the daemon version for the workstation - # engine (vbuster-eng-1.12-linux-i386-libc6.tgz) any longer. The names of - # binaries, some parameters AND return codes have changed (from 3 to 1). - # See also the new Vexira entry 'vascan' which is possibly related. - -# ## http://www.virusbuster.hu/en/ -# ['VirusBuster (Client + Daemon)', 'vbengd', -# '-f -log scandir {}', [0], [3], -# qr/Virus found = (.*);/m ], -# # HINT: for an infected file it always returns 3, -# # although the man-page tells a different story - - ## http://www.cyber.com/ - ['CyberSoft VFind', 'vfind', - '--vexit {}/*', [0], [23], qr/##==>>>> VIRUS ID: CVDL (.+)/m, - # sub {$ENV{VSTK_HOME}='/usr/lib/vstk'}, - ], - - ### http://www.avast.com/ - ['avast! Antivirus', ['/usr/bin/avastcmd','avastcmd'], - '-a -i -n -t=A {}', [0], [1], qr/\binfected by:\s+([^ \t\n\[\]]+)/m ], - - ### http://www.ikarus-software.com/ - ['Ikarus AntiVirus for Linux', 'ikarus', - '{}', [0], [40], qr/Signature (.+) found/m ], - - ### http://www.bitdefender.com/ - ['BitDefender', 'bdscan', # new version - '--action=ignore --no-list {}', qr/^Infected files\s*:\s*0+(?!\d)/m, - qr/^(?:Infected files|Identified viruses|Suspect files)\s*:\s*0*[1-9]/m, - qr/(?:suspected|infected)\s*:\s*(.*)(?:\033|$)/m ], - - ### http://www.bitdefender.com/ - ['BitDefender', 'bdc', # old version - '--arc --mail {}', qr/^Infected files *:0+(?!\d)/m, - qr/^(?:Infected files|Identified viruses|Suspect files) *:0*[1-9]/m, - qr/(?:suspected|infected): (.*)(?:\033|$)/m ], - # consider also: --all --nowarn --alev=15 --flev=15. The --all argument may - # not apply to your version of bdc, check documentation and see 'bdc --help' - - ### ArcaVir for Linux and Unix http://www.arcabit.pl/ - ['ArcaVir for Linux', ['arcacmd','arcacmd.static'], - '-v 1 -summary 0 -s {}', [0], [1,2], - qr/(?:VIR|WIR):[ \t]*(.+)/m ], - -# ### a generic SMTP-client interface to a SMTP-based virus scanner -# ['av_smtp', \&ask_av_smtp, -# ['{}', 'smtp:[127.0.0.1]:5525', 'dummy@localhost'], -# qr/^2/, qr/^5/, qr/^\s*(.*?)\s*$/m ], - -# ['File::Scan', sub {Amavis::AV::ask_av(sub{ -# use File::Scan; my($fn)=@_; -# my($f)=File::Scan->new(max_txt_size=>0, max_bin_size=>0); -# my($vname) = $f->scan($fn); -# $f->error ? (2,"Error: ".$f->error) -# : ($vname ne '') ? (1,"$vname FOUND") : (0,"Clean")}, @_) }, -# ["{}/*"], [0], [1], qr/^(.*) FOUND$/m ], - -# ### fully-fledged checker for JPEG marker segments of invalid length -# ['check-jpeg', -# sub { use JpegTester (); Amavis::AV::ask_av(\&JpegTester::test_jpeg, @_) }, -# ["{}/*"], undef, [1], qr/^(bad jpeg: .*)$/m ], -# # NOTE: place file JpegTester.pm somewhere where Perl can find it, -# # for example in /usr/local/lib/perl5/site_perl - -); - - -@av_scanners_backup = ( - - ### http://www.clamav.net/ - backs up clamd or Mail::ClamAV - ['ClamAV-clamscan', 'clamscan', - "--stdout --no-summary -r --tempdir=$TEMPBASE {}", - [0], qr/:.*\sFOUND$/m, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ], - - ### http://www.f-prot.com/ - backs up F-Prot Daemon, V6 - ['F-PROT Antivirus for UNIX', ['fpscan'], - '--report --mount --adware {}', # consider: --applications -s 4 -u 3 -z 10 - [0,8,64], [1,2,3, 4+1,4+2,4+3, 8+1,8+2,8+3, 12+1,12+2,12+3], - qr/^\[Found\s+[^\]]*\]\s+<([^ \t(>]*)/m ], - - ### http://www.f-prot.com/ - backs up F-Prot Daemon (old) - ['FRISK F-Prot Antivirus', ['f-prot','f-prot.sh'], - '-dumb -archive -packed {}', [0,8], [3,6], # or: [0], [3,6,8], - qr/(?:Infection:|security risk named) (.+)|\s+contains\s+(.+)$/m ], - - ### http://www.trendmicro.com/ - backs up Trophie - ['Trend Micro FileScanner', ['/etc/iscan/vscan','vscan'], - '-za -a {}', [0], qr/Found virus/m, qr/Found virus (.+) in/m ], - - ### http://www.sald.com/, http://drweb.imshop.de/ - backs up DrWebD - ['drweb - DrWeb Antivirus', # security LHA hole in Dr.Web 4.33 and earlier - ['/usr/local/drweb/drweb', '/opt/drweb/drweb', 'drweb'], - '-path={} -al -go -ot -cn -upn -ok-', - [0,32], [1,9,33], qr' infected (?:with|by)(?: virus)? (.*)\$'m ], - - ### http://www.kaspersky.com/ - ['Kaspersky Antivirus v5.5', - ['/opt/kaspersky/kav4fs/bin/kav4fs-kavscanner', - '/opt/kav/5.5/kav4unix/bin/kavscanner', - '/opt/kav/5.5/kav4mailservers/bin/kavscanner', 'kavscanner'], - '-i0 -xn -xp -mn -R -ePASBME {}/*', [0,10,15], [5,20,21,25], - qr/(?:INFECTED|WARNING|SUSPICION|SUSPICIOUS) (.*)/m, -# sub {chdir('/opt/kav/bin') or die "Can't chdir to kav: $!"}, -# sub {chdir($TEMPBASE) or die "Can't chdir back to $TEMPBASE $!"}, - ], - -# Commented out because the name 'sweep' clashes with Debian and FreeBSD -# package/port of an audio editor. Make sure the correct 'sweep' is found -# in the path when enabling. -# -# ### http://www.sophos.com/ - backs up Sophie or SAVI-Perl -# ['Sophos Anti Virus (sweep)', 'sweep', -# '-nb -f -all -rec -ss -sc -archive -cab -mime -oe -tnef '. -# '--no-reset-atime {}', -# [0,2], qr/Virus .*? found/m, -# qr/^>>> Virus(?: fragment)? '?(.*?)'? found/m, -# ], -# # other options to consider: -idedir=/usr/local/sav - -# Always succeeds and considers mail clean. -# Potentially useful when all other scanners fail and it is desirable -# to let mail continue to flow with no virus checking (when uncommented). -# ['always-clean', sub {0}], - -); - - -1; # insure a defined return value diff --git a/docker/amavis/rootfs/etc/clamd.d/amavisd.conf b/docker/amavis/rootfs/etc/clamd.d/amavisd.conf new file mode 100644 index 00000000..7e1e11ec --- /dev/null +++ b/docker/amavis/rootfs/etc/clamd.d/amavisd.conf @@ -0,0 +1,20 @@ +# Use system logger. +LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +LogFacility LOG_MAIL + +# This option allows you to save a process identifier of the listening +# daemon (main thread). +PidFile /var/run/amavisd/clamd.pid + +# Remove stale socket after unclean shutdown. +# Default: disabled +FixStaleSocket yes + +# Run as a selected user (clamd must be started by root). +User amavis + +# Path to a local socket file the daemon will listen on. +LocalSocket /var/run/amavisd/clamd.sock diff --git a/docker/amavis/rootfs/etc/clamd.d/scan.conf b/docker/amavis/rootfs/etc/clamd.d/scan.conf new file mode 100644 index 00000000..2910ecca --- /dev/null +++ b/docker/amavis/rootfs/etc/clamd.d/scan.conf @@ -0,0 +1,794 @@ +## +## Example config file for the Clam AV daemon +## Please read the clamd.conf(5) manual before editing this file. +## + + +# Comment or remove the line below. +#Example + +# Uncomment this option to enable logging. +# LogFile must be writable for the user running daemon. +# A full path is required. +# Default: disabled +#LogFile /var/log/clamd.scan + +# By default the log file is locked for writing - the lock protects against +# running clamd multiple times (if want to run another clamd, please +# copy the configuration file, change the LogFile variable, and run +# the daemon with --config-file option). +# This option disables log file locking. +# Default: no +#LogFileUnlock yes + +# Maximum size of the log file. +# Value of 0 disables the limit. +# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes) +# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes). To specify the size +# in bytes just don't use modifiers. If LogFileMaxSize is enabled, log +# rotation (the LogRotate option) will always be enabled. +# Default: 1M +#LogFileMaxSize 2M + +# Log time with each message. +# Default: no +#LogTime yes + +# Also log clean files. Useful in debugging but drastically increases the +# log size. +# Default: no +#LogClean yes + +# Use system logger (can work together with LogFile). +# Default: no +LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +# Default: LOG_LOCAL6 +#LogFacility LOG_MAIL + +# Enable verbose logging. +# Default: no +#LogVerbose yes + +# Enable log rotation. Always enabled when LogFileMaxSize is enabled. +# Default: no +#LogRotate yes + +# Enable Prelude output. +# Default: no +#PreludeEnable yes +# +# Set the name of the analyzer used by prelude-admin. +# Default: ClamAV +#PreludeAnalyzerName ClamAV + +# Log additional information about the infected file, such as its +# size and hash, together with the virus name. +#ExtendedDetectionInfo yes + +# This option allows you to save a process identifier of the listening +# daemon (main thread). +# This file will be owned by root, as long as clamd was started by root. +# It is recommended that the directory where this file is stored is +# also owned by root to keep other users from tampering with it. +# Default: disabled +#PidFile /run/clamd.scan/clamd.pid + +# Optional path to the global temporary directory. +# Default: system specific (usually /tmp or /var/tmp). +#TemporaryDirectory /var/tmp + +# Path to the database directory. +# Default: hardcoded (depends on installation options) +#DatabaseDirectory /var/lib/clamav + +# Only load the official signatures published by the ClamAV project. +# Default: no +#OfficialDatabaseOnly no + +# The daemon can work in local mode, network mode or both. +# Due to security reasons we recommend the local mode. + +# Path to a local socket file the daemon will listen on. +# Default: disabled (must be specified by a user) +#LocalSocket /run/clamd.scan/clamd.sock + +# Sets the group ownership on the unix socket. +# Default: disabled (the primary group of the user running clamd) +#LocalSocketGroup virusgroup + +# Sets the permissions on the unix socket to the specified mode. +# Default: disabled (socket is world accessible) +#LocalSocketMode 660 + +# Remove stale socket after unclean shutdown. +# Default: yes +#FixStaleSocket yes + +# TCP port address. +# Default: no +#TCPSocket 3310 + +# TCP address. +# By default we bind to INADDR_ANY, probably not wise. +# Enable the following to provide some degree of protection +# from the outside world. This option can be specified multiple +# times if you want to listen on multiple IPs. IPv6 is now supported. +# Default: no +#TCPAddr 127.0.0.1 + +# Maximum length the queue of pending connections may grow to. +# Default: 200 +#MaxConnectionQueueLength 30 + +# Clamd uses FTP-like protocol to receive data from remote clients. +# If you are using clamav-milter to balance load between remote clamd daemons +# on firewall servers you may need to tune the options below. + +# Close the connection when the data size limit is exceeded. +# The value should match your MTA's limit for a maximum attachment size. +# Default: 25M +#StreamMaxLength 10M + +# Limit port range. +# Default: 1024 +#StreamMinPort 30000 +# Default: 2048 +#StreamMaxPort 32000 + +# Maximum number of threads running at the same time. +# Default: 10 +#MaxThreads 20 + +# Waiting for data from a client socket will timeout after this time (seconds). +# Default: 120 +#ReadTimeout 300 + +# This option specifies the time (in seconds) after which clamd should +# timeout if a client doesn't provide any initial command after connecting. +# Default: 30 +#CommandReadTimeout 30 + +# This option specifies how long to wait (in milliseconds) if the send buffer +# is full. +# Keep this value low to prevent clamd hanging. +# +# Default: 500 +#SendBufTimeout 200 + +# Maximum number of queued items (including those being processed by +# MaxThreads threads). +# It is recommended to have this value at least twice MaxThreads if possible. +# WARNING: you shouldn't increase this too much to avoid running out of file +# descriptors, the following condition should hold: +# MaxThreads*MaxRecursion + (MaxQueue - MaxThreads) + 6< RLIMIT_NOFILE (usual +# max is 1024). +# +# Default: 100 +#MaxQueue 200 + +# Waiting for a new job will timeout after this time (seconds). +# Default: 30 +#IdleTimeout 60 + +# Don't scan files and directories matching regex +# This directive can be used multiple times +# Default: scan all +#ExcludePath ^/proc/ +#ExcludePath ^/sys/ + +# Maximum depth directories are scanned at. +# Default: 15 +#MaxDirectoryRecursion 20 + +# Follow directory symlinks. +# Default: no +#FollowDirectorySymlinks yes + +# Follow regular file symlinks. +# Default: no +#FollowFileSymlinks yes + +# Scan files and directories on other filesystems. +# Default: yes +#CrossFilesystems yes + +# Perform a database check. +# Default: 600 (10 min) +#SelfCheck 600 + +# Enable non-blocking (multi-threaded/concurrent) database reloads. +# This feature will temporarily load a second scanning engine while scanning +# continues using the first engine. Once loaded, the new engine takes over. +# The old engine is removed as soon as all scans using the old engine have +# completed. +# This feature requires more RAM, so this option is provided in case users are +# willing to block scans during reload in exchange for lower RAM requirements. +# Default: yes +#ConcurrentDatabaseReload no + +# Execute a command when virus is found. In the command string %v will +# be replaced with the virus name. +# Default: no +#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v" + +# Run as another user (clamd must be started by root for this option to work) +# Default: don't drop privileges +User clamscan + +# Stop daemon when libclamav reports out of memory condition. +#ExitOnOOM yes + +# Don't fork into background. +# Default: no +#Foreground yes + +# Enable debug messages in libclamav. +# Default: no +#Debug yes + +# Do not remove temporary files (for debug purposes). +# Default: no +#LeaveTemporaryFiles yes + +# Permit use of the ALLMATCHSCAN command. If set to no, clamd will reject +# any ALLMATCHSCAN command as invalid. +# Default: yes +#AllowAllMatchScan no + +# Detect Possibly Unwanted Applications. +# Default: no +#DetectPUA yes + +# Exclude a specific PUA category. This directive can be used multiple times. +# See https://github.com/vrtadmin/clamav-faq/blob/master/faq/faq-pua.md for +# the complete list of PUA categories. +# Default: Load all categories (if DetectPUA is activated) +#ExcludePUA NetTool +#ExcludePUA PWTool + +# Only include a specific PUA category. This directive can be used multiple +# times. +# Default: Load all categories (if DetectPUA is activated) +#IncludePUA Spy +#IncludePUA Scanner +#IncludePUA RAT + +# This option causes memory or nested map scans to dump the content to disk. +# If you turn on this option, more data is written to disk and is available +# when the LeaveTemporaryFiles option is enabled. +#ForceToDisk yes + +# This option allows you to disable the caching feature of the engine. By +# default, the engine will store an MD5 in a cache of any files that are +# not flagged as virus or that hit limits checks. Disabling the cache will +# have a negative performance impact on large scans. +# Default: no +#DisableCache yes + +# In some cases (eg. complex malware, exploits in graphic files, and others), +# ClamAV uses special algorithms to detect abnormal patterns and behaviors that +# may be malicious. This option enables alerting on such heuristically +# detected potential threats. +# Default: yes +#HeuristicAlerts yes + +# Allow heuristic alerts to take precedence. +# When enabled, if a heuristic scan (such as phishingScan) detects +# a possible virus/phish it will stop scan immediately. Recommended, saves CPU +# scan-time. +# When disabled, virus/phish detected by heuristic scans will be reported only +# at the end of a scan. If an archive contains both a heuristically detected +# virus/phish, and a real malware, the real malware will be reported +# +# Keep this disabled if you intend to handle "Heuristics.*" viruses +# differently from "real" malware. +# If a non-heuristically-detected virus (signature-based) is found first, +# the scan is interrupted immediately, regardless of this config option. +# +# Default: no +#HeuristicScanPrecedence yes + + +## +## Heuristic Alerts +## + +# With this option clamav will try to detect broken executables (both PE and +# ELF) and alert on them with the Broken.Executable heuristic signature. +# Default: no +#AlertBrokenExecutables yes + +# With this option clamav will try to detect broken media file (JPEG, +# TIFF, PNG, GIF) and alert on them with a Broken.Media heuristic signature. +# Default: no +#AlertBrokenMedia yes + +# Alert on encrypted archives _and_ documents with heuristic signature +# (encrypted .zip, .7zip, .rar, .pdf). +# Default: no +#AlertEncrypted yes + +# Alert on encrypted archives with heuristic signature (encrypted .zip, .7zip, +# .rar). +# Default: no +#AlertEncryptedArchive yes + +# Alert on encrypted archives with heuristic signature (encrypted .pdf). +# Default: no +#AlertEncryptedDoc yes + +# With this option enabled OLE2 files containing VBA macros, which were not +# detected by signatures will be marked as "Heuristics.OLE2.ContainsMacros". +# Default: no +#AlertOLE2Macros yes + +# Alert on SSL mismatches in URLs, even if the URL isn't in the database. +# This can lead to false positives. +# Default: no +#AlertPhishingSSLMismatch yes + +# Alert on cloaked URLs, even if URL isn't in database. +# This can lead to false positives. +# Default: no +#AlertPhishingCloak yes + +# Alert on raw DMG image files containing partition intersections +# Default: no +#AlertPartitionIntersection yes + + +## +## Executable files +## + +# PE stands for Portable Executable - it's an executable file format used +# in all 32 and 64-bit versions of Windows operating systems. This option +# allows ClamAV to perform a deeper analysis of executable files and it's also +# required for decompression of popular executable packers such as UPX, FSG, +# and Petite. If you turn off this option, the original files will still be +# scanned, but without additional processing. +# Default: yes +#ScanPE yes + +# Certain PE files contain an authenticode signature. By default, we check +# the signature chain in the PE file against a database of trusted and +# revoked certificates if the file being scanned is marked as a virus. +# If any certificate in the chain validates against any trusted root, but +# does not match any revoked certificate, the file is marked as whitelisted. +# If the file does match a revoked certificate, the file is marked as virus. +# The following setting completely turns off authenticode verification. +# Default: no +#DisableCertCheck yes + +# Executable and Linking Format is a standard format for UN*X executables. +# This option allows you to control the scanning of ELF files. +# If you turn off this option, the original files will still be scanned, but +# without additional processing. +# Default: yes +#ScanELF yes + + +## +## Documents +## + +# This option enables scanning of OLE2 files, such as Microsoft Office +# documents and .msi files. +# If you turn off this option, the original files will still be scanned, but +# without additional processing. +# Default: yes +#ScanOLE2 yes + +# This option enables scanning within PDF files. +# If you turn off this option, the original files will still be scanned, but +# without decoding and additional processing. +# Default: yes +#ScanPDF yes + +# This option enables scanning within SWF files. +# If you turn off this option, the original files will still be scanned, but +# without decoding and additional processing. +# Default: yes +#ScanSWF yes + +# This option enables scanning xml-based document files supported by libclamav. +# If you turn off this option, the original files will still be scanned, but +# without additional processing. +# Default: yes +#ScanXMLDOCS yes + +# This option enables scanning of HWP3 files. +# If you turn off this option, the original files will still be scanned, but +# without additional processing. +# Default: yes +#ScanHWP3 yes + + +## +## Mail files +## + +# Enable internal e-mail scanner. +# If you turn off this option, the original files will still be scanned, but +# without parsing individual messages/attachments. +# Default: yes +#ScanMail yes + +# Scan RFC1341 messages split over many emails. +# You will need to periodically clean up $TemporaryDirectory/clamav-partial +# directory. +# WARNING: This option may open your system to a DoS attack. +# Never use it on loaded servers. +# Default: no +#ScanPartialMessages yes + +# With this option enabled ClamAV will try to detect phishing attempts by using +# HTML.Phishing and Email.Phishing NDB signatures. +# Default: yes +#PhishingSignatures no + +# With this option enabled ClamAV will try to detect phishing attempts by +# analyzing URLs found in emails using WDB and PDB signature databases. +# Default: yes +#PhishingScanURLs no + + +## +## Data Loss Prevention (DLP) +## + +# Enable the DLP module +# Default: No +#StructuredDataDetection yes + +# This option sets the lowest number of Credit Card numbers found in a file +# to generate a detect. +# Default: 3 +#StructuredMinCreditCardCount 5 + +# With this option enabled the DLP module will search for valid Credit Card +# numbers only. Debit and Private Label cards will not be searched. +# Default: no +#StructuredCCOnly yes + +# This option sets the lowest number of Social Security Numbers found +# in a file to generate a detect. +# Default: 3 +#StructuredMinSSNCount 5 + +# With this option enabled the DLP module will search for valid +# SSNs formatted as xxx-yy-zzzz +# Default: yes +#StructuredSSNFormatNormal yes + +# With this option enabled the DLP module will search for valid +# SSNs formatted as xxxyyzzzz +# Default: no +#StructuredSSNFormatStripped yes + + +## +## HTML +## + +# Perform HTML normalisation and decryption of MS Script Encoder code. +# Default: yes +# If you turn off this option, the original files will still be scanned, but +# without additional processing. +#ScanHTML yes + + +## +## Archives +## + +# ClamAV can scan within archives and compressed files. +# If you turn off this option, the original files will still be scanned, but +# without unpacking and additional processing. +# Default: yes +#ScanArchive yes + + +## +## Limits +## + +# The options below protect your system against Denial of Service attacks +# using archive bombs. + +# This option sets the maximum amount of time to a scan may take. +# In this version, this field only affects the scan time of ZIP archives. +# Value of 0 disables the limit. +# Note: disabling this limit or setting it too high may result allow scanning +# of certain files to lock up the scanning process/threads resulting in a +# Denial of Service. +# Time is in milliseconds. +# Default: 120000 +#MaxScanTime 300000 + +# This option sets the maximum amount of data to be scanned for each input +# file. Archives and other containers are recursively extracted and scanned +# up to this value. +# Value of 0 disables the limit +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 100M +#MaxScanSize 150M + +# Files larger than this limit won't be scanned. Affects the input file itself +# as well as files contained inside it (when the input file is an archive, a +# document or some other kind of container). +# Value of 0 disables the limit. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Technical design limitations prevent ClamAV from scanning files greater than +# 2 GB at this time. +# Default: 25M +#MaxFileSize 30M + +# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR +# file, all files within it will also be scanned. This options specifies how +# deeply the process should be continued. +# Note: setting this limit too high may result in severe damage to the system. +# Default: 17 +#MaxRecursion 10 + +# Number of files to be scanned within an archive, a document, or any other +# container file. +# Value of 0 disables the limit. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 10000 +#MaxFiles 15000 + +# Maximum size of a file to check for embedded PE. Files larger than this value +# will skip the additional analysis step. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 10M +#MaxEmbeddedPE 10M + +# Maximum size of a HTML file to normalize. HTML files larger than this value +# will not be normalized or scanned. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 10M +#MaxHTMLNormalize 10M + +# Maximum size of a normalized HTML file to scan. HTML files larger than this +# value after normalization will not be scanned. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 2M +#MaxHTMLNoTags 2M + +# Maximum size of a script file to normalize. Script content larger than this +# value will not be normalized or scanned. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 5M +#MaxScriptNormalize 5M + +# Maximum size of a ZIP file to reanalyze type recognition. ZIP files larger +# than this value will skip the step to potentially reanalyze as PE. +# Note: disabling this limit or setting it too high may result in severe damage +# to the system. +# Default: 1M +#MaxZipTypeRcg 1M + +# This option sets the maximum number of partitions of a raw disk image to be +# scanned. +# Raw disk images with more partitions than this value will have up to +# the value number partitions scanned. Negative values are not allowed. +# Note: setting this limit too high may result in severe damage or impact +# performance. +# Default: 50 +#MaxPartitions 128 + +# This option sets the maximum number of icons within a PE to be scanned. +# PE files with more icons than this value will have up to the value number +# icons scanned. +# Negative values are not allowed. +# WARNING: setting this limit too high may result in severe damage or impact +# performance. +# Default: 100 +#MaxIconsPE 200 + +# This option sets the maximum recursive calls for HWP3 parsing during +# scanning. HWP3 files using more than this limit will be terminated and +# alert the user. +# Scans will be unable to scan any HWP3 attachments if the recursive limit +# is reached. +# Negative values are not allowed. +# WARNING: setting this limit too high may result in severe damage or impact +# performance. +# Default: 16 +#MaxRecHWP3 16 + +# This option sets the maximum calls to the PCRE match function during +# an instance of regex matching. +# Instances using more than this limit will be terminated and alert the user +# but the scan will continue. +# For more information on match_limit, see the PCRE documentation. +# Negative values are not allowed. +# WARNING: setting this limit too high may severely impact performance. +# Default: 100000 +#PCREMatchLimit 20000 + +# This option sets the maximum recursive calls to the PCRE match function +# during an instance of regex matching. +# Instances using more than this limit will be terminated and alert the user +# but the scan will continue. +# For more information on match_limit_recursion, see the PCRE documentation. +# Negative values are not allowed and values > PCREMatchLimit are superfluous. +# WARNING: setting this limit too high may severely impact performance. +# Default: 2000 +#PCRERecMatchLimit 10000 + +# This option sets the maximum filesize for which PCRE subsigs will be +# executed. Files exceeding this limit will not have PCRE subsigs executed +# unless a subsig is encompassed to a smaller buffer. +# Negative values are not allowed. +# Setting this value to zero disables the limit. +# WARNING: setting this limit too high or disabling it may severely impact +# performance. +# Default: 25M +#PCREMaxFileSize 100M + +# When AlertExceedsMax is set, files exceeding the MaxFileSize, MaxScanSize, or +# MaxRecursion limit will be flagged with the virus name starting with +# "Heuristics.Limits.Exceeded". +# Default: no +#AlertExceedsMax yes + +## +## On-access Scan Settings +## + +# Don't scan files larger than OnAccessMaxFileSize +# Value of 0 disables the limit. +# Default: 5M +#OnAccessMaxFileSize 10M + +# Max number of scanning threads to allocate to the OnAccess thread pool at +# startup. These threads are the ones responsible for creating a connection +# with the daemon and kicking off scanning after an event has been processed. +# To prevent clamonacc from consuming all clamd's resources keep this lower +# than clamd's max threads. +# Default: 5 +#OnAccessMaxThreads 10 + +# Max amount of time (in milliseconds) that the OnAccess client should spend +# for every connect, send, and recieve attempt when communicating with clamd +# via curl. +# Default: 5000 (5 seconds) +# OnAccessCurlTimeout 10000 + +# Toggles dynamic directory determination. Allows for recursively watching +# include paths. +# Default: no +#OnAccessDisableDDD yes + +# Set the include paths (all files inside them will be scanned). You can have +# multiple OnAccessIncludePath directives but each directory must be added +# in a separate line. +# Default: disabled +#OnAccessIncludePath /home +#OnAccessIncludePath /students + +# Set the exclude paths. All subdirectories are also excluded. +# Default: disabled +#OnAccessExcludePath /home/user + +# Modifies fanotify blocking behaviour when handling permission events. +# If off, fanotify will only notify if the file scanned is a virus, +# and not perform any blocking. +# Default: no +#OnAccessPrevention yes + +# When using prevention, if this option is turned on, any errors that occur +# during scanning will result in the event attempt being denied. This could +# potentially lead to unwanted system behaviour with certain configurations, +# so the client defaults this to off and prefers allowing access events in +# case of scan or connection error. +# Default: no +#OnAccessDenyOnError yes + +# Toggles extra scanning and notifications when a file or directory is +# created or moved. +# Requires the DDD system to kick-off extra scans. +# Default: no +#OnAccessExtraScanning yes + +# Set the mount point to be scanned. The mount point specified, or the mount +# point containing the specified directory will be watched. If any directories +# are specified, this option will preempt (disable and ignore all options +# related to) the DDD system. This option will result in verdicts only. +# Note that prevention is explicitly disallowed to prevent common, fatal +# misconfigurations. (e.g. watching "/" with prevention on and no exclusions +# made on vital system directories) +# It can be used multiple times. +# Default: disabled +#OnAccessMountPath / +#OnAccessMountPath /home/user + +# With this option you can whitelist the root UID (0). Processes run under +# root with be able to access all files without triggering scans or +# permission denied events. +# Note that if clamd cannot check the uid of the process that generated an +# on-access scan event (e.g., because OnAccessPrevention was not enabled, and +# the process already exited), clamd will perform a scan. Thus, setting +# OnAccessExcludeRootUID is not *guaranteed* to prevent every access by the +# root user from triggering a scan (unless OnAccessPrevention is enabled). +# Default: no +#OnAccessExcludeRootUID no + +# With this option you can whitelist specific UIDs. Processes with these UIDs +# will be able to access all files without triggering scans or permission +# denied events. +# This option can be used multiple times (one per line). +# Using a value of 0 on any line will disable this option entirely. +# To whitelist the root UID (0) please enable the OnAccessExcludeRootUID +# option. +# Also note that if clamd cannot check the uid of the process that generated an +# on-access scan event (e.g., because OnAccessPrevention was not enabled, and +# the process already exited), clamd will perform a scan. Thus, setting +# OnAccessExcludeUID is not *guaranteed* to prevent every access by the +# specified uid from triggering a scan (unless OnAccessPrevention is enabled). +# Default: disabled +#OnAccessExcludeUID -1 + +# This option allows exclusions via user names when using the on-access +# scanning client. It can be used multiple times. +# It has the same potential race condition limitations of the +# OnAccessExcludeUID option. +# Default: disabled +#OnAccessExcludeUname clamav + +# Number of times the OnAccess client will retry a failed scan due to +# connection problems (or other issues). +# Default: 0 +#OnAccessRetryAttempts 3 + +## +## Bytecode +## + +# With this option enabled ClamAV will load bytecode from the database. +# It is highly recommended you keep this option on, otherwise you'll miss +# detections for many new viruses. +# Default: yes +#Bytecode yes + +# Set bytecode security level. +# Possible values: +# None - No security at all, meant for debugging. +# DO NOT USE THIS ON PRODUCTION SYSTEMS. +# This value is only available if clamav was built +# with --enable-debug! +# TrustSigned - Trust bytecode loaded from signed .c[lv]d files, insert +# runtime safety checks for bytecode loaded from other sources. +# Paranoid - Don't trust any bytecode, insert runtime checks for all. +# Recommended: TrustSigned, because bytecode in .cvd files already has these +# checks. +# Note that by default only signed bytecode is loaded, currently you can only +# load unsigned bytecode in --enable-debug mode. +# +# Default: TrustSigned +#BytecodeSecurity TrustSigned + +# Allow loading bytecode from outside digitally signed .c[lv]d files. +# **Caution**: You should NEVER run bytecode signatures from untrusted sources. +# Doing so may result in arbitrary code execution. +# Default: no +#BytecodeUnsigned yes + +# Set bytecode timeout in milliseconds. +# +# Default: 5000 +# BytecodeTimeout 1000 + + diff --git a/docker/amavis/rootfs/init.sh b/docker/amavis/rootfs/init.sh index a7ae4cda..8dea5292 100755 --- a/docker/amavis/rootfs/init.sh +++ b/docker/amavis/rootfs/init.sh @@ -1,33 +1,67 @@ #!/bin/sh -# ( -# while true; do -# sa-update -v -# sleep 30h -# done -# ) & -# BACKGROUND_TASKS="$!" +set -e +CONFIG="/etc/amavisd/amavisd.conf" sed -i -r \ -e "s|APP_DOMAIN|$APP_DOMAIN|g" \ - /etc/clam.d/amavisd.conf + -e "s|POSTFIX_HOST|$POSTFIX_HOST|g" \ + $CONFIG + +DKIMKEYFILE="/var/dkim/$APP_DOMAIN.$DKIM_IDENTIFIER.pem" +if ! [ -f $DKIMKEYFILE ]; then + echo "Generating the DKIM keys at: $DKIMKEYFILE" + amavisd -c $CONFIG genrsa $DKIMKEYFILE 2048 + chmod g+r $DKIMKEYFILE + chgrp amavis $DKIMKEYFILE + chown -R amavis:amavis /var/dkim +fi + +sed -i -r \ + -e "s|DKIM_IDENTIFIER|$DKIM_IDENTIFIER|g" \ + $CONFIG + +# We use these to check if the process has started, so ensure we aren't dealing wiht leftover files +rm -f /var/run/amavisd/amavisd.pid +rm -f /var/run/amavisd/clamd.pid mkdir -p /var/run/amavisd chmod 777 /var/run/amavisd +mkdir -p /var/spool/amavisd/tmp +mkdir -p /var/spool/amavisd/db +mkdir -p /var/spool/amavisd/quarantine +chown -R amavis:amavis /var/spool/amavisd +chown -R clamupdate:clamupdate /var/lib/clamav + +echo "DKIM keys:" +amavisd -c $CONFIG showkeys + +# Initialize the clamav db. This command will have a non-zero exit code if no update is available. +echo "Updating clamav db" +/usr/bin/freshclam --datadir=/var/lib/clamav +# Update once per day via daemon +/usr/bin/freshclam -d -c 1 + +# Update the spam db every 30h +echo "Updating spamassassin db" +sa-update -v || : +##FIXME this probably doesn't work since we exec to amavisd +#( +#while true; do +# sleep 30h +# sa-update -v +#done +#) & + +echo "Starting clamd" +clamd --config-file=/etc/clamd.d/amavisd.conf -#/usr/bin/freshclam --quiet --datadir=/var/lib/clamav -#/usr/bin/freshclam -d -c 1 - -exec amavisd -c /etc/clam.d/amavisd.conf foreground -# amavisd -c /etc/clam.d/amavisd.conf foreground & -# BACKGROUND_TASKS="${BACKGROUND_TASKS} $!" - -# while true; do -# for bg_task in ${BACKGROUND_TASKS}; do -# if ! kill -0 ${bg_task} 1>&2; then -# echo "Worker ${bg_task} died, stopping container waiting for respawn..." -# kill -TERM 1 -# fi -# sleep 10 -# done -# done +# This allows to kill amavis to reload the config or code in a running container +if $DEBUG; then + echo "Starting amavis in debug mode" + while true; do + amavisd -c $CONFIG foreground + done +fi +echo "Starting amavis" +exec amavisd -c $CONFIG foreground diff --git a/docker/postfix/Dockerfile b/docker/postfix/Dockerfile index 232baa88..2add7c64 100644 --- a/docker/postfix/Dockerfile +++ b/docker/postfix/Dockerfile @@ -1,31 +1,32 @@ FROM apheleia/almalinux8 RUN dnf -y install \ python3 \ python3-requests \ postfix \ postfix-mysql \ cyrus-sasl \ cyrus-sasl-plain && \ dnf clean all WORKDIR /root/ COPY /rootfs / VOLUME [ "/var/spool/postfix" ] VOLUME [ "/var/lib/postfix" ] ENV SERVICES_PORT=8000 # ENV APP_SERVICES_DOMAIN # ENV APP_DOMAIN # ENV LMTP_DESTINATION -ENV MYNETWORKS="172.0.0.0/8" +ENV MYNETWORKS="172.0.0.0/8,127.0.0.0/8" +ENV AMAVIS_HOST="amavis" # ENV DB_HOST # ENV DB_USERNAME # ENV DB_PASSWORD # ENV DB_DATABASE CMD ["/init.sh"] EXPOSE 10025/tcp 10587/tcp 11465/tcp 11587/tcp diff --git a/docker/postfix/rootfs/etc/postfix/main.cf b/docker/postfix/rootfs/etc/postfix/main.cf index d3b01fcb..f88f5130 100644 --- a/docker/postfix/rootfs/etc/postfix/main.cf +++ b/docker/postfix/rootfs/etc/postfix/main.cf @@ -1,597 +1,600 @@ compatibility_level = 2 # SOFT BOUNCE # # The soft_bounce parameter provides a limited safety net for # testing. When soft_bounce is enabled, mail will remain queued that # would otherwise bounce. This parameter disables locally-generated # bounces, and prevents the SMTP server from rejecting mail permanently # (by changing 5xx replies into 4xx replies). However, soft_bounce # is no cure for address rewriting mistakes or mail routing mistakes. # #soft_bounce = no # LOCAL PATHNAME INFORMATION queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix # QUEUE AND PROCESS OWNERSHIP # # The mail_owner parameter specifies the owner of the Postfix queue # and of most Postfix daemon processes. Specify the name of a user # account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS # AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In # particular, don't specify nobody or daemon. PLEASE USE A DEDICATED # USER. # mail_owner = postfix # The default_privs parameter specifies the default rights used by # the local delivery agent for delivery to external file or command. # These rights are used in the absence of a recipient user context. # DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER. # #default_privs = nobody # DOMAINS myhostname = postfix.APP_DOMAIN mydomain = APP_DOMAIN myorigin = $mydomain # RECEIVING MAIL # The inet_interfaces parameter specifies the network interface # addresses that this mail system receives mail on. By default, # the software claims all active interfaces on the machine. The # parameter also controls delivery of mail to user@[ip.address]. # # See also the proxy_interfaces parameter, for network addresses that # are forwarded to us via a proxy or network address translator. # # Note: you need to stop/start Postfix when this parameter changes. # #inet_interfaces = all #inet_interfaces = $myhostname #inet_interfaces = $myhostname, localhost inet_interfaces = all # Enable IPv4, and IPv6 if supported inet_protocols = all # The proxy_interfaces parameter specifies the network interface # addresses that this mail system receives mail on by way of a # proxy or network address translation unit. This setting extends # the address list specified with the inet_interfaces parameter. # # You must specify your proxy/NAT addresses when your system is a # backup MX host for other domains, otherwise mail delivery loops # will happen when the primary MX host is down. # #proxy_interfaces = #proxy_interfaces = 1.2.3.4 # Specify which domains should be delivered locally mydestination = $myhostname $mydomain # Required to correctly resolve the imap host in the container lmtp_host_lookup = native # lmtp for local transport local_transport = lmtp:LMTP_DESTINATION # The unknown_local_recipient_reject_code specifies the SMTP server # response code when a recipient domain matches $mydestination or # ${proxy,inet}_interfaces, while $local_recipient_maps is non-empty # and the recipient address or address local-part is not found. # # The default setting is 550 (reject mail) but it is safer to start # with 450 (try again later) until you are certain that your # local_recipient_maps settings are OK. # unknown_local_recipient_reject_code = 550 # TRUST AND RELAY CONTROL # The mynetworks parameter specifies the list of "trusted" SMTP # clients that have more privileges than "strangers". # # In particular, "trusted" SMTP clients are allowed to relay mail # through Postfix. See the smtpd_recipient_restrictions parameter # in postconf(5). # # You can specify the list of "trusted" network addresses by hand # or you can let Postfix do it for you (which is the default). # # By default (mynetworks_style = subnet), Postfix "trusts" SMTP # clients in the same IP subnetworks as the local machine. # On Linux, this works correctly only with interfaces specified # with the "ifconfig" command. # # Specify "mynetworks_style = class" when Postfix should "trust" SMTP # clients in the same IP class A/B/C networks as the local machine. # Don't do this with a dialup site - it would cause Postfix to "trust" # your entire provider's network. Instead, specify an explicit # mynetworks list by hand, as described below. # # Specify "mynetworks_style = host" when Postfix should "trust" # only the local machine. # #mynetworks_style = class #mynetworks_style = subnet #mynetworks_style = host # Alternatively, you can specify the mynetworks list by hand, in # which case Postfix ignores the mynetworks_style setting. # # Specify an explicit list of network/netmask patterns, where the # mask specifies the number of bits in the network part of a host # address. # # You can also specify the absolute pathname of a pattern file instead # of listing the patterns here. Specify type:table for table-based lookups # (the value on the table right-hand side is not used). # # Trust the docker network mynetworks = MYNETWORKS #mynetworks = 168.100.189.0/28, 127.0.0.0/8 #mynetworks = $config_directory/mynetworks #mynetworks = hash:/etc/postfix/network_table # The relay_domains parameter restricts what destinations this system will # relay mail to. See the smtpd_recipient_restrictions description in # postconf(5) for detailed information. # # By default, Postfix relays mail # - from "trusted" clients (IP address matches $mynetworks) to any destination, # - from "untrusted" clients to destinations that match $relay_domains or # subdomains thereof, except addresses with sender-specified routing. # The default relay_domains value is $mydestination. # # In addition to the above, the Postfix SMTP server by default accepts mail # that Postfix is final destination for: # - destinations that match $inet_interfaces or $proxy_interfaces, # - destinations that match $mydestination # - destinations that match $virtual_alias_domains, # - destinations that match $virtual_mailbox_domains. # These destinations do not need to be listed in $relay_domains. # # Specify a list of hosts or domains, /file/name patterns or type:name # lookup tables, separated by commas and/or whitespace. Continue # long lines by starting the next line with whitespace. A file name # is replaced by its contents; a type:name table is matched when a # (parent) domain appears as lookup key. # # NOTE: Postfix will not automatically forward mail for domains that # list this system as their primary or backup MX host. See the # permit_mx_backup restriction description in postconf(5). # #relay_domains = $mydestination # INTERNET OR INTRANET # The relayhost parameter specifies the default host to send mail to # when no entry is matched in the optional transport(5) table. When # no relayhost is given, mail is routed directly to the destination. # # On an intranet, specify the organizational domain name. If your # internal DNS uses no MX records, specify the name of the intranet # gateway host instead. # # In the case of SMTP, specify a domain, host, host:port, [host]:port, # [address] or [address]:port; the form [host] turns off MX lookups. # # If you're connected via UUCP, see also the default_transport parameter. # #relayhost = $mydomain #relayhost = [gateway.my.domain] #relayhost = [mailserver.isp.tld] #relayhost = uucphost #relayhost = [an.ip.add.ress] # REJECTING UNKNOWN RELAY USERS # # The relay_recipient_maps parameter specifies optional lookup tables # with all addresses in the domains that match $relay_domains. # # If this parameter is defined, then the SMTP server will reject # mail for unknown relay users. This feature is off by default. # # The right-hand side of the lookup tables is conveniently ignored. # In the left-hand side, specify an @domain.tld wild-card, or specify # a user@domain.tld address. # #relay_recipient_maps = hash:/etc/postfix/relay_recipients # INPUT RATE CONTROL # # The in_flow_delay configuration parameter implements mail input # flow control. This feature is turned on by default, although it # still needs further development (it's disabled on SCO UNIX due # to an SCO bug). # # A Postfix process will pause for $in_flow_delay seconds before # accepting a new message, when the message arrival rate exceeds the # message delivery rate. With the default 100 SMTP server process # limit, this limits the mail inflow to 100 messages a second more # than the number of messages delivered per second. # # Specify 0 to disable the feature. Valid delays are 0..10. # #in_flow_delay = 1s # ADDRESS REWRITING # # The ADDRESS_REWRITING_README document gives information about # address masquerading or other forms of address rewriting including # username->Firstname.Lastname mapping. # ADDRESS REDIRECTION (VIRTUAL DOMAIN) # # The VIRTUAL_README document gives information about the many forms # of domain hosting that Postfix supports. # "USER HAS MOVED" BOUNCE MESSAGES # # See the discussion in the ADDRESS_REWRITING_README document. # TRANSPORT MAP # # See the discussion in the ADDRESS_REWRITING_README document. # ALIAS DATABASE # # The alias_maps parameter specifies the list of alias databases used # by the local delivery agent. The default list is system dependent. # # On systems with NIS, the default is to search the local alias # database, then the NIS alias database. See aliases(5) for syntax # details. # # If you change the alias database, run "postalias /etc/aliases" (or # wherever your system stores the mail alias file), or simply run # "newaliases" to build the necessary DBM or DB file. # # It will take a minute or so before changes become visible. Use # "postfix reload" to eliminate the delay. # #alias_maps = dbm:/etc/aliases alias_maps = hash:/etc/aliases #alias_maps = hash:/etc/aliases, nis:mail.aliases #alias_maps = netinfo:/aliases # The alias_database parameter specifies the alias database(s) that # are built with "newaliases" or "sendmail -bi". This is a separate # configuration parameter, because alias_maps (see above) may specify # tables that are not necessarily all under control by Postfix. # #alias_database = dbm:/etc/aliases #alias_database = dbm:/etc/mail/aliases alias_database = hash:/etc/aliases #alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases # ADDRESS EXTENSIONS (e.g., user+foo) # # The recipient_delimiter parameter specifies the separator between # user names and address extensions (user+foo). See canonical(5), # local(8), relocated(5) and virtual(5) for the effects this has on # aliases, canonical, virtual, relocated and .forward file lookups. # Basically, the software tries user+foo and .forward+foo before # trying user and .forward. # #recipient_delimiter = + # DELIVERY TO MAILBOX # # The home_mailbox parameter specifies the optional pathname of a # mailbox file relative to a user's home directory. The default # mailbox file is /var/spool/mail/user or /var/mail/user. Specify # "Maildir/" for qmail-style delivery (the / is required). # #home_mailbox = Mailbox #home_mailbox = Maildir/ # The mail_spool_directory parameter specifies the directory where # UNIX-style mailboxes are kept. The default setting depends on the # system type. # #mail_spool_directory = /var/mail #mail_spool_directory = /var/spool/mail # The mailbox_command parameter specifies the optional external # command to use instead of mailbox delivery. The command is run as # the recipient with proper HOME, SHELL and LOGNAME environment settings. # Exception: delivery for root is done as $default_user. # # Other environment variables of interest: USER (recipient username), # EXTENSION (address extension), DOMAIN (domain part of address), # and LOCAL (the address localpart). # # Unlike other Postfix configuration parameters, the mailbox_command # parameter is not subjected to $parameter substitutions. This is to # make it easier to specify shell syntax (see example below). # # Avoid shell meta characters because they will force Postfix to run # an expensive shell process. Procmail alone is expensive enough. # # IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN # ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER. # #mailbox_command = /some/where/procmail #mailbox_command = /some/where/procmail -a "$EXTENSION" # If using the cyrus-imapd IMAP server deliver local mail to the IMAP # server using LMTP (Local Mail Transport Protocol), this is prefered # over the older cyrus deliver program by setting the # mailbox_transport as below: # # mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp # # The efficiency of LMTP delivery for cyrus-imapd can be enhanced via # these settings. # # local_destination_recipient_limit = 300 # local_destination_concurrency_limit = 5 # # Of course you should adjust these settings as appropriate for the # capacity of the hardware you are using. The recipient limit setting # can be used to take advantage of the single instance message store # capability of Cyrus. The concurrency limit can be used to control # how many simultaneous LMTP sessions will be permitted to the Cyrus # message store. # # Cyrus IMAP via command line. Uncomment the "cyrus...pipe" and # subsequent line in master.cf. #mailbox_transport = cyrus # The fallback_transport specifies the optional transport in master.cf # to use for recipients that are not found in the UNIX passwd database. # This parameter has precedence over the luser_relay parameter. # # Specify a string of the form transport:nexthop, where transport is # the name of a mail delivery transport defined in master.cf. The # :nexthop part is optional. For more details see the sample transport # configuration file. # # NOTE: if you use this feature for accounts not in the UNIX password # file, then you must update the "local_recipient_maps" setting in # the main.cf file, otherwise the SMTP server will reject mail for # non-UNIX accounts with "User unknown in local recipient table". # #fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp #fallback_transport = # The luser_relay parameter specifies an optional destination address # for unknown recipients. By default, mail for unknown@$mydestination, # unknown@[$inet_interfaces] or unknown@[$proxy_interfaces] is returned # as undeliverable. # # The following expansions are done on luser_relay: $user (recipient # username), $shell (recipient shell), $home (recipient home directory), # $recipient (full recipient address), $extension (recipient address # extension), $domain (recipient domain), $local (entire recipient # localpart), $recipient_delimiter. Specify ${name?value} or # ${name:value} to expand value only when $name does (does not) exist. # # luser_relay works only for the default Postfix local delivery agent. # # NOTE: if you use this feature for accounts not in the UNIX password # file, then you must specify "local_recipient_maps =" (i.e. empty) in # the main.cf file, otherwise the SMTP server will reject mail for # non-UNIX accounts with "User unknown in local recipient table". # #luser_relay = $user@other.host #luser_relay = $local@other.host #luser_relay = admin+$local # JUNK MAIL CONTROLS # # The controls listed here are only a very small subset. The file # SMTPD_ACCESS_README provides an overview. # The header_checks parameter specifies an optional table with patterns # that each logical message header is matched against, including # headers that span multiple physical lines. # # By default, these patterns also apply to MIME headers and to the # headers of attached messages. With older Postfix versions, MIME and # attached message headers were treated as body text. # # For details, see "man header_checks". # #header_checks = regexp:/etc/postfix/header_checks # FAST ETRN SERVICE # # Postfix maintains per-destination logfiles with information about # deferred mail, so that mail can be flushed quickly with the SMTP # "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld". # See the ETRN_README document for a detailed description. # # The fast_flush_domains parameter controls what destinations are # eligible for this service. By default, they are all domains that # this server is willing to relay mail to. # #fast_flush_domains = $relay_domains # SHOW SOFTWARE VERSION OR NOT # # The smtpd_banner parameter specifies the text that follows the 220 # code in the SMTP server's greeting banner. Some people like to see # the mail version advertised. By default, Postfix shows no version. # # You MUST specify $myhostname at the start of the text. That is an # RFC requirement. Postfix itself does not care. # #smtpd_banner = $myhostname ESMTP $mail_name #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) # PARALLEL DELIVERY TO THE SAME DESTINATION # # How many parallel deliveries to the same user or domain? With local # delivery, it does not make sense to do massively parallel delivery # to the same user, because mailbox updates must happen sequentially, # and expensive pipelines in .forward files can cause disasters when # too many are run at the same time. With SMTP deliveries, 10 # simultaneous connections to the same domain could be sufficient to # raise eyebrows. # # Each message delivery transport has its XXX_destination_concurrency_limit # parameter. The default is $default_destination_concurrency_limit for # most delivery transports. For the local delivery agent the default is 2. #local_destination_concurrency_limit = 2 #default_destination_concurrency_limit = 20 # DEBUGGING CONTROL debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 # INSTALL-TIME CONFIGURATION INFORMATION sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix/samples readme_directory = /usr/share/doc/postfix/README_FILES # TLS CONFIGURATION # # Basic Postfix TLS configuration by default with self-signed certificate # for inbound SMTP and also opportunistic TLS for outbound SMTP. # The full pathname of a file with the Postfix SMTP server RSA certificate # in PEM format. Intermediate certificates should be included in general, # the server certificate first, then the issuing CA(s) (bottom-up order). # smtpd_tls_cert_file = /etc/pki/tls/private/postfix.pem # The full pathname of a file with the Postfix SMTP server RSA private key # in PEM format. The private key must be accessible without a pass-phrase, # i.e. it must not be encrypted. # smtpd_tls_key_file = /etc/pki/tls/private/postfix.pem # Announce STARTTLS support to remote SMTP clients, but do not require that # clients use TLS encryption (opportunistic TLS inbound). # smtpd_tls_security_level = may # Directory with PEM format Certification Authority certificates that the # Postfix SMTP client uses to verify a remote SMTP server certificate. # smtp_tls_CApath = /etc/pki/tls/certs # The full pathname of a file containing CA certificates of root CAs # trusted to sign either remote SMTP server certificates or intermediate CA # certificates. # smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt # Use TLS if this is supported by the remote SMTP server, otherwise use # plaintext (opportunistic TLS outbound). # smtp_tls_security_level = may meta_directory = /etc/postfix shlib_directory = /usr/lib64/postfix recipient_delimiter = + local_recipient_maps = mysql:/etc/postfix/sql/local_recipient_maps.cf #transport_maps = ldap:/etc/postfix/ldap/transport_maps.cf, hash:/etc/postfix/transport transport_maps = regexp:/etc/postfix/transport #virtual_alias_maps = $alias_maps, ldap:/etc/postfix/ldap/virtual_alias_maps.cf, ldap:/etc/postfix/ldap/virtual_alias_maps_mailforwarding.cf, ldap:/etc/postfix/ldap/virtual_alias_maps_sharedfolders.cf, ldap:/etc/postfix/ldap/mailenabled_distgroups.cf, ldap:/etc/postfix/ldap/mailenabled_dynamic_distgroups.cf virtual_alias_maps = $alias_maps smtpd_tls_auth_only = no # Inbound smtpd_client_restrictions = #permit_mynetworks, reject_unknown_reverse_client_hostname, #reject_rbl_client zen.spamhaus.org, #reject_rhsbl_reverse_client dbl.spamhaus.org smtpd_data_restrictions = reject_unauth_pipelining smtpd_helo_required = yes smtpd_helo_restrictions = #permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, #reject_rhsbl_helo dbl.spamhaus.org smtpd_recipient_restrictions = #permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, #reject_rhsbl_recipient dbl.spamhaus.org, #check_recipient_access ldap:/etc/postfix/ldap/domain_suspended.cf, #check_recipient_access ldap:/etc/postfix/ldap/account_suspended.cf, #FIXME greylisting doesn't currently work because postfix doesn't see the client IP. #check_policy_service unix:private/policy_greylist, permit smtpd_peername_lookup = yes smtpd_sasl_auth_enable = yes smtpd_sender_login_maps = mysql:/etc/postfix/sql/local_recipient_maps.cf smtpd_sender_restrictions = #permit_mynetworks, #check_sender_access hash:/etc/postfix/sender_access, reject_unknown_sender_domain, #check_client_access hash:/etc/postfix/client_access, #check_client_access cidr:/etc/postfix/client_access_cidr, reject_unlisted_sender, # Uses smtpd_sender_login_maps reject_unauthenticated_sender_login_mismatch, reject_unauth_destination, #FIXME SPF doesn't currently work because postfix doesn't see the client IP. #check_policy_service unix:private/policy_spf, #reject_rhsbl_sender dbl.spamhaus.org, permit # Outbound submission_data_restrictions = check_policy_service unix:private/policy_ratelimit submission_client_restrictions = #reject_unknown_reverse_client_hostname, #reject_rbl_client zen.spamhaus.org, #reject_rhsbl_reverse_client dbl.spamhaus.org submission_sender_restrictions = reject_non_fqdn_sender, # Uses smtpd_sender_login_maps reject_sender_login_mismatch, check_policy_service unix:private/policy_ratelimit permit_sasl_authenticated, reject submission_helo_restrictions = # permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, #reject_rhsbl_helo dbl.spamhaus.org submission_recipient_restrictions = # check_recipient_access hash:/etc/postfix/recipient_access, # check_recipient_mx_access hash:/etc/postfix/recipient_mx_access, # check_recipient_ns_access hash:/etc/postfix/recipient_ns_access, check_policy_service unix:private/policy_ratelimit, permit_sasl_authenticated, # permit_mynetworks, reject # LEGACY restrictions #smtpd_data_restrictions = permit_mynetworks, check_policy_service unix:private/recipient_policy_incoming #smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_pipelining, reject_rbl_client zen.spamhaus.org, reject_non_fqdn_recipient, reject_invalid_helo_hostname, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service unix:private/recipient_policy_incoming, permit #smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, check_policy_service unix:private/sender_policy_incoming #submission_recipient_restrictions = check_policy_service unix:private/submission_policy, permit_sasl_authenticated, reject #submission_sender_restrictions = reject_non_fqdn_sender, check_policy_service unix:private/submission_policy, permit_sasl_authenticated, reject #submission_data_restrictions = check_policy_service unix:private/submission_policy +# Disable BDAT support without the useless "discarding EHLO keywords: CHUNKING" message +smtpd_discard_ehlo_keywords = chunking, silent-discard + #content_filter = smtp-wallace:[127.0.0.1]:10026 -#content_filter = amavis:[127.0.0.1]:10024 +content_filter = smtp-amavis:[AMAVIS_HOST]:13024 maillog_file = /dev/stdout diff --git a/docker/postfix/rootfs/etc/postfix/master.cf b/docker/postfix/rootfs/etc/postfix/master.cf index f17f6a43..48735fa4 100644 --- a/docker/postfix/rootfs/etc/postfix/master.cf +++ b/docker/postfix/rootfs/etc/postfix/master.cf @@ -1,165 +1,172 @@ # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master"). # Do not forget to execute "postfix reload" after editing this file. # ============================================================================== # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) + args # ============================================================================== postlog unix-dgram n - n - 1 postlogd # Inbound, port 25, no tls 10025 inet n - n - - smtpd # Internal Submission, no tls, no starttls 10587 inet n - - - - smtpd -o syslog_name=postfix/submission -o cleanup_service_name=cleanup_submission + -o content_filter=smtp-amavis:[AMAVIS_HOST]:13026 -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_data_restrictions=$submission_data_restrictions -o smtpd_recipient_restrictions=$submission_recipient_restrictions -o smtpd_sender_restrictions=$submission_sender_restrictions -o smtpd_client_restrictions=$submission_client_restrictions -o smtpd_helo_restrictions=$submission_helo_restrictions -o smtpd_helo_required=yes -o smtpd_peername_lookup=no pickup fifo n - n 60 1 pickup cleanup unix n - n - 0 cleanup -o header_checks=regexp:/etc/postfix/header_checks.inbound -o mime_header_checks=regexp:/etc/postfix/header_checks.inbound cleanup_submission unix n - n - 0 cleanup -o header_checks=regexp:/etc/postfix/header_checks.submission -o mime_header_checks=regexp:/etc/postfix/header_checks.submission +cleanup_internal unix n - n - 0 cleanup + -o header_checks=regexp:/etc/postfix/header_checks.internal + -o mime_header_checks=regexp:/etc/postfix/header_checks.internal qmgr fifo n - n 300 1 qmgr tlsmgr unix - - n 1000? 1 tlsmgr rewrite unix - - n - - trivial-rewrite bounce unix - - n - 0 bounce defer unix - - n - 0 bounce trace unix - - n - 0 bounce verify unix - - n - 1 verify flush unix n - n 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - n - - smtp relay unix - - n - - smtp showq unix n - n - - showq error unix - - n - - error retry unix - - n - - error discard unix - - n - - discard local unix - n n - - local virtual unix - n n - - virtual -lmtp unix - - n - - lmtp -v +lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil scache unix - - n - 1 scache # Filter email through Amavisd -# smtp-amavis unix - - n - 3 smtp -# -o smtp_data_done_timeout=1800 -# -o disable_dns_lookups=yes -# -o smtp_send_xforward_command=yes -# -o max_use=20 -# -o smtp_bind_address=127.0.0.1 +smtp-amavis unix - - n - 3 smtp + -o smtp_data_done_timeout=1800 + -o disable_dns_lookups=yes + -o smtp_send_xforward_command=yes + -o max_use=20 + # -o smtp_bind_address=127.0.0.1 # Listener to re-inject email from Amavisd into Postfix -# 127.0.0.1:10025 inet n - n - 100 smtpd -# -o cleanup_service_name=cleanup_internal -# -o content_filter=smtp-wallace:[127.0.0.1]:10026 -# -o local_recipient_maps= -# -o relay_recipient_maps= -# -o smtpd_restriction_classes= -# -o smtpd_client_restrictions= -# -o smtpd_helo_restrictions= -# -o smtpd_sender_restrictions= -# -o smtpd_recipient_restrictions=permit_mynetworks,reject -# -o mynetworks=127.0.0.0/8 -# -o smtpd_authorized_xforward_hosts=127.0.0.0/8 +0.0.0.0:13025 inet n - n - 100 smtpd + -o cleanup_service_name=cleanup_internal + -o local_recipient_maps= + -o relay_recipient_maps= + -o content_filter= + -o smtpd_restriction_classes= + -o smtpd_client_restrictions= + -o smtpd_helo_restrictions= + -o smtpd_sender_restrictions= + -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o mynetworks=MYNETWORKS + -o smtpd_authorized_xforward_hosts=MYNETWORKS + -o syslog_name=postfix/amavis # Filter email through Wallace # smtp-wallace unix - - n - 3 smtp # -o default_destination_recipient_limit=1 # -o smtp_data_done_timeout=1800 # -o disable_dns_lookups=yes # -o smtp_send_xforward_command=yes # -o max_use=20 # Listener to re-inject email from Wallace into Postfix -# 127.0.0.1:10027 inet n - n - 100 smtpd +# 127.0.0.1:10028 inet n - n - 100 smtpd # -o cleanup_service_name=cleanup_internal # -o content_filter= # -o local_recipient_maps= # -o relay_recipient_maps= # -o smtpd_restriction_classes= # -o smtpd_client_restrictions= # -o smtpd_helo_restrictions= # -o smtpd_sender_restrictions= # -o smtpd_recipient_restrictions=permit_mynetworks,reject # -o mynetworks=127.0.0.0/8 # -o smtpd_authorized_xforward_hosts=127.0.0.0/8 # Filter email through Amavisd # amavis unix - - n - 3 smtp # -o disable_dns_lookups=yes # -o max_use=20 # -o smtp_bind_address=127.0.0.1 # -o smtp_data_done_timeout=1800 # -o smtp_send_xforward_command=yes # -o smtp_tls_security_level=none # Reinjection from amavis # 127.0.0.1:10025 inet n - n - 100 smtpd # -o cleanup_service_name=cleanup_outbound # -o content_filter= # -o local_recipient_maps= # -o mydestination= # -o mynetworks=127.0.0.0/8 # -o relay_domains= # -o relay_recipient_maps= # -o smtpd_authorized_xforward_hosts=127.0.0.0/8 # -o smtpd_restriction_classes= # -o smtpd_client_restrictions= # -o smtpd_data_restrictions= # -o smtpd_helo_restrictions= # -o smtpd_sender_restrictions= # -o smtpd_recipient_restrictions=permit_mynetworks,reject # -o syslog_name=postfix/amavis # Outbound policy_ratelimit unix - n n - - spawn user=nobody argv=/usr/libexec/postfix/kolab_policy_ratelimit # Inbound policy_greylist unix - n n - - spawn user=nobody argv=/usr/libexec/postfix/kolab_policy_greylist # Inbound policy_spf unix - n n - - spawn user=nobody argv=/usr/libexec/postfix/kolab_policy_spf # External submission, starttls 0.0.0.0:11587 inet n - n - - smtpd -o cleanup_service_name=cleanup_submission -o syslog_name=postfix/submission + -o content_filter=smtp-amavis:[AMAVIS_HOST]:13026 #-o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_authenticated_header=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_data_restrictions=$submission_data_restrictions -o smtpd_recipient_restrictions=$submission_recipient_restrictions -o smtpd_sender_restrictions=$submission_sender_restrictions # External submission, ssl 0.0.0.0:11465 inet n - n - - smtpd -o cleanup_service_name=cleanup_submission -o rewrite_service_name=rewrite_submission -o syslog_name=postfix/smtps + -o content_filter=smtp-amavis:[AMAVIS_HOST]:13026 -o mydestination= -o local_recipient_maps= -o relay_domains= -o relay_recipient_maps= -o smtpd_tls_security_level=encrypt -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_authenticated_header=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_sender_restrictions=$submission_sender_restrictions -o smtpd_recipient_restrictions=$submission_recipient_restrictions -o smtpd_data_restrictions=$submission_data_restrictions diff --git a/docker/postfix/rootfs/init.sh b/docker/postfix/rootfs/init.sh index e8a87abf..8105907f 100755 --- a/docker/postfix/rootfs/init.sh +++ b/docker/postfix/rootfs/init.sh @@ -1,50 +1,54 @@ #!/bin/bash set -e cat ${SSL_CERTIFICATE} ${SSL_CERTIFICATE_FULLCHAIN} ${SSL_CERTIFICATE_KEY} > /etc/pki/tls/private/postfix.pem chown postfix:mail /etc/pki/tls/private/postfix.pem chmod 655 /etc/pki/tls/private/postfix.pem chown -R postfix:mail /var/lib/postfix chown -R postfix:mail /var/spool/postfix +/usr/sbin/postfix set-permissions sed -i -r \ -e "s|APP_SERVICES_DOMAIN|$APP_SERVICES_DOMAIN|g" \ -e "s|SERVICES_PORT|$SERVICES_PORT|g" \ /etc/saslauthd.conf /usr/sbin/saslauthd -m /run/saslauthd -a httpform -d & # If host mounting /var/spool/postfix, we need to delete old pid file before # starting services rm -f /var/spool/postfix/pid/master.pid /usr/libexec/postfix/aliasesdb /usr/libexec/postfix/chroot-update sed -i -r \ -e "s|LMTP_DESTINATION|$LMTP_DESTINATION|g" \ + -e "s|APP_DOMAIN|$APP_DOMAIN|g" \ + -e "s|MYNETWORKS|$MYNETWORKS|g" \ + -e "s|AMAVIS_HOST|$AMAVIS_HOST|g" \ /etc/postfix/main.cf sed -i -r \ - -e "s|APP_DOMAIN|$APP_DOMAIN|g" \ -e "s|MYNETWORKS|$MYNETWORKS|g" \ - /etc/postfix/main.cf + -e "s|AMAVIS_HOST|$AMAVIS_HOST|g" \ + /etc/postfix/master.cf sed -i -r \ -e "s|SERVICES_HOST|http://$APP_SERVICES_DOMAIN:$SERVICES_PORT|g" \ /usr/libexec/postfix/kolab_policy* sed -i -r \ -e "s|DB_HOST|$DB_HOST|g" \ -e "s|DB_USERNAME|$DB_USERNAME|g" \ -e "s|DB_PASSWORD|$DB_PASSWORD|g" \ -e "s|DB_DATABASE|$DB_DATABASE|g" \ /etc/postfix/sql/* # echo "/$APP_DOMAIN/ lmtp:$LMTP_DESTINATION" >> /etc/postfix/transport # postmap /etc/postfix/transport /usr/sbin/postfix check exec /usr/sbin/postfix -c /etc/postfix start-fg