Nginx, MySQL, PHP (LEMP) в Ubuntu

NGINX

$ sudo apt-get update
$ sudo apt-get install nginx

Проверяем:

http://192.168.0.1

Должны увидеть:

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and 
working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.

MySQL

apt install mysql-server

После установки выполняем

mysql_secure_installation

плагин VALIDATE PASSWORD PLUGIN можно не включать, а на все вопросы ответить Y – при этом удалятся тестовые базы и пользователи, удаленный вход для рута.

PHP-FPM

apt install php-fpm php-mysql

После установки компонентов PHP настроим их для повышения безопасности нашего веб-сервера.

Откроем конфигурационный файл php-fpm с привилегиями root:

sudo nano /etc/php/7.0/fpm/php.ini

Найдём в этом файле параметр cgi.fix_pathinfo. Он будет закомментирован точкой с запятой (;) и будет иметь значение “1” по умолчанию.

Эти настройки по умолчанию очень небезопасны, потому что благодаря им PHP попытается исполнить ближайший файл, который сможет найти в случае, когда запрашиваемый PHP файл не может быть найден. Это позволит пользователям сформировать PHP запросы таким образом, чтобы запускать скрипты, к которым у них не должно быть доступа.

Мы можем предотвратить такое поведение раскомментировав эту строку и изменив её значение на “0“.

Перезапускаем

systemctl restart php7.1-fpm

Настройка Nginx для работы с PHP-FPM

Настроим Nginx для использования нашего обработчика PHP для отображения динамического контента.

Мы сделаем это на уровне серверных блоков (серверные блоки являются приблизительным аналогом виртуальных хостов в Apache). Откроем серверный блок Nginx сервера по умолчанию:

sudo nano /etc/nginx/sites-available/default

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;

        server_name 192.168.0.1;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
               include snippets/fastcgi-php.conf;
               fastcgi_pass unix:/run/php/php7.0-fpm.sock;
               }

        location ~ /\.ht {
              deny all;
               }
}

Проверьте ваш файл конфигурации на наличие ошибок командой:

sudo nginx -t

и перезапускаем

sudo systemctl reload nginx

ПРОВЕРКА

Создадим файлик

sudo nano /var/www/html/info.php

<?php
     phpinfo();
?>

И проверяем набрав в браузере:

http://домен_или_IP_адрес_сервера/info.php

 

 

image_pdfimage_print

Dovecot + quotes (с отправкой уведомлений)

 

Включение оповещений при превышении квоты

ee /usr/local/etc/dovecot/conf.d/90-quota.conf
plugin {
 quota = maildir:User quota
 quota_rule = *:storage=500M
 quota_rule2 = Trash:storage=+100M
 quota_rule3 = Junk:ignore
 quota_grace = 10%%

 # Quota plugin can also limit the maximum accepted mail size.
 #quota_max_mail_size = 100M
}

# Описываем SQL словарь
dict {
 sqlquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}

plugin {
 quota_warning = storage=95%% quota-warning 95 %u
 quota_warning2 = storage=80%% quota-warning 80 %u
 quota_warning3 = storage=70%% quota-warning 70 %u
 quota_warning4 = storage=60%% quota-warning 60 %u
 quota_warning5 = storage=50%% quota-warning 50 %u
}
service quota-warning {
 executable = script /usr/local/bin/quota-warning.sh
 unix_listener quota-warning {
    user = nobody
    group = nobody
    mode = 0666
    }
 #user = dovecot
}

############# Проверяю ###########
service quota-warning {
  executable = script /etc/dovecot/quota-warning.sh
  unix_listener quota-warning {
        user = vmail
        group = mail
        mode = 0660
        }
}

service quota-exceeded {
  executable = script /etc/dovecot/quota-exceeded.sh
  unix_listener quota-exceeded {
        user = vmail
        group = mail
        mode = 0660
        }
}

plugin {
    quota = dict:User quota::proxy::quota
    quota_warning = storage=100%% quota-exceeded 100 %u
    quota_warning2 = storage=90%% quota-warning 90 %u
    quota_warning3 = storage=80%% quota-warning 50 %u
 }
 
