SSL сертификат для Dovecot

Генерируем

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem

Установка SSL сертификата сводится к нескольким шагам:

1. Поместите файл сертификата в директорию /etc/ssl/certs/, а файл ключа в /etc/ssl/private
2. Укажите в файле настроек ssl для dovecot эти параметры. Обычно файл располагается в /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
# Владелец и группа файла root:root, права доступа 0444
ssl_cert = </etc/ssl/certs/dovecot.pem
# Владелец и группа файла root:root, права доступа - 0400
ssl_key = </etc/ssl/private/dovecot.pem

Обратите внимание на то, что Dovecot не следует давать права доступа на запись

Так же можно указать  сертификат и ключ, которые находятся в одном файле

Владелец и группа файла root:root, права доступа – 0400

ssl_cert = </etc/ssl/dovecot.pem
ssl_key = </etc/ssl/dovecot.pem

Если ssl-сертификат использует пароль, то пригодится параметр

ssl_key_password = secret

указывающий пароль.  Иначе Dovecot будет запрашивать пароль при каждом своем запуске.

Проверяем и перезапускаем

# doveconf -n
# service dovecot restart
image_pdfimage_print

SSL сертификат для Postfix

Create a root private key:

# openssl genrsa -out rootCA.key 2048

Change permissions of this private key to 400:

# chmod 400 /usr/share/ssl/certs/postfix/rootCA.key

Create self-singed root certificate:

# openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem

With the following data (change information to required):

Country Name (2 letter code) [AU]:XX
State or Province Name (full name) [Some-State]:SomeState
Locality Name (eg, city) []:SomeCity
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company Co
Organizational Unit Name (eg, section) []:Company Co
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:admin@example.com

Create private key for final certificate:

# openssl genrsa -out device.key 2048

Create certificate sign request:

# openssl req -new -key device.key -out device.csr

And finally create server certificate based on root CA certificate and root private key:

# openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 500

Change Postfix configuration /etc/postfix/main.cf to use the newly created certificates:

#smtpd_tls_key_file = /etc/postfix/postfix_default.pem
#smtpd_tls_cert_file = /etc/postfix/postfix_default.pem
#smtpd_tls_CAfile = /etc/postfix/postfix_default.pem
smtpd_tls_key_file = /usr/share/ssl/certs/postfix/device.key
smtpd_tls_cert_file = /usr/share/ssl/certs/postfix/device.crt
smtpd_tls_CAfile = /usr/share/ssl/certs/postfix/rootCA.pem

Restart postfix service:

[root@centos ~]# service postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]

All newly generated files should be created in folder /usr/share/ssl/certs/postfix/ (you could change folder, but paths in Postfix configuration have to be changed too).

After these steps, Postfix will work with the new certificates:

[root@centos ~]# openssl s_client -crlf -connect localhost:465
CONNECTED(00000003)
depth=0 C = US, ST = SomeState, L = SomeCity, O = Company Co, OU = Company Co, CN = example.com, emailAddress = admin@example.com
verify error:num=18:self signed certificate
verify return:1
depth=0 C = US, ST = SomeState, L = SomeCity, O = Company Co, OU = Company Co, CN = example.com, emailAddress = admin@example.com
verify return:1
---
Certificate chain
 0 s:/C=PK/ST=SomeState/L=SomeCity/O=Company Co/OU=Company Co/CN=example.com/emailAddress=admin@example.com
   i:/C=PK/ST=SomeState/L=SomeCity/O=Company Co/OU=Company Co/CN=example.com/emailAddress=admin@example.com
---

https://support.plesk.com/hc/en-us/articles/213402809-How-to-generate-custom-self-signed-SSL-certificates-and-apply-it-to-Postfix

image_pdfimage_print

SSL/TLS тесты

How to check your secure connection

In order to check your mail server connectivity over SSL/TLS, the online checkers listed below can be used.

You need to specify the server hostname and port number or an existing email account and run the test.

SSL-Tools: https://ssl-tools.net/mailservers

CheckTLS: https://www.checktls.com/index.html

MXToolbox: https://mxtoolbox.com/diagnostic.aspx

High-Tech Bridge: https://www.htbridge.com/ssl

