Narzędzia użytkownika

Narzędzia witryny


poczta

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Poprzednia rewizja po obu stronachPoprzednia wersja
Nowa wersja
Poprzednia wersja
poczta [2021/01/20 13:54] – [Postfix] kamilpoczta [2023/12/18 12:53] (aktualna) – [Przydatne narzędzia] kamil
Linia 8: Linia 8:
  
 Instalujemy czystego Debiana 10 (Serwer SSH i Podstawowe narzędzia systemowe). Instalujemy czystego Debiana 10 (Serwer SSH i Podstawowe narzędzia systemowe).
 +
 +Jeśli system postawiliśmy na maszynie wirtualnej to proszę dodać taki oto wpis do pliku /etc/sysctl.conf:
 +<file>
 +net.ipv4.tcp_window_scaling = 0
 +</file>
 +
 +Oraz przeładować ustawienia kernela:
 +<file>
 +sysctl -p
 +</file>
  
 Uaktualnienie systemu: Uaktualnienie systemu:
Linia 50: Linia 60:
 Podczas instalacji zostaniemy zapytani w sprawie konfiguracji Posfixa - wybieramy: brak konfiguracji. Podczas instalacji zostaniemy zapytani w sprawie konfiguracji Posfixa - wybieramy: brak konfiguracji.
 <file> <file>
-apt install postfix postfix-mysql postgrey dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved mariadb-server mariadb-client+apt install postfix postfix-mysql postfix-pcre postgrey dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved mariadb-server mariadb-client
 </file> </file>
  
Linia 163: Linia 173:
   quota int(11) NOT NULL DEFAULT '1024' COMMENT 'Quota in megabytes',   quota int(11) NOT NULL DEFAULT '1024' COMMENT 'Quota in megabytes',
   active tinyint(1) NOT NULL DEFAULT '1',   active tinyint(1) NOT NULL DEFAULT '1',
 +  PRIMARY KEY (id)
 +);
 +
 +CREATE TABLE virtual_black_white_list (
 +  id int(11) NOT NULL AUTO_INCREMENT,
 +  source varchar(32) NOT NULL UNIQUE COMMENT 'Domain or IP address',
 +  access enum('OK','REJECT') NOT NULL COMMENT 'OK or REJECT',
 +  reason varchar(128) NOT NULL DEFAULT '',
 +  `type` enum('IP','EMAIL') NOT NULL,
   PRIMARY KEY (id)   PRIMARY KEY (id)
 ); );
