mail
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
mail [2017/11/04 17:40] – Ajout postfix mirtouf | mail [2017/11/26 10:42] (Version actuelle) – [3.1. main.cf] Modification DH mirtouf | ||
---|---|---|---|
Ligne 40: | Ligne 40: | ||
puis dovecot: | puis dovecot: | ||
< | < | ||
- | apt install dovecot-imapd | + | apt install dovecot-imapd |
</ | </ | ||
Ligne 51: | Ligne 51: | ||
< | < | ||
apt install nginx-full uwsgi-python | apt install nginx-full uwsgi-python | ||
+ | </ | ||
+ | |||
+ | puis redis-server: | ||
+ | < | ||
+ | apt install redis-server | ||
+ | </ | ||
+ | |||
+ | puis clamav: | ||
+ | < | ||
+ | apt install clamav clamav-daemon | ||
</ | </ | ||
Ligne 63: | Ligne 73: | ||
===== 2. Installation et configuration de modoboa ===== | ===== 2. Installation et configuration de modoboa ===== | ||
+ | ==== 2.1. Installation de modoboa via pip ==== | ||
C'est du python et donc il faut mieux travailler dans un // | C'est du python et donc il faut mieux travailler dans un // | ||
Avec votre utilisateur non privilégié il faut passer dans un environnement virtuel pour installer modoboa: | Avec votre utilisateur non privilégié il faut passer dans un environnement virtuel pour installer modoboa: | ||
Ligne 73: | Ligne 84: | ||
</ | </ | ||
- | puis déployer une instance (référez-vous à la [[https:// | + | ==== 2.2. Déploiement de modoboa ==== |
+ | Ensuite il faut déployer une instance (référez-vous à la [[https:// | ||
< | < | ||
- | pour de belles statistiques (utilisateur privilégié): | + | pour de belles statistiques (utilisateur privilégié |
< | < | ||
où ce chemin sera renseigné dans l' | où ce chemin sera renseigné dans l' | ||
Ligne 85: | Ligne 97: | ||
Veuillez noter que selon votre configuration, | Veuillez noter que selon votre configuration, | ||
- | Le fichier à placer | + | ==== 2.3. Crontab pour modoboa ==== |
+ | Le fichier à éditer | ||
< | < | ||
# Modoboa specific cron jobs | # Modoboa specific cron jobs | ||
Ligne 113: | Ligne 126: | ||
===== 3. Postfix ===== | ===== 3. Postfix ===== | ||
+ | ==== 3.1. main.cf ==== | ||
Pour postfix c'est assez simple, le main.cf (avec une mise en forme qui plairait à hardware): | Pour postfix c'est assez simple, le main.cf (avec une mise en forme qui plairait à hardware): | ||
< | < | ||
Ligne 203: | Ligne 217: | ||
smtpd_tls_cert_file | smtpd_tls_cert_file | ||
smtpd_tls_key_file | smtpd_tls_key_file | ||
- | smtpd_tls_dh1024_param_file | + | smtpd_tls_dh1024_param_file |
- | smtpd_tls_dh512_param_file | + | |
tls_preempt_cipherlist = yes | tls_preempt_cipherlist = yes | ||
Ligne 248: | Ligne 261: | ||
transport_maps | transport_maps | ||
mysql:/ | mysql:/ | ||
- | mysql:/ | + | mysql:/ |
+ | hash:/ | ||
###################### | ###################### | ||
Ligne 384: | Ligne 398: | ||
:!: Veuillez noter que / | :!: Veuillez noter que / | ||
+ | Le fichier Diffie-Hellman contient ceci et est préférentiellement choisi car audité de façon régulière: | ||
+ | < | ||
+ | -----BEGIN DH PARAMETERS----- | ||
+ | MIIBCAKCAQEA////////// | ||
+ | +8yTnc4kmz75fS/ | ||
+ | 87VXE15/ | ||
+ | YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi | ||
+ | 7MA0BM0oNC9hkXL+nOmFg/ | ||
+ | ssbzSibBsu/ | ||
+ | -----END DH PARAMETERS----- | ||
+ | </ | ||
+ | ==== 3.2. master.cf ==== | ||
Le master.cf: | Le master.cf: | ||
< | < | ||
Ligne 498: | Ligne 524: | ||
-o smtp_dns_support_level=dnssec | -o smtp_dns_support_level=dnssec | ||
-o smtp_tls_security_level=dane | -o smtp_tls_security_level=dane | ||
+ | |||
+ | # Modoboa DMARC | ||
+ | dmarc-rua-parser unix - | ||
+ | flags= user=vmail: | ||
# Zeyple | # Zeyple | ||
Ligne 515: | Ligne 545: | ||
# Vacation (modoboa) | # Vacation (modoboa) | ||
autoreply | autoreply | ||
- | | + | |
+ | </ | ||
+ | |||
+ | ==== 3.3. Complément DMARC ==== | ||
+ | Il faut ajouter le fichier suivant dans / | ||
+ | < | ||
+ | adresse_dmarc_enregistrement_DNS@domaine.tld dmarc-rua-parser: | ||
+ | </ | ||
+ | puis un coup de postmap bien placé: | ||
+ | < | ||
+ | postmap / | ||
+ | </ | ||
+ | ===== 4.Dovecot ===== | ||
+ | ==== 4.1. Configuration générale ==== | ||
+ | La configuration générale de dovecot dans / | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | disable_plaintext_auth = no | ||
+ | auth_cache_ttl = 1 hour | ||
+ | auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@ | ||
+ | auth_mechanisms = plain login | ||
+ | !include auth-sql.conf.ext | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | service director { | ||
+ | unix_listener login/ | ||
+ | } | ||
+ | fifo_listener login/ | ||
+ | } | ||
+ | unix_listener director-userdb { | ||
+ | } | ||
+ | inet_listener { | ||
+ | } | ||
+ | } | ||
+ | service imap-login { | ||
+ | } | ||
+ | service pop3-login { | ||
+ | } | ||
+ | protocol lmtp { | ||
+ | } | ||
+ | |||
+ | log_path = / | ||
+ | info_log_path = / | ||
+ | auth_verbose = yes | ||
+ | auth_verbose_passwords = sha1 | ||
+ | plugin { | ||
+ | } | ||
+ | log_timestamp = " | ||
+ | </ | ||
+ | |||
+ | ==> | ||
+ | < | ||
+ | mail_location = maildir: | ||
+ | namespace inbox { | ||
+ | inbox = yes | ||
+ | } | ||
+ | mail_uid = 5000 | ||
+ | mail_gid = 5000 | ||
+ | mail_privileged_group = mail | ||
+ | valid_chroot_dirs = / | ||
+ | mail_plugins = $mail_plugins quota | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | service imap-login { | ||
+ | inet_listener imap { | ||
+ | port = 143 | ||
+ | } | ||
+ | inet_listener imaps { | ||
+ | port = 993 | ||
+ | ssl = yes | ||
+ | } | ||
+ | } | ||
+ | service pop3-login { | ||
+ | inet_listener pop3 { | ||
+ | port = 110 | ||
+ | } | ||
+ | inet_listener pop3s { | ||
+ | port = 995 | ||
+ | ssl = yes | ||
+ | } | ||
+ | } | ||
+ | service lmtp { | ||
+ | unix_listener / | ||
+ | mode = 0600 | ||
+ | user = postfix | ||
+ | group = postfix | ||
+ | } | ||
+ | user = vmail | ||
+ | } | ||
+ | service imap { | ||
+ | executable = imap postlogin | ||
+ | } | ||
+ | service pop3 { | ||
+ | executable = pop3 postlogin | ||
+ | } | ||
+ | service auth { | ||
+ | unix_listener auth-userdb { | ||
+ | } | ||
+ | unix_listener / | ||
+ | mode = 0666 | ||
+ | user = postfix | ||
+ | group = postfix | ||
+ | } | ||
+ | } | ||
+ | service auth-worker { | ||
+ | } | ||
+ | service dict { | ||
+ | unix_listener dict { | ||
+ | mode = 0600 | ||
+ | user = vmail | ||
+ | } | ||
+ | } | ||
+ | service postlogin { | ||
+ | executable = script-login / | ||
+ | user = modoboa | ||
+ | unix_listener postlogin { | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | ssl = required | ||
+ | ssl_cert = </ | ||
+ | ssl_key = </ | ||
+ | ssl_dh_parameters_length = 2048 | ||
+ | ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256: | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | postmaster_address = postmaster@domaine.tld | ||
+ | quota_full_tempfail = yes | ||
+ | recipient_delimiter = + | ||
+ | lda_mailbox_autocreate = yes | ||
+ | lda_mailbox_autosubscribe = yes | ||
+ | protocol lda { | ||
+ | log_path = / | ||
+ | info_log_path = / | ||
+ | mail_plugins = quota sieve | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | namespace inbox { | ||
+ | mailbox Drafts { | ||
+ | auto = subscribe | ||
+ | special_use = \Drafts | ||
+ | } | ||
+ | mailbox Junk { | ||
+ | auto = subscribe | ||
+ | special_use = \Junk | ||
+ | } | ||
+ | mailbox Trash { | ||
+ | auto = subscribe | ||
+ | special_use = \Trash | ||
+ | } | ||
+ | mailbox Sent { | ||
+ | auto = subscribe | ||
+ | special_use = \Sent | ||
+ | } | ||
+ | mailbox "Sent Messages" | ||
+ | auto = subscribe | ||
+ | special_use = \Sent | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | protocol imap { | ||
+ | mail_plugins = $mail_plugins imap_quota imap_sieve | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | protocol lmtp { | ||
+ | postmaster_address = postmaster@domaine.tld | ||
+ | mail_plugins = $mail_plugins sieve quota | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | protocols = $protocols sieve | ||
+ | service managesieve-login { | ||
+ | inet_listener sieve { | ||
+ | port = 4190 | ||
+ | } | ||
+ | service_count = 1 | ||
+ | process_min_avail = 0 | ||
+ | vsz_limit = 64M | ||
+ | } | ||
+ | service managesieve { | ||
+ | } | ||
+ | protocol sieve { | ||
+ | managesieve_max_line_length = 65536 | ||
+ | mail_max_userip_connections = 10 | ||
+ | mail_plugins = | ||
+ | managesieve_logout_format = bytes=%i/ | ||
+ | managesieve_implementation_string = Dovecot Pigeonhole | ||
+ | managesieve_max_compile_errors = 5 | ||
+ | log_path=/ | ||
+ | info_log_path=/ | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | protocol pop3 { | ||
+ | mail_plugins = $mail_plugins | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | plugin { | ||
+ | } | ||
+ | plugin { | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | plugin { | ||
+ | } | ||
+ | plugin { | ||
+ | quota_warning = storage=75%% / | ||
+ | quota_warning2 = storage=90%% / | ||
+ | } | ||
+ | plugin { | ||
+ | quota = maildir: | ||
+ | } | ||
+ | plugin { | ||
+ | quota = dict:User quota:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | plugin { | ||
+ | sieve = ~/ | ||
+ | sieve_dir = ~/sieve | ||
+ | sieve_default = / | ||
+ | sieve_global = / | ||
+ | sieve_plugins = sieve_imapsieve sieve_extprograms | ||
+ | imapsieve_mailbox1_name = Spam | ||
+ | imapsieve_mailbox1_causes = COPY | ||
+ | imapsieve_mailbox1_before = file:/ | ||
+ | imapsieve_mailbox2_name = * | ||
+ | imapsieve_mailbox2_from = Spam | ||
+ | imapsieve_mailbox2_causes = COPY | ||
+ | imapsieve_mailbox2_before = file:/ | ||
+ | sieve_pipe_bin_dir = / | ||
+ | sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment | ||
+ | recipient_delimiter = + | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | plugin { | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = checkpassword | ||
+ | args = / | ||
+ | } | ||
+ | userdb { | ||
+ | driver = prefetch | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = passwd-file | ||
+ | deny = yes | ||
+ | args = / | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = dict | ||
+ | args = / | ||
+ | } | ||
+ | userdb { | ||
+ | driver = dict | ||
+ | args = / | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = passwd-file | ||
+ | master = yes | ||
+ | args = / | ||
+ | pass = yes | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = passwd-file | ||
+ | args = scheme=CRYPT username_format=%u / | ||
+ | } | ||
+ | userdb { | ||
+ | driver = passwd-file | ||
+ | args = username_format=%u / | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = sql | ||
+ | args = / | ||
+ | } | ||
+ | userdb { | ||
+ | driver = sql | ||
+ | args = / | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = pam | ||
+ | } | ||
+ | userdb { | ||
+ | driver = passwd | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | passdb { | ||
+ | driver = vpopmail | ||
+ | args = | ||
+ | } | ||
+ | userdb { | ||
+ | driver = vpopmail | ||
+ | args = quota_template=quota_rule=*: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== 4.2. Gestion de la db ==== | ||
+ | Les autres fichiers utiles tels ==>/ | ||
+ | < | ||
+ | default_pass_scheme = MD5 | ||
+ | iterate_prefix = userdb/ | ||
+ | key passdb { | ||
+ | key = passdb/%u | ||
+ | format = json | ||
+ | } | ||
+ | key userdb { | ||
+ | key = userdb/%u | ||
+ | format = json | ||
+ | } | ||
+ | key quota { | ||
+ | key = userdb/ | ||
+ | default_value = 100M | ||
+ | } | ||
+ | passdb_objects = passdb | ||
+ | userdb_objects = userdb | ||
+ | userdb_fields { | ||
+ | quota_rule = *: | ||
+ | mail = maildir: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | connect = host=127.0.0.1 dbname=DB user=USER password=PWD | ||
+ | map { | ||
+ | pattern = priv/ | ||
+ | table = admin_quota | ||
+ | username_field = username | ||
+ | value_field = bytes | ||
+ | } | ||
+ | map { | ||
+ | pattern = priv/ | ||
+ | table = admin_quota | ||
+ | username_field = username | ||
+ | value_field = messages | ||
+ | } | ||
+ | map { | ||
+ | pattern = shared/ | ||
+ | table = expires | ||
+ | value_field = expire_stamp | ||
+ | fields { | ||
+ | username = $user | ||
+ | mailbox = $mailbox | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | driver = mysql | ||
+ | connect = host=127.0.0.1 dbname=DB user=USER password=PWD | ||
+ | default_pass_scheme = CRYPT | ||
+ | password_query = SELECT email AS user, password FROM core_user WHERE email=' | ||
+ | user_query = SELECT '/ | ||
+ | iterate_query = SELECT email AS user FROM core_user | ||
+ | </ | ||
+ | |||
+ | ==== 4.3. scripts utiles ==== | ||
+ | Il faut aussi des scripts utiles: | ||
+ | ==>/ | ||
+ | < | ||
+ | #!/bin/sh | ||
+ | |||
+ | DBNAME=DB | ||
+ | DBUSER=USER | ||
+ | DBPASSWORD=PWD | ||
+ | |||
+ | echo " | ||
+ | |||
+ | exec " | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | #!/bin/sh | ||
+ | PERCENT=$1 | ||
+ | USER=$2 | ||
+ | cat << EOF | / | ||
+ | From: postmaster@domaine.tld | ||
+ | Subject: quota warning | ||
+ | |||
+ | Your mailbox is now $PERCENT% full. | ||
+ | EOF | ||
+ | </ | ||
+ | |||
+ | ==== 4.4 antispam ==== | ||
+ | Pour l' | ||
+ | ==>/ | ||
+ | < | ||
+ | require [" | ||
+ | |||
+ | if environment :matches " | ||
+ | set " | ||
+ | } | ||
+ | |||
+ | if string " | ||
+ | stop; | ||
+ | } | ||
+ | |||
+ | if environment :matches " | ||
+ | set " | ||
+ | } | ||
+ | |||
+ | pipe :copy " | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | require [" | ||
+ | |||
+ | if environment :matches " | ||
+ | set " | ||
+ | } | ||
+ | |||
+ | pipe :copy " | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | # | ||
+ | |||
+ | # rspamd client reads piped ham message from the standard input | ||
+ | exec / | ||
+ | </ | ||
+ | |||
+ | ==>/ | ||
+ | < | ||
+ | # | ||
+ | |||
+ | # rspamd client reads piped spam message from the standard input | ||
+ | exec / | ||
+ | </ | ||
+ | |||
+ | ===== 5. nginx et uwsgi ===== | ||
+ | ==== 5.1. configuration du domaine principal ==== | ||
+ | Le domaine principal mail.domaine.tld sera configuré de cette façon: | ||
+ | < | ||
+ | server { | ||
+ | listen 80; | ||
+ | # listen [::]:80 ipv6only=on; | ||
+ | root / | ||
+ | |||
+ | # Make site accessible from http:// | ||
+ | server_name mail.domaine.tld localhost; | ||
+ | |||
+ | if ($ssl_protocol = "" | ||
+ | rewrite ^/ | ||
+ | } | ||
+ | } | ||
+ | |||
+ | server { | ||
+ | listen 443 ssl http2; | ||
+ | # listen [::]:443 ssl http2; | ||
+ | ssl on; | ||
+ | keepalive_timeout 70; | ||
+ | |||
+ | server_name mail.domaine.tld localhost; | ||
+ | root / | ||
+ | |||
+ | ssl_certificate / | ||
+ | ssl_certificate_key / | ||
+ | |||
+ | access_log | ||
+ | error_log / | ||
+ | |||
+ | location / | ||
+ | autoindex on; | ||
+ | alias / | ||
+ | } | ||
+ | |||
+ | # Whether or not Modoboa uses a media directory depends on how | ||
+ | # you configured Modoboa. It does not hurt to have this. | ||
+ | location /media/ { | ||
+ | autoindex on; | ||
+ | alias / | ||
+ | } | ||
+ | |||
+ | # This denies access to any file that begins with | ||
+ | # " | ||
+ | # Modoboa installed from scratch would not contain any such | ||
+ | # files, but you never know what the future holds. | ||
+ | location ~ /\.ht { | ||
+ | deny all; | ||
+ | } | ||
+ | |||
+ | location / { | ||
+ | include uwsgi_params; | ||
+ | uwsgi_pass unix:/ | ||
+ | uwsgi_param UWSGI_SCRIPT instance.wsgi: | ||
+ | uwsgi_param UWSGI_SCHEME https; | ||
+ | } | ||
+ | |||
+ | location /rspamd/ { | ||
+ | proxy_pass | ||
+ | proxy_set_header Host $host; | ||
+ | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== 5.2. uwsgi ==== | ||
+ | et le fichier nécessaire pour uwsgi (à adapter à votre utilisation): | ||
+ | < | ||
+ | [uwsgi] | ||
+ | plugins = python | ||
+ | chdir = / | ||
+ | venv = / | ||
+ | module = < | ||
+ | master = true | ||
+ | harakiri = 60 | ||
+ | processes = 2 | ||
+ | vhost = true | ||
+ | no-default-app = true | ||
+ | </ | ||
+ | |||
+ | Je précise qu'il faudra modifier la configuration TLS par défaut de nginx que je trouve trop lâche mais je vous laisse faire vos choix. | ||
+ | |||
+ | ===== 6. Rspamd ===== | ||
+ | ==== 6.1. Configuration ==== | ||
+ | Les fichiers de configuration de rspamd ne doivent pas être modifiés, il faut soit les compléter (dossier local.d) ou les remplacer (override.d), | ||
+ | ==>/ | ||
+ | < | ||
+ | worker " | ||
+ | count = 1; | ||
+ | } | ||
+ | |||
+ | multimap { | ||
+ | # ip - matches source IP of message (radix map) | ||
+ | # from - matches envelope from (or header From if envelope from is absent) | ||
+ | # rcpt - matches any of envelope rcpt or header To if envelope info is missing | ||
+ | # header - matches any header specified (must have header = " | ||
+ | # dnsbl - matches source IP against some DNS blacklist (consider using RBL module for this) | ||
+ | local_bl_ip { type = " | ||
+ | local_bl_from { type = " | ||
+ | local_bl_rcpt { type = " | ||
+ | local_wl_ip { type = " | ||
+ | local_wl_from { type = " | ||
+ | local_wl_rcpt { type = " | ||
+ | } | ||
+ | |||
+ | metric { | ||
+ | name = " | ||
+ | group { | ||
+ | name = " | ||
+ | symbol { | ||
+ | weight = 3; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | symbol { | ||
+ | weight = 3; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | symbol { | ||
+ | weight = 3; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | symbol { | ||
+ | weight = -10; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | symbol { | ||
+ | weight = -5; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | symbol { | ||
+ | weight = -5; | ||
+ | description = " | ||
+ | name = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | Les fichiers créés pour l' | ||
+ | ==> / | ||
+ | < | ||
+ | # multiple scanners could be checked, for each we create a configuration block with an arbitrary name | ||
+ | clamav { | ||
+ | enabled = true; | ||
+ | # If set force this action if any virus is found (default unset: no action is forced) | ||
+ | action = " | ||
+ | # if `true` only messages with non-image attachments will be checked (default true) | ||
+ | attachments_only = false; | ||
+ | # If `max_size` is set, messages > n bytes in size are not scanned | ||
+ | #max_size = 20000000; | ||
+ | # symbol to add (add it to metric if you want non-zero weight) | ||
+ | symbol = " | ||
+ | # type of scanner: " | ||
+ | type = " | ||
+ | # If set true, log message is emitted for clean messages | ||
+ | #log_clean = false; | ||
+ | # For " | ||
+ | #product_id = 12345; | ||
+ | # For " | ||
+ | log_clean = true; | ||
+ | # servers to query (if port is unspecified, | ||
+ | # can be specified multiple times to pool servers | ||
+ | # can be set to a path to a unix socket | ||
+ | servers = " | ||
+ | # if `patterns` is specified virus name will be matched against provided regexes and the related | ||
+ | # symbol will be yielded if a match is found. If no match is found, default symbol is yielded. | ||
+ | patterns { | ||
+ | # symbol_name = " | ||
+ | JUST_EICAR = " | ||
+ | } | ||
+ | # `whitelist` points to a map of IP addresses. Mail from these addresses is not scanned. | ||
+ | #whitelist = "/ | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # local.d/ | ||
+ | |||
+ | # If false, messages with empty envelope from are not signed | ||
+ | allow_envfrom_empty = false; | ||
+ | # If true, envelope/ | ||
+ | allow_hdrfrom_mismatch = false; | ||
+ | # If true, multiple from headers are allowed (but only first is used) | ||
+ | allow_hdrfrom_multiple = true; | ||
+ | # If true, username does not need to contain matching domain | ||
+ | allow_username_mismatch = true; | ||
+ | # If false, messages from authenticated users are not selected for signing | ||
+ | auth_only = true; | ||
+ | # Default path to key, can include ' | ||
+ | path = "/ | ||
+ | # Default selector to use | ||
+ | selector = " | ||
+ | # If false, messages from local networks are not selected for signing | ||
+ | sign_local = true; | ||
+ | # Symbol to add when message is signed | ||
+ | symbol_signed = " | ||
+ | # Whether to fallback to global config | ||
+ | try_fallback = true; | ||
+ | # Domain to use for ARC signing: can be " | ||
+ | use_domain = " | ||
+ | # Whether to normalise domains to eSLD | ||
+ | use_esld = false; | ||
+ | # Whether to get keys from Redis | ||
+ | use_redis = false; | ||
+ | # Hash for ARC keys in Redis | ||
+ | key_prefix = " | ||
+ | # map of domains -> names of selectors (since rspamd 1.5.3) | ||
+ | # | ||
+ | # map of domains -> paths to keys (since rspamd 1.5.3) | ||
+ | #path_map = "/ | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | servers = " | ||
+ | backend = " | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # If false, messages with empty envelope from are not signed | ||
+ | allow_envfrom_empty = true; | ||
+ | |||
+ | # If true, envelope/ | ||
+ | allow_hdrfrom_mismatch = false; | ||
+ | |||
+ | # If true, multiple from headers are allowed (but only first is used) | ||
+ | allow_hdrfrom_multiple = true; | ||
+ | |||
+ | # If true, username does not need to contain matching domain | ||
+ | allow_username_mismatch = true; | ||
+ | |||
+ | # If false, messages from authenticated users are not selected for signing | ||
+ | auth_only = true; | ||
+ | |||
+ | # Default path to key, can include ' | ||
+ | path = "/ | ||
+ | |||
+ | # Default selector to use | ||
+ | selector = " | ||
+ | |||
+ | # If false, messages from local networks are not selected for signing | ||
+ | sign_local = true; | ||
+ | |||
+ | # Map file of IP addresses/ | ||
+ | # sign_networks = "/ | ||
+ | |||
+ | # Symbol to add when message is signed | ||
+ | symbol = " | ||
+ | |||
+ | # Whether to fallback to global config | ||
+ | try_fallback = true; | ||
+ | |||
+ | # Domain to use for DKIM signing: can be " | ||
+ | use_domain = " | ||
+ | |||
+ | # Domain to use for DKIM signing when sender is in sign_networks (" | ||
+ | # | ||
+ | |||
+ | # Domain to use for DKIM signing when sender is a local IP (" | ||
+ | # | ||
+ | |||
+ | # Whether to normalise domains to eSLD | ||
+ | use_esld = falsee; | ||
+ | |||
+ | # Whether to get keys from Redis | ||
+ | use_redis = false; | ||
+ | |||
+ | # Hash for DKIM keys in Redis | ||
+ | key_prefix = " | ||
+ | |||
+ | # map of domains -> names of selectors (since rspamd 1.5.3) | ||
+ | # | ||
+ | |||
+ | # map of domains -> paths to keys (since rspamd 1.5.3) | ||
+ | #path_map = "/ | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | dmarc { | ||
+ | # Enables storing reporting information to redis | ||
+ | reporting = true; | ||
+ | # If Redis server is not configured below, settings from redis {} will be used | ||
+ | #servers = " | ||
+ | # Alternatively set read_servers / write_servers to split reads and writes | ||
+ | # To set custom prefix for redis keys: | ||
+ | # | ||
+ | # Actions to enforce based on DMARC disposition (empty by default) | ||
+ | actions = { | ||
+ | quarantine = " | ||
+ | reject = " | ||
+ | } | ||
+ | # Ignore " | ||
+ | # no_sampling_domains = "/ | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | servers = " | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | greylist { | ||
+ | servers = " | ||
+ | # | ||
+ | # | ||
+ | # ] | ||
+ | # | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # Whitelist for greylist | ||
+ | debian.org | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | ip_score { | ||
+ | # servers = " | ||
+ | # threshold = 100; | ||
+ | # reject_score = 3; | ||
+ | # no_action_score = -2; | ||
+ | # add_header_score = 1; | ||
+ | # whitelist = " | ||
+ | # how each action is treated in scoring | ||
+ | actions { | ||
+ | reject = 1.0; | ||
+ | "add header" | ||
+ | " | ||
+ | "no action" | ||
+ | } | ||
+ | # how each component is evaluated | ||
+ | scores { | ||
+ | asn = 0.5; | ||
+ | country = 0.1; | ||
+ | ipnet = 0.8; | ||
+ | ip = 1.0; | ||
+ | } | ||
+ | # prefix for asn hashes | ||
+ | asn_prefix = " | ||
+ | # prefix for country hashes | ||
+ | country_prefix = " | ||
+ | # hash table in redis used for storing scores | ||
+ | hash = " | ||
+ | # prefix for subnet hashes | ||
+ | ipnet_prefix = " | ||
+ | # minimum number of messages to be scored | ||
+ | lower_bound = 10; | ||
+ | # the metric to score (usually " | ||
+ | metric = " | ||
+ | # upper and lower bounds at which to cap total score | ||
+ | #max_score = 10; | ||
+ | #min_score = -5; | ||
+ | # Amount to divide subscores by before applying tanh | ||
+ | score_divisor = 10; | ||
+ | # list of servers (or configure redis globally) | ||
+ | #servers = " | ||
+ | # symbol to be inserted | ||
+ | symbol = " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | debian.org | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | ::1 | ||
+ | 127.0.0.1 | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # A remplir | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | actions { | ||
+ | reject = 20; | ||
+ | # soft_reject = 15; | ||
+ | rewrite_subject = 8; | ||
+ | add_header = 6; | ||
+ | greylist = 4; | ||
+ | } | ||
+ | |||
+ | subject = "*** SPAM *** %s"; | ||
+ | |||
+ | symbol " | ||
+ | score = 1.0; | ||
+ | description = "No connectable MX"; | ||
+ | one_shot = " | ||
+ | } | ||
+ | |||
+ | symbol " | ||
+ | score = 2.0; | ||
+ | description = "No MX record"; | ||
+ | one_shot = " | ||
+ | } | ||
+ | |||
+ | symbol " | ||
+ | score = -0.5; | ||
+ | description = "MX was ok"; | ||
+ | one_shot = " | ||
+ | } | ||
+ | |||
+ | symbol " | ||
+ | weight = 2.0; | ||
+ | description = "IP reputation"; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | use = [" | ||
+ | |||
+ | skip_local = false; | ||
+ | skip_authenticated = true; | ||
+ | extended_spam_headers = true; | ||
+ | |||
+ | routines { | ||
+ | spam-header { | ||
+ | header = " | ||
+ | remove = 1; | ||
+ | value = " | ||
+ | } | ||
+ | x-spam-level { | ||
+ | header = " | ||
+ | remove = 1; | ||
+ | char = " | ||
+ | } | ||
+ | x-spam-status { | ||
+ | header = " | ||
+ | remove = 1; | ||
+ | } | ||
+ | x-virus { | ||
+ | header = " | ||
+ | remove = 1; | ||
+ | symbols = [" | ||
+ | } | ||
+ | authentication-results { | ||
+ | header = " | ||
+ | remove = 1; | ||
+ | spf_symbols { | ||
+ | pass = " | ||
+ | fail = " | ||
+ | softfail = " | ||
+ | neutral = " | ||
+ | temperror = " | ||
+ | none = " | ||
+ | permerror = " | ||
+ | } | ||
+ | dkim_symbols { | ||
+ | pass = " | ||
+ | fail = " | ||
+ | temperror = " | ||
+ | none = " | ||
+ | permerror = " | ||
+ | } | ||
+ | dmarc_symbols { | ||
+ | pass = " | ||
+ | permerror = " | ||
+ | temperror = " | ||
+ | none = " | ||
+ | reject = " | ||
+ | softfail = " | ||
+ | quarantine = " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | # Extensions that are treated as ' | ||
+ | # Number is score multiply factor | ||
+ | bad_extensions = { | ||
+ | scr = 4, | ||
+ | lnk = 4, | ||
+ | exe = 1, | ||
+ | jar = 2, | ||
+ | com = 4, | ||
+ | bat = 4, | ||
+ | ace = 4, | ||
+ | arj = 4, | ||
+ | cab = 3, | ||
+ | }; | ||
+ | |||
+ | # Extensions that are particularly penalized for archives | ||
+ | bad_archive_extensions = { | ||
+ | pptx = 0.5, | ||
+ | docx = 0.5, | ||
+ | xlsx = 0.5, | ||
+ | pdf = 1.0, | ||
+ | jar = 3, | ||
+ | js = 0.5, | ||
+ | vbs = 7, | ||
+ | }; | ||
+ | |||
+ | # Used to detect another archive in archive | ||
+ | archive_extensions = { | ||
+ | zip = 1, | ||
+ | arj = 1, | ||
+ | rar = 1, | ||
+ | ace = 1, | ||
+ | 7z = 1, | ||
+ | cab = 1, | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | enabled = true; | ||
+ | timeout = 1.0; | ||
+ | symbol_bad_mx = " | ||
+ | symbol_no_mx = " | ||
+ | symbol_good_mx = " | ||
+ | expire = 86400; | ||
+ | expire_novalid = 7200; | ||
+ | greylist_invalid = false; | ||
+ | key_prefix = " | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | map_watch_interval = 1min; | ||
+ | dns { | ||
+ | enable_dnssec = true; | ||
+ | timeout = 4s; | ||
+ | retransmits = 5; | ||
+ | nameserver = " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | rates { | ||
+ | # Limit for all mail per recipient (rate 2 per minute) | ||
+ | to = "2 / 1m"; | ||
+ | # Limit for all mail per one source ip (rate 3 per minute) | ||
+ | to_ip = "3 / 1m"; | ||
+ | # Limit for all mail per one source ip and from address (rate 2 per minute) | ||
+ | to_ip_from = "2 / 1m"; | ||
+ | # Limit for all bounce mail (rate 2 per hour) | ||
+ | bounce_to = "2 / 1h"; | ||
+ | # Limit for bounce mail per one source ip (rate 1 per hour) | ||
+ | bounce_to_ip = "1 / 1h"; | ||
+ | # Limit for all mail per authenticated user (rate 2 per minute) | ||
+ | user = "2 / 1m"; | ||
+ | } | ||
+ | |||
+ | whitelisted_rcpts = " | ||
+ | max_rcpt = 5; | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | servers = " | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | classifier " | ||
+ | tokenizer { | ||
+ | name = " | ||
+ | } | ||
+ | |||
+ | backend = " | ||
+ | servers = " | ||
+ | min_tokens = 11; | ||
+ | min_learns = 10; | ||
+ | autolearn = true; | ||
+ | |||
+ | per_user = << | ||
+ | return function(task) | ||
+ | local rcpt = task: | ||
+ | |||
+ | if rcpt then | ||
+ | one_rcpt = rcpt[1] | ||
+ | if one_rcpt[' | ||
+ | return one_rcpt[' | ||
+ | end | ||
+ | end | ||
+ | |||
+ | return nil | ||
+ | end | ||
+ | EOD | ||
+ | |||
+ | statfile { | ||
+ | symbol = " | ||
+ | spam = false; | ||
+ | } | ||
+ | statfile { | ||
+ | symbol = " | ||
+ | spam = true; | ||
+ | } | ||
+ | learn_condition =<< | ||
+ | return function(task, | ||
+ | local prob = task: | ||
+ | |||
+ | if prob then | ||
+ | local in_class = false | ||
+ | local cl | ||
+ | if is_spam then | ||
+ | cl = ' | ||
+ | in_class = prob >= 0.95 | ||
+ | else | ||
+ | cl = ' | ||
+ | in_class = prob <= 0.05 | ||
+ | end | ||
+ | |||
+ | if in_class then | ||
+ | return false, | ||
+ | cl, math.abs((prob - 0.5) * 200.0)) | ||
+ | end | ||
+ | end | ||
+ | |||
+ | return true | ||
+ | end | ||
+ | EOD | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==> / | ||
+ | < | ||
+ | password = " | ||
+ | enable_password = " | ||
+ | </ | ||
+ | q1 et q2 sont les mots de passe à modifier. | ||
+ | |||
+ | ==== 6.2. Commandes utiles ==== | ||
+ | Changer les mots de passe q1 et q2: | ||
+ | < | ||
+ | rspamadm pw | ||
+ | </ | ||
+ | |||
+ | Générer une clef privée qui doit être absolument être lisible par l' | ||
+ | < | ||
+ | rspamadm dkim_keygen -s ' | ||
</ | </ | ||
+ | avec l' |
mail.1509817236.txt.gz · Dernière modification : 2017/11/04 17:40 de mirtouf