image_pdfimage_print

Apache24 + SSL и redirect http to https

1. Создание сертификата

Создаем папку для сертификатов и переходим в нее:

pwd
/usr/local/etc/apache24
mkdir ssl ; cd ssl

генерируем сертификат:

openssl req -new -x509 -days 1461 -nodes -out cert.pem -keyout cert.key

* в данном примере созданы открытый и закрытый ключи на 4 года (1461 день).

2. Установка модуля SSL для Apache

# apachectl -M | grep ssl
 ssl_module (shared)

Если видим строчку, на подобие:

ssl_module (shared)

Спускаемся к шагу 3 данной инструкции.

Иначе, устанавливаем httpd ssl_module.

ee /usr/local/etc/apache24/httpd.conf

Находим и снимаем комментарии со следующих строчек:

...
LoadModule ssl_module libexec/apache24/mod_ssl.so
...
Include etc/apache24/extra/httpd-ssl.conf
...

И ставим комментарии в следующих строках:

#<IfModule ssl_module>
#SSLRandomSeed startup builtin
#SSLRandomSeed connect builtin
#</IfModule>

Перегружаем

#apachectl restart

3. Настройка Apache

cd ..
ee extra/httpd-vhosts.conf

В открытый файл добавляем следующее:

<VirtualHost *:443>
 ServerName site.ua
 DocumentRoot /usr/local/www/apache24/data
 SSLEngine on
 SSLCertificateFile /usr/local/etc/apache24/ssl/cert.pem
 SSLCertificateKeyFile /usr/local/etc/apache24/ssl/cert.key
</VirtualHost>

Проверяем корректность настроек в Apache:

apachectl configtest
Syntax OK

Перечитываем конфигурацию apache:

apachectl graceful

4. Проверка работоспособности

Открываем браузер и переходим на наш сайт, добавив https://. При использовании нашего самоподписного сертификата, браузер выдаст предупреждение, что передача данных не безопасна. Подтверждаем наше намерение открыть сайт.

5. Настройка редиректа

Чтобы все запросы по http автоматически перенаправлялись на https, необходимо настроить перенаправление (redirect). Есть несколько способов это сделать.

  • В конфигурационном файле

Открываем файл с настройкой виртуальных доменов (как в шаге 3) и дописываем следующее:

<VirtualHost *:80>
 ServerName site.ua
 RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

* в конкретном примере, мы перенаправили все запросы для сайта site.ua.
** обратите особое внимание, что если у Вас уже есть VirtualHost *:80 для настраиваемого сайта, необходимо его закомментировать или отредактировать.

  • В файле .htaccess в корневой папке вашего сайта
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Важно: Если у вас есть существующий код в .htacess, добавьте эти строки — выше.

image_pdfimage_print

Pflogsumm – статистика Postfix

Установка

/usr/ports/mail/pflogsumm

Смотреть

 pflogsumm -d yesterday /var/log/maillog

или

 pflogsumm -d today /var/log/maillog

Вставляем в cron с пересылкой на свою почту

#crontab -e
59 23 * * * /usr/local/bin/pflogsumm /var/log/maillog | mail -s 'Statistics from Postfix f11.uni.ka' postmaster@uni.ka

Скрипт для сброса статистики в файл:

mkdir /var/log/postfix
cat /usr/local/etc/postfix/poststat.sh
#!/bin/sh
/usr/local/bin/pflogsumm -e /var/log/maillog > /var/log/postfix/`date +%Y-%m-%d`-stat_postfix.txt

chown 0755 poststat.sh
crontab -e
59 23 * * * /usr/local/etc/postfix/poststat.sh > /dev/null

 

 

 

 

image_pdfimage_print

smtp-source – проверка сервера

smtp-source – утилита генерирующая smtp трафик. Например, отослать 10 сообщений

# smtp-source -m 10 -f senders@example.com -t recipient@example.com localhost:25

Следующий тест

time /usr/sbin/smtp-source -s 20 -l 5120 -m 100 -c -f test@example.com -t mike@example.com localhost:25 100 
real 0m2.664s user 0m0.020s sys 0m0.100s