service quota-warning {
  executable = script /etc/dovecot/quota-warning.sh
  unix_listener quota-warning {
       user = vmail
       group = mail
       mode = 0660
       }
}
 
service quota-exceeded {
   executable = script /etc/dovecot/quota-exceeded.sh
   unix_listener quota-exceeded {
       user = vmail
       group = mail
       mode = 0660
       }
}

####################

Скрипт:

cat /usr/local/bin/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@uni.ka
Subject: quota warning
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
To: $USER

Внимание!
Ваш ящик заполнен на $PERCENT%.

Attention!
Your mailbox is now $PERCENT% full.
EOF

Просмотр квоты пользователя (также можно просмотреть в WEB-интерфейсе PostfixAdmin)

doveadm quota get -u acc@uni.ka

Пересчитать квоту для конкретного пользователя

doveadm quota recalc -u acc@uni.ka

Проверка

/usr/local/bin/quota-warning.sh 85% acc@uni.ka

 

 

Источник

image_pdfimage_print

Добавить жесткий диск

Дано: жесткий диск /dev/ada1

Цель: удалить существующую разметку, создать новую разметку GPT, создать два раздела: подкачка и данные и подключить их к рабочей системе.

После каждого действия выполняйте gpart show, чтобы наблюдать за результатом. Последовательность действий:

  1. Удалить существующую разметку:
    gpart destroy -F ada1
  2. Создать новую разметку:
    gpart create -s gpt /dev/ada1
  3. Создать два раздела: подкачка и данные:
    gpart add -t freebsd-swap -s 2097152 /dev/ada1
    gpart add -t freebsd-ufs /dev/ada1
  4. Создать файловую систему UFSv2 на втором разделе:
    newfs -U /dev/ada1p2
  5. Добавить в файл /etc/fstab строки для автомонтирования при загрузке:
    /dev/ada1p1     none      swap     sw      0       0
    /dev/ada1p2     /mnt      ufs      rw      2       2
  6. Смонтировать новый раздел (команда монтирует все разделы из файла /etc/fstab):
    mount -a
  7. Включить в работу новый раздел swap командой:
    swapon /dev/ada1p1

На этом настройка завершена.

Оригинал

image_pdfimage_print

Ошибка “Не найден сетевой путь”

Компьютер WinXP Pro SP3 не удается подключить в домен Windows 2003. Во время подключения, после ввода логина и пароля, возникает ошибка на рабочей станции: “При присоединении к домену “хххх” произошла следующая ошибка: не найден сетевой путь”.

Также при попытке подключиться к сетевым ресурсам домена возникает ошибка: “Не найден сетевой путь”. Если использовать подключение через ip адрес \\ip\c$ ошибка: “сетевая папка недоступна. За информацией о разрешении проблем в сети обратитесь к справочной системе Windows”.

Решение: Был отключен “Клиент для сетей Microsoft” и остановили службу Firewall.

Еще вариант решения.
Проблема: При вводе рабочей станции или сервера в домен может возникнуть ошибка:
При присоединении к домену “МегаДомен” произошла следующая ошибка: Не найден сетевой путь.

Причина: Причиной этой ошибки (и, как следствие, невозможность ввести рабочую станцию или сервер в домен) является остановленная служба “Модуль поддержки NetBIOS через TCP/IP“, потому как для поиска доступного контроллера домена используется именно NetBIOS-имя домена.

Решение: Для решения данной проблемы необходимо изменить режим запуска службы на “Auto” и запустить службу вручную.

image_pdfimage_print

FreeBSD не загружается

1) Не загружается ядро.

Если вдруг что-то случилось с текущим ядром, то можно попробовать загрузить старое (если конечно оно есть). Делается это так: после старта зарузчика и появления меню нажимаем 3 (FreeBSD 9.X, 10.X) или 6 (FreeBSD 8.x). Теперь нам доступна консоль с командами. Список ядер можно посмотреть, выполнив команду

