J'ai besoin de conseils: serveur de messagerie Linux à faible encombrement mémoire avec filtrage anti-spam

8

J'ai un VPS qui est à l'origine destiné à être un serveur Web mais certaines capacités minimales de messagerie doivent également être déployées, y compris l'envoi et la réception en tant que serveur autonome.

La configuration actuelle est la suivante:

  • Postfix réveille le courrier, les utilisateurs sont dans des tables virtuelles, stockées dans MySQL
  • à la connexion, tous les serveurs sont testés avec un service de pondération policière contre certains DNSBL
  • tout le courrier passe par SpamAssassin spamd avec l'aide du client spamc
  • le courrier est ensuite livré avec Dovecot 2 'LDA (agent de livraison local), ainsi que les utilisateurs virtuels

Comme vous l'avez vu ...

  • il n'y a pas de scanner de virus en cours d'exécution, et c'est pour une raison: clamav mange toute la mémoire possible et aussi, les mails de virus sont tous filtrés avec cette configuration (j'ai testé la même chose avec ClamAV activé pendant 1,5 ans, aucun mail de virus jamais est arrivé à ClamAV)
  • Je n'utilise pas amavisd et je ne veux vraiment pas. Vous n'avez besoin de ce monstre que si vous avez beaucoup de mémoire et beaucoup de scanners simultanés. C'est aussi un cauchemar de peaufiner à la main.
  • J'exécute policyd-weight au lieu de policyd et de DNSBL natifs dans postfix. Je n'aime pas renvoyer quelqu'un parce qu'un seul service l'a répertorié.

Déclaration importante: tout fonctionne bien. Je reçois une très petite quantité de spam, je n'obtiens presque jamais de faux positifs et la plupart des mauvais messages sont arrêtés par la police. Le seul "problème" que je ressens au total, c'est que les services utilisent un peu de mémoire.

J'ai déjà coupé les modules de spamassassin (voir ci-dessous), mais j'aimerais vraiment entendre quelques conseils sur la façon de réduire l'empreinte mémoire le plus bas possible, principalement: quels plugins SpamAssassin a vraiment besoin et quels sont plus ou moins inutiles, concernant ma configuration actuelle de postfix et de poids de police ?

Les règles de SpamAssassin sont également compilées avec sa-compile (sa-update s'exécute une fois par semaine à partir de cron, la compilation s'exécute juste après)

Ce sont quelques-unes des configurations actuelles qui peuvent être importantes, veuillez me dire si vous avez besoin de plus.

postfix/master.cf (pièces seulement)

dovecot   unix  -       n       n        -      -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/bin/spamc -e /usr/lib/dovecot/deliver -d ${recipient} -f {sender}

postfix/main.cf (pièces seulement)

smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
        reject_invalid_hostname,
        permit

smtpd_recipient_restrictions =  permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_hostname,
        reject_non_fqdn_hostname,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_unauth_pipelining,
        reject_unauth_destination,
        check_policy_service inet:127.0.0.1:12525,
        permit

policyd-weight.conf (pièces seulement)

$REJECTMSG = "550 Mail appeared to be SPAM or forged. Ask your Mail/DNS-Administrator to correct HELO and DNS MX settings or to get removed from DNSBLs";

$REJECTLEVEL = 4;
$DEFER_STRING = 'IN_SPAMCOP= BOGUS_MX=';
$DEFER_ACTION = '450';
$DEFER_LEVEL  = 5;
$DNSERRMSG = '450 No DNS entries for your MTA, HELO and Domain. Contact YOUR administrator';

# 1: ON, 0: OFF (default)
# If ON request that ALL clients are only checked against RBLs
$dnsbl_checks_only = 0;

# 1: ON (default), 0: OFF
# When set to ON it logs only RBLs which affect scoring (positive or negative)
$LOG_BAD_RBL_ONLY  = 1;

## DNSBL settings
@dnsbl_score = (
        # host,                 hit,    miss,   log name
        'dnsbl.ahbl.org',       3,      -1,     'dnsbl.ahbl.org',
        'dnsbl.njabl.org',      3,      -1,     'dnsbl.njabl.org',
        'dnsbl.sorbs.net',      3,      -1,     'dnsbl.sorbs.net',
        'bl.spamcop.net',       3,      -1,     'bl.spamcop.net',
        'zen.spamhaus.org',     3,      -1,     'zen.spamhaus.org',
        'pbl.spamhaus.org',     3,      -1,     'pbl.spamhaus.org',
        'cbl.abuseat.org',      3,      -1,     'cbl.abuseat.org',
        'list.dsbl.org',        3,      -1,     'list.dsbl.org',
);

# If Client IP is listed in MORE DNSBLS than this var, it gets REJECTed immediately
$MAXDNSBLHITS  = 3;