This example shows 20 parallel sessions (-s 20), 5KB sized messages (-l 5120), 100 messages ent (-m 100), counter display (-c), envelope sender and receiver (-f test@example.com -t mike@example.com) and connection on port 25 of the localhost (localhost:25). The “100” indicates the total messages sent. The real time (0m2.664s ) is the time the injection took,. Here is an additional test on the same server that indicates an increase to 40 sessions, 10 KB mail size and 500 messages. This gives you a way to evaluate the additional load on the server in terms of a comparison time. ( У меня с “100” не работало).

 

image_pdfimage_print

Postfix + STARTTLS

1. Генерируем сертификаты

 

Добавляем секции отвечающие за TLS

ee /usr/local/etc/postfix/main.cf
# TLS
 smtpd_use_tls = yes
 smtpd_tls_security_level = may
 smtpd_tls_auth_only = yes
 smtpd_tls_key_file = /usr/local/etc/postfix/device.key
 smtpd_tls_cert_file = /usr/local/etc/postfix/device.crt
 smtpd_tls_CAfile = /usr/local/etc/postfix/rootCA.pem
 smtpd_tls_loglevel = 1
 smtpd_tls_received_header = yes
 smtpd_tls_session_cache_timeout = 3600s
 tls_random_source = dev:/dev/urandom

# Aутентификация SMTP
 smtpd_sasl_auth_enable = yes
 smtpd_sasl_exceptions_networks = $mynetworks
 smtpd_sasl_security_options = noanonymous
 broken_sasl_auth_clients = yes
 smtpd_sasl_type = dovecot
 smtpd_sasl_path = private/auth

Далее, основываясь на рекомендациях mozilla, делаем так – в секции TLS дописываем
main.cf:

smtp_tls_mandatory_ciphers = high
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3

tls_high_cipherlist = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3

так мы еще оставляем самые надежные, на сегодня, алгоритмы.

Далее, раскоментируем в /usr/local/etc/postfix/master.cf секцию с sabmission

## Open 587 port for STARTTLS
submission inet n - n - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  # -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  # -o smtpd_client_restrictions=$mua_client_restrictions
  # -o smtpd_helo_restrictions=$mua_helo_restrictions
  # -o smtpd_sender_restrictions=$mua_sender_restrictions
  # -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
## Open 465 port for SSL/TLS
smtps inet n - n - - smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

Для Dovecot дописываем в dovecot.conf

# SSL (если нет то ="NO")
disable_plaintext_auth = yes
ssl = yes
ssl_cert = </usr/local/etc/postfix/device.crt
ssl_key = </usr/local/etc/postfix/device.key
## Disable SSLV3 - Poodle
ssl_protocols = !SSLv2 !SSLv3
##

В итоге при просмотре исходника письма в GMAIL заголовок такой:

Received: from smtp.279.ru (smtp.279.ru. [77.220.185.16])
by mx.google.com with ESMTP id o79si14839747lfi.52.2016.02.15.04.15.43
for <deryabinsergey@gmail.com>;
Mon, 15 Feb 2016 04:15:43 -0800 (PST)

становится вот таким:

Received: from smtp.279.ru (smtp.279.ru. [77.220.185.16])
by mx.google.com with ESMTPS id d124si14810044lfg.170.2016.02.15.04.20.45
for <deryabinsergey@gmail.com>
(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Mon, 15 Feb 2016 04:20:45 -0800 (PST)

И появляется замочек в секции безопасность

image_pdfimage_print

Amavisd-new

Устанавливаем (добавить поддержку MySQL)

cd /usr/ports/security/amavisd-new
make config
make install clean
cd /usr/local/etc
cp amavisd.conf amavisd.conf_orig

Редактируем ee amavisd.conf

$mydomain = 'example.com';
$MYHOME = '/var/amavis';

Остальное оставил по дефолту.

Для Clamav убираем комменты у абзацев

@av_scanners = (
 ['ClamAV-clamd',
 \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
 qr/\bOK$/m, qr/\bFOUND$/m,
 qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
 );

@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 ],
 );

Добавляем в группу clamav пользователя vscan и наоборот

pw groupmod clamav -m vscan
pw groupmod vscan -m clamav