ls /boot

В выводе смотрим наши ядра. Допустим, наше старое ядро называется kernel.old и находится в /boot/kernel.old. И так, ход действий такой:

— выгрузить текущее ядро:

unload kernel

— загрузить старое ядро (именно файл самого ядра, а не папку, где оно лежит):

load /boot/kernel.old/kernel

— запустить загрузку ОС:

boot

После этого пойдёт загрузка старого ядра.

Примечание.

Начиная с 10.1 в загрузчике появился пункт меню (цифра 5) с выбором ядра для загрузки, что делает загрузку с новым ядром ещё проще.

Кстати, в загрузчике OK достаточно команд, что бы манипулировать загрузкой драйверов, смотреть текущие настройки и прочие команды, что бы попытаться реанимировать ОС.

А вот метод для загрузки ZFS-only (взял отсюда)

Правильный и документированный способ:

unload
boot [-s -v] kernel.old

Долгий и недокументированный:

unload
load /boot/kernel.old/kernel
load /boot/kernel.old/opensolaris.ko
load /boot/kernel.old/zfs.ko
load -t /boot/zfs/zpool.cache /boot/zfs/zpool.cache
boot [-s -v]

2) Не монтирует корень ФС

Вы попадаете в приглашение mountroot. Что же делать дальше, если, допустим, вы не помните название разделов, где находится корень. В том же mountroot пишется подсказка:

? List valid disk boot devices

Набираем знак вопрос и тут же показываются все доступные разделы. Осталось только найти нужный и ввести приблизительно так:

mountroot> ufs:/dev/ada1

и нажать Enter. Если вы ввели правильно загрузится ОС. Если остальные точки монтирования содержат ошибки, то вас выкинет в single mode (о нём речь пойдёт ниже). Если не угадали с разделом, пробудем ещё, до тех пор, пока не найдём нужный раздел.

3) Прочие ошибки и Single mode

Если возникли прочие ошибки и система попала в Single mode сама или вам нужно загрузить её принудительно, то в меню загрузчика нажимаем 2 (FreeBSD 9.X, 10.X) или 4 (FreeBSD 8.x) и получаем приглашение:

Enter full pathname of shell or RETURN for /bin/sh

Нажимаем Enter и попадаем в single mode. В этом режиме смонтирован только корень и то, в режиме ReadOnly. Нужно его перемонтировать в режим RW:

# mount -o rw /

Монтируем остальные ФС (если есть необходимость; инфа при этом берётся из /etc/fstab):

# mount -a

Теперь можно даже запустить bash или любую другую оболочку обычным образом. Но если, допустим, система повреждена и не получается запустить любимую оболочку, останемся работать в sh, при этом нужно её запустить так:

# sh -E

Этим мы включим работу стрелок (вверх/вниз) при работе с историей команд, что будет очень удобно.

Если после single mode нужно загрузится дальше в ОС, то просто пишем exit.

Link

image_pdfimage_print

Fail2ban

Немного начали напрягать брутом популярных портов.

cd /usr/ports/security/py-fail2ban/
make install clean

В процессе установки у меня вывалилась ошибка, связанная с py27-setuptools, примерно такая

===>  Installing for py27-setuptools-32.1.0_1
===>  Checking if py27-setuptools already installed
===>   Registering installation for py27-setuptools-32.1.0_1 as automatic
Installing py27-setuptools-32.1.0_1...
pkg-static: py27-setuptools-32.1.0_1 conflicts with py27-setuptools27-32.1.0 (installs files into the same place).  Problematic file: /usr/local/lib/python2.7/site-packages/easy-install.pth.dist
*** Error code 70
Stop.
make: stopped in /usr/ports/devel/py27-setuptools

Решение

pkg set -n py27-setuptools27:py27-setuptools
pkg set -o devel/py-setuptools27:devel/py27-setuptools

Далее

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

Переходим

cd /usr/local/etc/fail2ban
cp jail.conf jail.local

– чтобы при обновлении не потерлись конфиги.