Linia 206: Linia 225:
 mysql -e "UPDATE virtual_users SET password = ENCRYPT('nowehaslo' WHERE email = 'user@domain.ltd';" postfix mysql -e "UPDATE virtual_users SET password = ENCRYPT('nowehaslo' WHERE email = 'user@domain.ltd';" postfix
 </file> </file>
 +
 +Dodanie do białej listy domeny:
 +<file>
 +INSERT INTO virtual_black_white_list (source, access, type) VALUES ('wp.pl', 'OK', 'EMAIL');
 +</file>
 +
 +Dodanie do czarnej listy domeny:
 +<file>
 +INSERT INTO virtual_black_white_list (source, access, reason, type) VALUES ('spamers.ltd', 'REJECT', 'Your domain is in black list.', 'EMAIL');
 +</file>
 +
 +Dodanie adresu IP do białej listy:
 +<file>
 +INSERT INTO virtual_black_white_list (source, access, type) VALUES ('1.2.3.4', 'OK', 'IP');
 +</file>
 +
 +Dodanie adresu IP do czarnej listy:
 +<file>
 +INSERT INTO virtual_black_white_list (source, access, reason, type) VALUES ('2.3.4.5', 'REJECT', 'Your IP addressis in black list.', 'IP');
 +</file>
 +
 +Domeny do białej/czarnej listy możemy definiować w następujący sposób:
 +  * user@domain - adres email
 +  * domain.ltd - cała domena
 +  * .domain.tld - wszystkie subdomeny w danej domenie
 +  * user@ - użytkownik we wszystkich domenach
 +
 +Adresy IP definiujemy wg schematy CIDR. Dokumentacja: [[http://www.postfix.org/access.5.html]]
 +
 +Możemy zarządzać bazą danych aplikacją napisaną pod w/w strukturę tabel: [[https://gitlab.com/kmroczkowski/mailcp]]
  
 ==== Użytkownik skrzynek pocztowych ==== ==== Użytkownik skrzynek pocztowych ====
Linia 287: Linia 336:
 inet_interfaces = all inet_interfaces = all
 inet_protocols = all inet_protocols = all
 +
 +smtpd_sender_login_maps = mysql:/etc/postfix/mysql-virtual-sender-login-maps.cf
  
 smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12340, smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12340,
Linia 292: Linia 343:
                                 permit_mynetworks,                                 permit_mynetworks,
                                 reject_unauth_destination,                                 reject_unauth_destination,
 +                                check_client_access mysql:/etc/postfix/mysql-virtual-access-ip.cf,
 +                                check_sender_access mysql:/etc/postfix/mysql-virtual-access-email.cf,
                                 reject_non_fqdn_hostname,                                 reject_non_fqdn_hostname,
                                 reject_non_fqdn_sender,                                 reject_non_fqdn_sender,
Linia 321: Linia 374:
         permit_sasl_authenticated,         permit_sasl_authenticated,
         defer_unauth_destination         defer_unauth_destination
 +
 +mime_header_checks = pcre:/etc/postfix/mime_header_checks.pcre
  
 # Even more Restrictions and MTA params # Even more Restrictions and MTA params
Linia 362: Linia 417:
 virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf, virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,
         mysql:/etc/postfix/mysql-virtual-email2email.cf         mysql:/etc/postfix/mysql-virtual-email2email.cf
 +
 +maximal_queue_lifetime = 1d
 +bounce_queue_lifetime = 1d
 +</file>
 +
 +Tworzymy plik /etc/postfix/mime_header_checks.pcre i uzupełniamy:
 +<file>
 +/^Content-(Disposition|Type).*name\s*\*?=\s*"?([^;]*(\.|=2E)(
 +        app|bat|chm|cmd|com|cpl|diagcab|dll|exe|fxp|gadget|grp|
 +        hlp|hpj|hta|htc|inf|ins|img|iso|isp|its|jar|jnlp|js|jse|
 +        ksh|lnk|mad|maf|mag|mam|maq|mar|mas|mat|mau|mav|maw|mcf|
 +        mda|mdw|mdz|msc|msh|msh1|msh2|mshxml|msh1xml|msh2xml|msi|
 +        msp|mst|msu|ops|osd|pcd|pif|plg|prf|prg|printerexport|
 +        ps1|ps1xml|ps2|ps2xml|psc1|psc2|psd1|psdm1|py|pyc|pyo|
 +        pyw|pyz|pyzw|reg|scf|scr|sct|shb|shs|theme|tmp|url|vb|
 +        vbe|vbp|vbs|vhd|vhdx|vsmacros|vsw|webpnp|website|ws|wsc|
 +        wsf|wsh|xbap|xll|xnk))(\?=)?"?\s*(;|$)/x
 +        REJECT Attachment of type $2 not accepted
 </file> </file>
  
Linia 398: Linia 471:
 dbname = postfix dbname = postfix
 query = SELECT email FROM virtual_users WHERE email='%s' query = SELECT email FROM virtual_users WHERE email='%s'
 +</file>
 +
 +Tworzymy plik /etc/postfix/mysql-virtual-access-ip.cf i uzupełniamy:
 +<file>
 +user = postfix
 +password = tajnehaslo
 +hosts = 127.0.0.1
 +dbname = postfix
 +query = SELECT CONCAT(access, IF(reason != '', CONCAT(' ', reason), '')) AS address FROM virtual_black_white_list WHERE source='%s' AND type = 'IP'
 +</file>
 +
 +Tworzymy plik /etc/postfix/mysql-virtual-access-email.cf i uzupełniamy:
 +<file>
 +user = postfix
 +password = tajnehaslo
 +hosts = 127.0.0.1
 +dbname = postfix
 +query = SELECT CONCAT(access, IF(reason != '', CONCAT(' ', reason), '')) AS address FROM virtual_black_white_list WHERE source='%s' AND type = 'EMAIL'
 +</file>
 +
 +Tworzymy plik /etc/postfix/mysql-virtual-sender-login-maps.cf i uzupełniamy:
 +<file>
 +user = postfix
 +password = tajnehaslo
 +hosts = 127.0.0.1
 +dbname = postfix
 +query = SELECT email FROM virtual_users WHERE email = '%s' UNION SELECT destination FROM virtual_aliases WHERE source = '%s'
 </file> </file>
  
Linia 776: Linia 876:
 <file> <file>
 plugin { plugin {
 +  sieve_extensions = +vacation-seconds
 +  sieve_vacation_min_period = 5m
 +  sieve_vacation_default_period = 10m
 +  sieve_vacation_max_period = 15m
 +
   sieve = /var/mail/vhosts/%d/%n/dovecot.sieve   sieve = /var/mail/vhosts/%d/%n/dovecot.sieve
   sieve_default = /var/lib/dovecot/sieve/default.sieve   sieve_default = /var/lib/dovecot/sieve/default.sieve
Linia 870: Linia 975:
 ... ...
 $config['smtp_server'] = 'domain.ltd'; $config['smtp_server'] = 'domain.ltd';
 +$config['smtp_port'] = 25;
 +$config['smtp_user'] = '%u';
 +$config['smtp_pass'] = '%p';
 +$config['smtp_auth_type'] = 'LOGIN';
 ... ...
 $config['plugins'] = array('managesieve'); $config['plugins'] = array('managesieve');
Linia 967: Linia 1076:
   * IMAP: 993 (SSL/TLS)   * IMAP: 993 (SSL/TLS)
  
 +==== Fail2Ban ====
 +
 +Instalujemy:
 +<file>
 +apt install fail2ban
 +</file>
 +
 +W pliku /etc/fail2ban/jail.conf ustawiamy:
 +<file>
 +...
 +ignoreip = 127.0.0.1/8 ::1
 +...
 +bantime  = 60m
 +...
 +findtime  = 60m
 +...
 +[roundcube-auth]
 +port     = http,https
 +logpath  = %(roundcube_errors_log)s
 +enabled = true
 +...
 +[postfix-sasl]
 +enabled = true
 +filter   = postfix[mode=auth]
 +port     = smtp,465,submission,imap,imaps,pop3,pop3s
 +# You might consider monitoring /var/log/mail.warn instead if you are
 +# running postfix since it would provide the same log lines at the
 +# "warn" level but overall at the smaller filesize.
 +logpath  = %(postfix_log)s
 +backend  = %(postfix_backend)s
 +...
 +</file>
 +
 +Restart:
 +<file>
 +/etc/init.d/fail2ban restart
 +</file>
 +
 +Status fail2bana sprawdzamy poleceniem:
 +<file>
 +root@mars:/var/log# fail2ban-client status
 +Status
 +|- Number of jail:      3
 +`- Jail list:   postfix-sasl, roundcube-auth, sshd
 +root@mars:/var/log# fail2ban-client status postfix-sasl
 +Status for the jail: postfix-sasl
 +|- Filter
 +|  |- Currently failed: 0
 +|  |- Total failed:     0
 +|  `- File list:        /var/log/mail.log
 +`- Actions
 +   |- Currently banned: 0
 +   |- Total banned:     0
 +   `- Banned IP list:
 +
 +</file>
 +
 +==== Munin ====
 +
 +Monitoring zasobów serwera.
 +
 +Instalacja:
 +<file>
 +apt install munin munin-node munin-plugins-extra
 +</file>
 +
 +Konfigurujemy plik /etc/munin/apache24.conf:
 +<file>
 +ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
 +Alias /munin/static/ /var/cache/munin/www/static/
 +
 +<Directory /var/cache/munin/www>
 +    #Require local
 +    Require ip nasz_adres_ip
 +    Options FollowSymLinks SymLinksIfOwnerMatch
 +    Options None
 +</Directory>
 +
 +<Directory /usr/lib/munin/cgi>
 +    #Require local
 +    Require ip nasz_adres_ip
 +    Options FollowSymLinks SymLinksIfOwnerMatch
 +    <IfModule mod_fcgid.c>
 +        SetHandler fcgid-script
 +    </IfModule>
 +    <IfModule !mod_fcgid.c>
 +        SetHandler cgi-script
 +    </IfModule>
 +</Directory>
 +
 +Alias /munin /var/cache/munin/www
 +</file>
 +
 +Reload konfiguracji Apache:
 +<file>
 +systemctl apache2 reload
 +</file>
 +
 +Munin będzie dostępny pod: http://domain.ltd/munin
 +
 +==== Przydatne narzędzia ====
 +
 +  * postqueue
 +<file>
 +# postqueue -p
 +-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
 +56008207DE   195074 Mon Mar 22 09:28:19  user@domain.ltd
 +                   (connect to falsedomain.ltd[1.2.3.4]:25: Connection refused)
 +                                         user44@falsedomain.ltd
 +
 +-- 190 Kbytes in 1 Request.
 +</file>
 +
 +  * postsuper
 +<file>
 +# postsuper -d 56008207DE
 +postsuper: 56008207DE: removed
 +postsuper: Deleted: 1 message
 +</file>
 +
 +  * postmap
 +<file>
 +# postmap -q 'name="fil.cmd"' regexp:/etc/postfix/mime_header_checks
 +REJECT
 +# postmap -q 'Content-Type: name="test.img"; charset=us-ascii' pcre:/root/mime.pcre
 +REJECT Attachment of type test.img not accepted
 +</file>
 +
 +  * rblcheck
 +<file>
 +rblcheck -s dnsbl.sorbs.net adresiplubdomena
 +</file>
 +
 +  * przenoszenie skrzynek pocztowych via IMAP: [[https://github.com/imapsync/imapsync]]
 +  * sprawdzanie czy nasza domena oraz adres IP jest na czarnych listach: [[https://mxtoolbox.com]] [[https://www.spamhaus.org/lookup/]] [[https://www.dnswatch.info]]
 +  * tester naszego serwera: [[https://www.mail-tester.com]]
 +  * sprawdzanie DNSów naszej domeny: [[https://intodns.com]]
 +  * Dodanie naszej domeny do zaufanych w Google: [[https://postmaster.google.com/]]
 +  * Dodanie naszej domeny do zaufanych w Microsoft: [[https://sendersupport.olc.protection.outlook.com/pm/]]
 +  * Sprawdzenie domeny oraz maili: [[https://bezpiecznapoczta.cert.pl]]
  
poczta.1611147259.txt.gz · ostatnio zmienione: 2021/01/20 13:54 przez kamil