# alternatively, if the score of DNSBLs is ABOVE this level, reject immediately
$MAXDNSBLSCORE = 9;

$MAXDNSBLMSG = '550 Az levelezoszerveruk IP cime tul sok spamlistan talahato, kerjuk ellenorizze! / Your MTA is listed in too many DNSBLs; please check.';

## RHSBL settings
@rhsbl_score = (
        'multi.surbl.org',              4,      0,      'multi.surbl.org',
        'rhsbl.ahbl.org',               4,      0,      'rhsbl.ahbl.org',
        'dsn.rfc-ignorant.org',         4,      0,      'dsn.rfc-ignorant.org',
#       'postmaster.rfc-ignorant.org',  0.1,    0,      'postmaster.rfc-ignorant.org',
#       'abuse.rfc-ignorant.org',       0.1,    0,      'abuse.rfc-ignorant.org'
);

# skip a RBL if this RBL had this many continuous errors
$BL_ERROR_SKIP = 2;

# skip a RBL for that many times
$BL_SKIP_RELEASE = 10;

## cache stuff
# must be a directory (add trailing slash)
$LOCKPATH = '/var/run/policyd-weight/';

# socket path for the cache daemon.
$SPATH = $LOCKPATH.'/polw.sock';

# how many seconds the cache may be idle before starting maintenance routines
#NOTE: standard maintenance jobs happen regardless of this setting.
$MAXIDLECACHE = 60;

# after this number of requests do following maintenance jobs: checking for config changes
$MAINTENANCE_LEVEL = 5;

# negative (i.e. SPAM) result cache settings ##################################

# set to 0 to disable caching for spam results. To this level the cache will be cleaned.
$CACHESIZE = 2000;

# at this number of entries cleanup takes place
$CACHEMAXSIZE = 4000;

$CACHEREJECTMSG  = '550 temporarily blocked because of previous errors';

# after NTTL retries the cache entry is deleted
$NTTL = 1;

# client MUST NOT retry within this seconds in order to decrease TTL counter
$NTIME = 30;

# positve (i.,e. HAM) result cache settings ###################################

# set to 0 to disable caching of HAM. To this number of entries the cache will be cleaned
$POSCACHESIZE = 1000;

# at this number of entries cleanup takes place
$POSCACHEMAXSIZE = 2000;

$POSCACHEMSG = 'using cached result';

#after PTTL requests the HAM entry must succeed one time the RBL checks again
$PTTL = 60;

# after $PTIME in HAM Cache the client must pass one time the RBL checks again.
#Values must be nonfractal. Accepted time-units: s, m, h, d
$PTIME = '3h';

# The client must pass this time the RBL checks in order to be listed as hard-HAM
# After this time the client will pass immediately for PTTL within PTIME
$TEMP_PTIME = '1d';


## DNS settings

# Retries for ONE DNS-Lookup
$DNS_RETRIES = 1;

# Retry-interval for ONE DNS-Lookup
$DNS_RETRY_IVAL  = 5;

# max error count for unresponded queries in a complete policy query
$MAXDNSERR = 3;

$MAXDNSERRMSG = 'passed - too many local DNS-errors';

# persistent udp connection for DNS queries.
#broken in Net::DNS version 0.51. Works with Net::DNS 0.53; DEFAULT: off
$PUDP= 0;

# Force the usage of Net::DNS for RBL lookups.
# Normally policyd-weight tries to use a faster RBL lookup routine instead of Net::DNS
$USE_NET_DNS  = 0;

# A list of space separated NS IPs
# This overrides resolv.conf settings
# Example: $NS = '1.2.3.4 1.2.3.5';
# DEFAULT: empty
$NS  = '';

# timeout for receiving from cache instance
$IPC_TIMEOUT  = 2;

# If set to 1 policyd-weight closes connections to smtpd clients in order to avoid too many
#established connections to one policyd-weight child
$TRY_BALANCE  = 0;

# scores for checks, WARNING: they may manipulate eachother
# or be factors for other scores.
#  HIT score, MISS Score
@client_ip_eq_helo_score = (1.5, -1.25 );
@helo_score  = (1.5, -2 );
@helo_score  = (0, -2 );
@helo_from_mx_eq_ip_score= (1.5, -3.1  );
@helo_numeric_score= (2.5,  0 );
@from_match_regex_verified_helo= (1,-2 );
@from_match_regex_unverified_helo = (1.6, -1.5  );
@from_match_regex_failed_helo  = (2.5,  0 );
@helo_seems_dialup = (1.5,  0 );
@failed_helo_seems_dialup= (2, 0 );
@helo_ip_in_client_subnet= (0,-1.2  );
@helo_ip_in_cl16_subnet  = (0,-0.41 );
#@client_seems_dialup_score  = (3.75, 0 );
@client_seems_dialup_score  = (0, 0 );
@from_multiparted  = (1.09, 0 );
@from_anon= (1.17, 0 );
@bogus_mx_score = (2.1,  0 );
@random_sender_score  = (0.25, 0 );
@rhsbl_penalty_score  = (3.1,  0 );
@enforce_dyndns_score = (3, 0 );