cat /jail.local
[DEFAULT]
ignoreip = 127.0.0.1 192.168.1.12
# время бана в секундах (отрицательное число - навсегда)
bantime = -600

# время проверки,за которое событие успеет повторится
findtime = 900

# максимальное число правонарушений
maxretry = 2

# метод парсинга логов
backend = auto
usedns= no

[ssh-ipfw]
enabled = true
filter = bsd-sshd
action = bsd-ipfw[table “” not found /]
sendmail[name=ssh, dest=svm@tst-amo.pp.ua] logpath = /var/log/auth.log

В ipfw добавляем таблицы 3, 4, 5

#fail2ban table
 add 2 deny log all from table(3) to me
 add 2 deny log all from me to table(3)

и запускаем

/etc/rc.d/ipfw restart
service fail2ban restart

Делаем

tail -f /var/log/fail2ban.log

и пробуем ошибочно залогинится.

Защищаем Postfix

В /usr/local/etc/fail2ban/jail.local добавляем

[postfix-sasl-ipfw]
enabled = true
filter = postfix-sasl
action = bsd-ipfw[table “” not found /]
logpath = /var/log/maillog bantime = 604800 findtime = 3600 maxretry = 3 ignoreip = 127.0.0.1 192.168.1.0/24 backend = auto
[postfix-ipfw]
enabled = true
filter = postfix
action = bsd-ipfw[table “” not found /]
logpath = /var/log/maillog bantime = 604800 findtime = 3600 maxretry = 3 ignoreip = 127.0.0.1 192.168.1.0/24 backend = auto

В /usr/local/etc/fail2ban/filter.d/postfix-sasl.local правим до состояния

[INCLUDES]
before = common.conf

[Definition]
_daemon = postfix(-\w+)?/(submission/)?smtp(d|s)
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL ((?i)LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/:]*={0,2})?\s*$
ignoreregex =

Защищаем Dovecot

[dovecot-ipfw]
enabled = true
filter = dovecot
action = bsd-ipfw
# mail-whois[name=Dovecot, dest=svm@tst-amo.pp.ua]
logpath = /var/log/dovecot.log
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1 192.168.1.47
backend = auto

Защищаем Roundcube

В /usr/local/etc/fail2ban/jail.local добавляем

[roundcube-ipfw]
enabled = true
filter = roundcube-auth
action = bsd-ipfw[table “” not found /]
port = http,https bantime = 240 findtime = 3600 maxretry = 3 logpath = /usr/local/www/roundcube/logs/errors ignoreip = 127.0.0.1 192.168.1.0.24 backend = auto

Фильтр /usr/local/etc/fail2ban/filter.d/roundcube-auth.local подошел дефолтный.

Защищаем ProFTPd

[proftpd-ipfw]
enabled = true
filter = proftpd
action = bsd-ipfw[table “” not found /]
port = ftp,ftps,sftp bantime = 240 findtime = 3600 maxretry = 3 logpath = /var/log/proftpd/proftpd.log ignoreip = 127.0.0.1 192.168.1.47 194.44.219.161 backend = auto

Полезные команды:

Рестарт

# service fail2ban restart

Получить список правил:

# fail2ban-client status

Получить статистику заблокированных адресов:

# fail2ban-client status <имя правила>

Для удаление адреса из списка вводим:

fail2ban-client set <имя правила> unbanip <IP-адрес>

Например:

fail2ban-client set ssh unbanip 5.234.11.168

https://www.dmosk.ru/instruktions.php?object=fail2ban

image_pdfimage_print

OpenDKIM + Postfix

1. Установка OpenDKIM

Для начала, устанавливаем пакет OpenDKIM. Он выполняет операции шифрования заголовков для DKIM, а также содержит набор для формирования ключей.

Для его установки вводим следующее.

cd /usr/ports/mail/opendkim
make config-recursive
make install clean

2. Создание сертификата для домена

Для этого можно воспользоваться бесплатным онлайн инструментом на сайте dkimcore.org. Однако, в данном примере, мы воспользуемся opendkim-genkey и сформируем его самостоятельно.