Делаем запись

echo 'amavisd_enable="YES"' >> /etc/rc.conf

и запускаем

service amavisd start

Можно вывести лог amavis-a в отдельный файл

ee /etc/syslog.conf
local6.* /var/log/amavisd-new.log
ee /usr/local/etc/amavisd.conf
$syslog_facility = 'local6';   # Syslog facility as a string

Перезапускаем и проверяем, если есть ошибки вида

Sep 25 11:50:22 tmail amavis[56730]: (!!)TROUBLE in child_init_hook: 
BDB can't connect db env. at /var/amavis/db: BDB0087 DB_RUNRECOVERY: Fatal error, 
run database recovery, No such file or directory. at (eval 93) line 338.

то меняем в amavisd.conf

$enable_db = 0;              # enable use of BerkeleyDB/libdb (SNMP and nanny)

Для связи Clamav-Spamassassin-Postfix-Amavis добавляем после определения алиасов

ee /usr/local/etc/postfix/main.cf
# Amavisd-new
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings

и в файле master.cf дописываем вверху строку с контент фильтром

smtp inet n - n - - smtpd
 -o content_filter=smtp-amavis:[127.0.0.1]:10024

и в самый низ (после транспорта Довекота)

#with virus-scanner amavis
smtp-amavis unix - - - - 2 smtp
 -o smtp_data_done_timeout=1200
 -o smtp_send_xforward_command=yes
 -o disable_dns_lookups=yes
 -o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
 -o content_filter=
 -o local_recipient_maps=
 -o relay_recipient_maps=
 -o smtpd_restriction_classes=
 -o smtpd_delay_reject=no
 -o smtpd_client_restrictions=permit_mynetworks,reject
 -o smtpd_helo_restrictions=
 -o smtpd_sender_restrictions=
 -o smtpd_recipient_restrictions=permit_mynetworks,reject
 -o mynetworks_style=host
 -o mynetworks=127.0.0.0/8
 -o strict_rfc821_envelopes=yes
 -o smtpd_error_sleep_time=0
 -o smtpd_soft_error_limit=1001
 -o smtpd_hard_error_limit=1000
 -o smtpd_client_connection_count_limit=0
 -o smtpd_client_connection_rate_limit=0
 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Если в процессе отладки возникнет необходимость полностью отключить функции защиты от СПАМа, добавьте строку

@bypass_spam_checks_maps = (1);

для полного отключения защиты от вирусов предназначена строка

@bypass_virus_checks_maps = (1);

Параметры

$sa_tag_level_deflt  - (оценка, при которой к заголовкам добавляются соответствующие X-Spam-тэги), 
$sa_tag2_level_deflt - (оценка, при которой сообщения помечаются как СПАМ), $sa_kill_level_deflt - (оценка, при которой с сообщениями выполняется предопределенные действия, в нашем случае уничтожение)

имеют достаточно гуманные значения, которые вполне меня устраивают. Чем сильнее Вы уменьшите эти числа, тем лучше будет фиксироваться СПАМ, но одновременно возрастет вероятность потери валидных сообщений. Лучше всего определить эти значения экспериментальным путем.

Example:

#Если Спам - переслать в ящик
$sa_spam_subject_tag = '***Spam*** ';
#$spam_quarantine_to = 'spam@uni.ka';
$final_spam_destiny = D_PASS; # D_PASS / D_DISCARD / D_REJECT
$final_virus_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_banned_destiny = D_BOUNCE; # (defaults to D_BOUNCE)
$final_bad_header_destiny = D_PASS;

В этом примере, при очках более 10 письмо помечается как спам (дописывается в тему ***Spam*** ) и доставляется пользователю.

Если сделать

$final_spam_destiny = D_DISCARD

то письмо пользователю не доставляется, а сохраняется в директории /var/amavis/ под именем spam***.gz (там же хранятся и virus и bounce)

и если

D_REJECT

то письмо отбрасывается.

Если раскоментировать

#$spam_quarantine_to = 'spam@uni.ka';

то письмо перешлется на ящик spam@uni.ka.