spamassassin/init.pre (J'ai rassemblé les fichiers .pre)

loadplugin Mail::SpamAssassin::Plugin::Hashcash
loadplugin Mail::SpamAssassin::Plugin::SPF
loadplugin Mail::SpamAssassin::Plugin::Pyzor
loadplugin Mail::SpamAssassin::Plugin::Razor2
loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
loadplugin Mail::SpamAssassin::Plugin::Check
loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
loadplugin Mail::SpamAssassin::Plugin::URIDetail    
loadplugin Mail::SpamAssassin::Plugin::Bayes
loadplugin Mail::SpamAssassin::Plugin::BodyEval
loadplugin Mail::SpamAssassin::Plugin::DNSEval
loadplugin Mail::SpamAssassin::Plugin::HTMLEval
loadplugin Mail::SpamAssassin::Plugin::HeaderEval
loadplugin Mail::SpamAssassin::Plugin::MIMEEval
loadplugin Mail::SpamAssassin::Plugin::RelayEval
loadplugin Mail::SpamAssassin::Plugin::URIEval
loadplugin Mail::SpamAssassin::Plugin::WLBLEval
loadplugin Mail::SpamAssassin::Plugin::VBounce
loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody

spamassassin/local.cf (les pièces)

use_bayes                       1
bayes_auto_learn                1
bayes_store_module              Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn                   DBI:mysql:db:127.0.0.1:3306
bayes_sql_username              user
bayes_sql_password              pass
bayes_ignore_header             X-Bogosity
bayes_ignore_header             X-Spam-Flag
bayes_ignore_header             X-Spam-Status

### User settings
user_scores_dsn                 DBI:mysql:db:127.0.0.1:3306
user_scores_sql_password        user
user_scores_sql_username        pass
user_scores_sql_custom_query    SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '$GLOBAL' OR username = CONCAT('%',_DOMAIN_) ORDER BY username ASC

# for better speed
score DNS_FROM_AHBL_RHSBL       0
score __RFC_IGNORANT_ENVFROM    0
score DNS_FROM_RFC_DSN          0
score DNS_FROM_RFC_BOGUSMX      0
score __DNS_FROM_RFC_POST       0
score __DNS_FROM_RFC_ABUSE      0
score __DNS_FROM_RFC_WHOIS      0

MISE À JOUR 01

Comme l'adaptr l'a conseillé, je supprime le poids de police et l'écran de postfix configuré, cela a entraîné environ -15-20 Mo d'utilisation de la RAM et un travail beaucoup plus rapide. Je ne suis pas sûr que cela fonctionne à pleine capacité, mais cela semble prometteur.

petermolnar
la source
1
Mise à niveau vers postfix 2.8+; le post-écran évite à peu près le besoin de pondération policière: il inclut la liste complète DNSBL et RHSBL, ainsi que la notation DNSBL pondérée.
adaptr
@adaptr il semble que j'aie postfix 2.8.5-2 ~ build1, le serveur est ubuntu 11.10. Je n'ai pas remarqué cette nouvelle fonction dans postfix mais elle semble prometteuse - le seul problème que je ne peux pas trouver d'exemples de configurations pour elle et la page de manuel est une sorte de puritaine. Pouvez-vous pointer ou poster un exemple s'il vous plaît?
petermolnar
OK, je l'ai plus ou moins configuré, sauf que je ne suis pas sûr qu'il surveille également les connexions smtps. Si quelqu'un peut répondre à cela, les questions détaillées sont ici: serverfault.com/questions/372448/…
petermolnar
La documentation officielle du post-écran devrait suffire pour commencer; bien sûr, vous devez comprendre comment configurer postfix en général pour l'utiliser.
adaptr

Réponses:

2

Je vous recommande de mettre à niveau vers postfix 2.8+ et de déployer l' écran de poste ; il est spécifiquement conçu comme un serveur de triage zombie / DNSBL et gère plusieurs listes noires à grande vitesse.

Il propose également un score noir / liste blanche entièrement pondéré, une liste blanche explicite, etc.

En ce qui concerne votre deuxième question, je vous suggère de vérifier spamass-milter ; un milter en ligne est beaucoup plus efficace qu'un processus externe.

adaptr
la source
Je ne veux pas paraître hâtif, mais après quelques heures de fonctionnement avec un écran de post activé et un poids de police désactivé, l'utilisation de la RAM semble sensiblement inférieure. Je suis vraiment gracieux pour l'astuce mais j'aimerais quand même entendre des astuces sur SpamAssassin.
petermolnar