И так, создаем каталог для размещения ключей:

mkdir /etc/opendkim

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

opendkim-genkey -D /etc/opendkim/ --domain site.ru --selector relay

* где site.ru — домен, с которого будет отправляться почта:  relay — имя селектора (селектор — это строковый идентификатор, он может быть любым).

В папке /etc/opendkim/ должно появиться два файла с расширениями .private и .txt. Первый — закрытый ключ (храним его у себя на сервере), второй — готовая txt-запись для DNS.

Задаем группу владельца opendkim для созданных ключей:

chown opendlim:opendkim /etc/opendkim/*

Если система выдаст ошибку, что группы opendkim не существует (chown: opendkim: illegal group name), необходимо сначала создать учетную запись.

pw useradd opendkim -m -s /usr/sbin/nologin -w no

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

Смотрим содержимое файла txt:

cat /etc/opendkim/relay.txt

И используя данное содержимое, в панели управления нашим DNS создаем TXT-запись следующего формата:

relay._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqG...rhyaj8OcbwIDAQAB"

* где relay — название нашего селектора MIGfMA0GCSqG…rhyaj8OcbwIDAQAB — сокращенная запись открытого ключа (она длиннее).

BIND не понимает строки длинней 255 символов и поэтому, если вы пропишите публичный ключ в виде одной длинной строки, BIND при перезагрузке выдаст ошибку:

Дополнительные необязательные записи

_domainkey IN TXT "o=~; r=postmaster@site.ru"

* где o=~ означает, что не все сообщения подписываются для домена (o=- — говорит, что все письма используют DKIM).

_adsp._domainkey IN TXT "dkim=all"

ADSP это опциональное расширение DKIM, которое позволяет сообщать почтовым серверам-получателям, что делать с письмом пришедшим с якобы нашего домена, но не имеющее подписи.

all запрещает принимать письма от домена без цифровой подписи. Другие варианты: discardable — блокировать сообщения на стороне получателя, unknown — по умолчанию (такую запись создавать не обязательно).

4. Настройка OpenDKIM и Postfix

Открываем конфигурационный файл opendkim.

ee /usr/local/etc/mail/opendkim.conf

И приводим его к следующему виду:

AutoRestart             Yes
AutoRestartRate         10/1h
Umask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes
Canonicalization        relaxed/simple
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256
UserID                  opendkim:opendkim
Socket                  inet:12301@localhost

* все параметры можно оставить, как в данном примере, за исключением Socket — можно указать любой другой порт, вместо 12301.

Создаем файл доверенных узлов. В него войдут имена хостов, доменов и IP-адресов, которые будут приняты, как доверенные и подписаны.

ee /etc/opendkim/TrustedHosts

И вносим следующее:

127.0.0.1
localhost
*.site.ru

* где site.ru — почтовый домен.

Создаем таблицу KeyTable. В ней хранится список соответствий между селекторами, доменами и файлами с закрытыми ключами. Формат записей:
<селектор>._domainkey.<домен> <домен>:<селектор>:<путь к закрытому ключу>

ee /etc/opendkim/KeyTable

И в соответствии с форматом приводим его к нужному виду:

relay._domainkey.site.ru site.ru:relay:/etc/opendkim/relay.private

И напоследок, создаем SigningTable. В данной таблице хранятся соответствия между определенными email-адресами и записями в KeyTable.

ee /etc/opendkim/SigningTable

И приводим к такому виду:

*@site.ru relay._domainkey.site.ru

Запускаем службу opendkim.

service milter-opendkim onestart

Добавляем демона в rc.conf:

echo 'milteropendkim_enable="YES"' >> /etc/rc.conf
echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf

* первая команда разрешает запуск демона, вторая — принудительно заставляет его запускаться от пользователя opendkim.

И запускаем его:

service milter-opendkim start

Открываем конфигурационный файл Postfix.

ee /usr/local/etc/postfix/main.cf

Добавляем или редактируем:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

* если smtpd_milters и non_smtpd_milters присутствуют в конфигурационном файле, то приведенные в данном примере значения нужно дописать к имеющимся. ** 12301 — порт работы opendkim, который был задан в opendkim.conf.

Перезапускаем Postfix:

service postfix restart

5. Проверка

Отправляем письмо

Отправляем электронное сообщение на различные почтовые системы — mail.ru, gmail.com, yandex.ru.

Способов отправки несколько, например, можно выполнить следующую команду:

echo "Test DKIM" | mail -s 'Testing DKIM' -r admin@site.ru test@mail.ru

* где admin@site.ru — почтовый ящик, от которого отправляется письмо (напомню, в данном примере подпись создается для домена site.ru),  test@mail.ru — Ваш адрес почты, на который придет письмо.

Второй способ — настроить почтовый клиент, который будет отправлять почту через настроенный нами сервер.

Проверяем заголовки

Открываем наше письмо и смотрим заголовки (в mail.ru: Еще – Служебные заголовки).

Среди них мы должны увидеть следующую строчку:

dkim=pass header.d=site.ru

Проверка домена на базе DKIM настроена успешно.

image_pdfimage_print

DKIM (BIND, Postfix/Exim)

Первый вариант.

Создаем каталог для размещения ключей:

mkdir /etc/opendkim

Генерируем их:

opendkim-genkey -D /etc/opendkim/ --domain tst-amo.net.ua --selector relay

relay – название селектора (может быть любым напр. – mail)

Создалось два файла – *.private – закрытый ключ (храним у себя), *.txt – запись для DNS.

Создаем группу opendkim:

pw useradd opendkim -m -s /usr/sbin/nologin -w no

и меняем владельца:

chown :opendkim /etc/opendkim/*
chmod g+r /etc/opendkim/*

Второй вариант.

mkdir /usr/local/etc/exim/dkim

Делаем секретный ключ через openssl

root@server# openssl genrsa -out /usr/local/etc/exim/example.com.key 2048

На выходе имеем ключ вида:

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQDT1tSzyG2Zch4LTgGPbn/8H535Vd+friNn/gBsV7rFNVZdxapD 
dOUzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkdDzctC4EdJsLcpCpyf3x21nYZ 
oJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA39CtbmetjBS9l/NsMQIDAQAB 
AoGBAM2ZyVFAatkQSBaivСLwlWknapSPgv4g7h5FSTXeI9i5frx+V1UnRDki+FTx 
nbH9CErRZh8jZQj4x1Pp+T0SyRtb62ydJooPYIpNlTt71cgZNwH174uFt4HevKmC 
MJIhzaufEZYhamS4NQOR+4FakdZX2T8yzuvwDwkplJP2tO/tAkEA7RDltCTOShdd 
sJYs0wjs1mDXUiSz0giFAYvMBvOelpyjJl9Pi1A0CNcD4WdvAl0Xo5aRMVrTXRzf 
-----END RSA PRIVATE KEY-----

Генерим публичный ключ на основе секретного

root@server# openssl rsa -in /usr/local/etc/exim/example.com.key -pubout

На выходе получим что-то вроде:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA3GNADCBiQKBgQDT1tSzyG1Zch4LTgGPbn/8H535 
Vd+friNn/gBsV7rFNVZdxapDd0UzeATUTbAG/3Ux7vJxYd6i982IajVz0b2dsmkd 
DzctC4EdJsLcpCpyf3x21nYZoJO2GjaFW65MNj7dU7BXDerLTE+zTu/Q4vs4ZqCA 
-----END PUBLIC KEY-----

Создаем в DNS запись relay._domainkey.example.com типа TXT со значением:

mail._domainkey.example.com. IN TXT ( "k=rsa\; "
                                    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs2WdcyOKgKVU2C/7CV77"
                                    "4mu/b+XVaVixtuASB0wAOjaPnEcFzwI84hu6wmy8cpPJlVImnf1gD/y/pA08+viV"
                                    "PPP/6bHfEiJjxOSjDnhF2V1+GlOrl6IYxNxOxXPLw88QpDPak+ZO0yLU58UxJP1K"
                                    "cPdCuftEMFHWd5vuiHquBNYtkW6MxaGcoX4hK8eE9CdrKDH7EtuLkkJ4uj0Mw4R7"
                                    "kd6FexfyppDXFGGu8oDN+7IUfCqnKDkUxqb5Dh4rDD24Tn6KdDY5eFgjw7OIUr8H"
                                    "Jbr9KNSE6lF3M5JLx9VX/ny3ec9ODLm0FGpDQbXcRM+CTmX6H2jGkwJ4VcpqDwVZ"
                                    "RwIDAQAB" )

(В данном случае это синтаксис для DNS сервера на BIND, и другие DNS сервера могут не требовать знак “\” для экранирования “;”.)

Вместо relay можете использовать другой селектор, например, dkimserverpublic и тд. Подобных записей Public key для DKIM может быть несколько.

Необходимо дождаться, когда обновится ваша DNS запись на других серверах. Это может занять несколько часов.

Проверять свою DKIM запись можно, например, с помощью сервиса DNSWatch

Добавляем ADSP запись

Создаем в DNS запись _adsp._domainkey.example.com типа TXT со значением dkim=all.

_adsp._domainkey.example.com. IN TXT "dkim=all"

Помимо all параметр dkim может иметь еще два значения — unknown и discardable.

  • unknown — домен может подписывать некоторые или все письма.
  • all — все письма с домена подписаны.
  • discardable — все письма с домена подписаны. Кроме того, если письмо приходит без валидной подписи в связи с изменениями в пути, прохождением через путь без доступа к подписывающему ключу или по другим причинам, домен призывает адресата отклонить его.

Рестарт BIND.

Правим конфиг Exim

В файл /usr/local/etc/exim/configure добавляем в начало:

## DKIM:
DKIM_DOMAIN = ${lc:${domain:$h_from:}} DKIM_FILE = /usr/local/etc/exim/${lc:${domain:$h_from:}}.key DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Эта конструкция позволит использовать разные Private key для разных доменов.

Подправляем транспорт remote_smtp:

remote_smtp:
         driver           = smtp
         dkim_canon       = relaxed
         #dkim_strict     = yes
         dkim_domain      = DKIM_DOMAIN
         dkim_selector    = relay
         dkim_private_key = DKIM_PRIVATE_KEY

Здесь relay — наш селектор, .

Сохраняем конфиг и перечитываем его:

root@server# service exim reload

Проверять DNS будем с помощью утилиты dig, а также можно воспользоваться сервисом http://www.dnswatch.info

Проверка с помощью dig:

dig relay._domainkey.example.com TXT
.....
;; ANSWER SECTION:
relay._domainkey.example.com. 3600 IN      TXT     "k=rsa\; " "p=MIIBIjA.......................
.....

С помощью сайта – в окошке выбираем тип записи TXT и вставляем

relay._domainkey.example.com

Postfix

Редактируем:

/etc/opendkim.conf

И приводим его, например,  к следующему виду:

AutoRestart             Yes
AutoRestartRate         10/1h
Umask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  inet:12301@localhost

* все параметры можно оставить, как в данном примере, за исключением Socket — можно указать любой другой порт, вместо 12301.

Теперь создаем и заполняем файлы:

ee/etc/opendkim/TrustedHosts
127.0.0.1 
localhost 
*.tst-amo.net.ua
ee /etc/opendkim/KeyTable
relay._domainkey.tst-amo.net.ua tst-amo.net.ua:relay:/etc/opendkim/relay.private
ee /etc/opendkim/SigningTable
*@tst-amo.net.ua relay._domainkey.tst-amo.net.ua

Добавляем в автозагрузку и запускаем:

echo 'milteropendkim_enable="YES"' >> /etc/rc.conf
echo 'milteropendkim_uid="opendkim"' >> /etc/rc.conf

service milter-opendkim start

Вставляем в /usr/local/etc/postfix/main.cf

# DKIM
 milter_protocol = 6
 milter_default_action = accept
 smtpd_milters = inet:localhost:12301
 non_smtpd_milters = inet:localhost:12301

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

image_pdfimage_print

Sieve + Dovecot

В портах, согласно UPDATING, убрали версии с индексом 2 и оставили только такую

/usr/ports/mail/dovecot-pigeonhole
make install clean

дописываем (у меня *.conf одним файлом)

ee /usr/local/etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp sieve

в секции services

service lmtp {
      unix_listener /var/spool/postfix/private/dovecot-lmtp {
      user = postfix
      mode = 0660
      group = postfix
      }
}

service managesieve-login {
      inet_listener sieve {
      port = 4190
 }
      process_min_avail = 0
      service_count = 1
      vsz_limit = 64M
}

service managesieve {
     process_limit = 1024
}

В секции protocol

protocol lmtp { 
     mail_plugins = $mail_plugins sieve
}
protocol lda {
     mail_plugins = $mail_plugins sieve
}
protocol imap {
     mail_max_userip_connections = 10
     mail_plugins = $mail_plugins imap_sieve
}
protocol sieve {
  managesieve_max_line_length = 65536
  mail_max_userip_connections = 10
  managesieve_logout_format = bytes=%i/%o
  managesieve_implementation_string = Cyrus timsieved v2.2.13
  managesieve_sieve_capability =
  managesieve_notify_capability =
  managesieve_max_compile_errors = 5
}

В protocol imap дописываем

  mail_plugins = $mail_plugins imap_sieve

В секцию plugin

plugin {
 sieve_plugins = sieve_imapsieve
 sieve = /var/vmail/%d/%n/.dovecot.sieve
 sieve_before = /usr/local/etc/dovecot/sieve/spam.sieve
 sieve_dir = /var/vmail/%d/%n/.dovecot.sieve

 sieve_default = /usr/local/etc/dovecot/sieve/default.sieve
 sieve_global = /usr/local/etc/dovecot/sieve/global/
 sieve_global_path = /usr/local/etc/dovecot/sieve/global/spam.sieve

 sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
 sieve_execute_socket_dir = sieve-execute

 sieve_filter_bin_dir = /usr/lib/dovecot/sieve-filter
 sieve_filter_socket_dir = sieve-filter

 #sieve_default_name = roundcube
 sieve_max_actions = 32
 sieve_max_redirects = 8
 sieve_max_script_size = 1M

 sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe
 sieve_pipe_socket_dir = sieve-pipe
 sieve_quota_max_scripts = 30
}

Далее создаем директорию

mkdir /usr/local/etc/dovecot/sieve/global

Затем создаем скрипт с таким содержанием

ee spam.sieve
require ["regex", "fileinto", "imap4flags"];
# rule:[SPAM]
if allof (header :contains "subject" "***Spam*** ")
{
       setflag "\\Seen";
       fileinto "Junk";
       stop;
}
chmod 0750 spam.sieve
chown nobody spam.sieve

И компилируем

sievec spam.sieve

Добавим поддержку в Roundcube и добавим roundcube-markasjunk2 (чтобы из браузера в спам кидать)

/usr/ports/mail/roundcube-markasjunk2
make install clean
cd /usr/local/www/roundcube/plugins/markasjunk2
cp config.inc.dist config.inc.php

Далее

cd /usr/local/www/roundcube/plugins/managesieve
cp config.inc.dist config.inc.php

Нужно немного поправить

ee config.inc.php
$config['managesieve_port'] = 4190;
$config['managesieve_auth_type'] = PLAIN;
$config['managesieve_default'] = '/usr/local/etc/dovecot/sieve/global';

Теперь подключим плагины в roundcube – в самом низу дописываем в секции плагины

ee /usr/local/www/roundcube/config/config.inc.php
$config['plugins'] = array(
       'additional_message_headers', 'managesieve', 'markasjunk2'
);

Проверка.

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

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Подключаемся по IMAP и видим, что письмо, опознанное Spamassassin-ом как 100% спам, было перемещено в папку Junk.

 

image_pdfimage_print