Т.е. если нужно, что бы письма, помеченные как спам, пользователю не доставлялись, а пересылались на спам ящик, то:

### Если Спам - перслать в ящик
$sa_spam_subject_tag = '***Spam*** ';
$spam_quarantine_to = 'spam@uni.ka';
$final_spam_destiny = D_DISCARD
$final_virus_destiny = D_DISCARD; # (defaults to D_BOUNCE)
$final_banned_destiny = D_BOUNCE; # (defaults to D_BOUNCE)
$final_bad_header_destiny = D_PASS;
D_REJECT - отклонять письма с сообщением вида

The mail system
<acc@uni.ka>: host 127.0.0.1[127.0.0.1] said: 554 5.7.0 Reject, id=38216-01 -
    spam (in reply to end of DATA command)

Команда amavisd-release осуществляет доставку попавшего в карантин письма его получателю

# cd /var/virusmails
# amavisd-release spam-yVhEw7tY3+tr.gz
250 2.0.0 Ok, id=rel-yVhEw7tY3+tr, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 93F4561C1C

Черные и белые списки

1. вариант – мягкий блэклист
в секции добавляем нужный адрес/домен и балы (позитив – черный, негатив – белый), например:

    'clusternews@linuxnetworx.com' => -3.0,
   # soft-blacklisting (positive score)
    'sender@example.net' => 3.0,
    'spam@com' => 10.0,
   },
  ], # end of site-wide tables
});

2. вариант – черные и белые списки

   },
  ], # end of site-wide tables
});
### BEGIN White and black lists!!!
read_hash(\%whitelist_sender, '/var/amavis/whitelist');
read_hash(\%blacklist_sender, '/var/amavis/blacklist');
#read_hash(\%spam_lovers, '/var/amavis/spam_lovers');
### END
# cat /var/amavis/blacklist
 126.com
 marketing@sw.solarwinds.com
 info@twitter.com
# cat /var/amavis/whitelist
 root@domen.com
 mail.domen.com
 domen.com
 root@mail.domen.com

Эти варианты можно комбинировать.

3. вариант (еще не пробовал)

1) I created the file /etc/amavisd/whitelist
where I inserted the addresses of the senders that I wanted to whitelist, one per line.
it works also for whole domains (but without the @)

Example:

user1@example.com
 user2@example.org
 example.net
 example.eu

2) in /etc/amavisd/amavisd.conf I decommented AND modified the following section:

# This policy will perform virus checks only.
 read_hash(\%whitelist_sender, '/etc/amavisd/whitelist');
 @whitelist_sender_maps = (\%whitelist_sender);

$interface_policy{'10026'} = 'VIRUSONLY';
 $policy_bank{'VIRUSONLY'} = { # mail from the pickup daemon
 bypass_spam_checks_maps => ['@whitelist_sender_maps'], # don't spam-check this mail
 bypass_banned_checks_maps => ['@whitelist_sender_maps'], # don't banned-check this mail
 bypass_header_checks_maps => ['@whitelist_sender_maps'], # don't header-check this mail
 };

 

image_pdfimage_print

Clamav

Установка и настройка ClamAV

cd /usr/ports/security/clamav
make install clean
ee /etc/rc.conf
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
cp /usr/local/etc/clamd.conf /usr/local/etc/clamd.conf_orig
cp /usr/local/etc/freshclam.conf /usr/local/etc/freshclam.conf_orig

Конфиги /usr/local/etc/clamd.conf, /usr/local/etc/freshclam.conf
Оставил без изменений

/usr/local/etc/rc.d/clamav-freshclam start
tail -f /var/log/clamav/freshclam.log
/usr/local/etc/rc.d/clamav-clamd start
tail –а /var/log/clamav/clamd.log

Отправляем себе письмо с таким содержанием

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

и смотрим в логах

tail -f /var/log/clamav/clamd.log

SelfCheck: Database status OK.
/var/amavis/tmp/amavis-20170925T121821-00814-mmOCCn2U/parts/p002: Eicar-Test-Signature FOUND
/var/amavis/tmp/amavis-20170925T121821-00814-mmOCCn2U/parts/p001: Eicar-Test-Signature FOUND

Все работает.

image_pdfimage_print