Уходим из office365. Почтовый сервер на Postfix+Dovecot + LDAP
- Реализация
- Состав
- сеть
- Postfix
- Dovecot
- Sieve
- AMAVIS + clamav + spamassassin
- Postfix/SPF
- Логирование
- Тестирование
- NextCloud
- Клиенты
- Решения проблем
Создание почтового сервера, максимально соответствующего функционалу office365 для организации с интеграцией в Active Directory, и с последующей миграцией из облака Microsoft, для тех, кто там побывал.
Конечно, протокол MAPI невозможно заменить "один к одному", поэтому строятся максимальные аналоги работы
Реализация
Debian почтовый сервер postfix с хранением в IMAP через DOVECOT, с авторизацией в AD по параметру mail, возможностью сортировки писем на сервере, веб-клиентом почты, календарей, контактов и конференций в nextcloud.
Состав:
- postfux - MTA (LDAP)
- dovecot - IMAP (LDAP)
- amavis + clamav + spamassasin
- nextcloud с модулями
*SnappyMail - webmail
*AppOrder - показ приложений
*Calendar - caldav
*Contacts - carddaw
*LDAP user and group backend
*Talk - конференции
и тд (рекомендованные)
Сеть:
- открытые входящие порты
*80 443 - www
*22 - ssh
*3478 - stun
*25 465 993 - mail
*4190 - sieve
*10050 10051 - zabbix
- смонтировано NFS шара хранилища, async mode, 12 theads (синхронный режим NFS нагружает систему и замедляет работу с imap)
/etc/fstab:
192.168.0.20:/c/vmail /home/vmail nfs defaults 0 0
, где 192.168.0.20 - адрес NFS хранилища
mail.domain.ru - почтовый сервер для настройки
ad.domain.local - контроллер домена AD
Установка:
apt-get install postfix dovecot-imapd dovecot-pop3d mailutils postfix-ldap dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-ldap dovecot-sieve dovecot-managesieved
Директория хранения - /home/vmail
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
chown vmail:vmail /home/vmail
Конфигурация Postfix
/etc/postfix/main.cf - основной файл конфигурации
readme_directory = /usr/share/doc/postfix/README_FILES
html_directory = /usr/share/doc/postfix/html
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
#daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
#inet_protocols = all
inet_protocols = ipv4
mynetworks_style = host
smtpd_banner = mail2
unknown_local_recipient_reject_code = 550
myhostname = mail.domain.ru
alias_maps = hash:/etc/aliases
virtual_alias_maps = hash:/etc/postfix/virtual
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination =
relayhost =
mynetworks = /etc/postfix/mynetworks
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
#message size to 25Mb
message_size_limit = 26000000
# CC in one message -7
smtpd_recipient_limit = 30
smtpd_delay_reject = no
strict_rfc821_envelopes = yes
address_verify_sender = adm@domain.ru
header_checks = regexp:/etc/postfix/header_checks
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
transport_maps = hash:/etc/postfix/transport
virtual_mailbox_domains = domain.ru, domain2.ru, domain.com
virtual_mailbox_base = /home/vmail/%n
#virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_mailbox_maps = ldap:/etc/postfix/ldap_mailbox_maps.cf
#dovecot/users
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
maps_rbl_reject_code = 554
disable_vrfy_command = yes
# фильтры
content_filter = scan:[127.0.0.1]:10024
#SASL options
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
# enable TLS
smtp_use_tls = yes
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_helo_required = yes
smtpd_tls_cert_file = /etc/ssl/private/full.crt
smtpd_tls_key_file = /etc/ssl/private/domain.ru.key
#smtpd_sasl_path = /var/run/dovecot/auth-client
# пассивная защита от спама
# проверка клиентского соединения smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated,
#фильтр по IP check_client_access cidr:/etc/postfix/rbl_override, reject_rbl_client virbl.dnsbl.bit.nl, reject_rbl_client dynablock.wirehub.net, reject_rbl_client blackholes.wirehub.net, reject_rbl_client dialups.mail-abuse.org, reject_rbl_client blackholes.mail-abuse.org, reject_rbl_client dialups.mail-abuse.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rhsbl_client sbl.spamhaus.org, reject_rhsbl_client dnsbl.sorbs.net, # Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная, поддерживает ли Postfix конвейерную обработку команд ESMTP reject_unauth_pipelining, # Блокируем клиентов с адресами from, домены которых не имеют A/MX записей reject_unknown_address, # проверка PTR многие забили на PTR # reject_unknown_client_hostname, permit # проверка контекста команды HELO smtpd_helo_restrictions = reject_invalid_hostname, permit_mynetworks, permit_sasl_authenticated, check_helo_access hash:/etc/postfix/helo_access,
# # проварка по регулярным (IP и др) check_helo_access regexp:/etc/postfix/helo_regexp, # Правила для блокировки различных динамических ip. check_client_access regexp:/etc/postfix/_block_dsl, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, permit # прроверка MAIL FROM smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/postfix/sender_access, # возможны пробоемы (следующие 2) reject_unknown_sender_domain, reject_non_fqdn_sender, reject_sender_login_mismatch, check_client_access cidr:/etc/postfix/rbl_override, reject_rhsbl_sender dsn.rfc-ignorant.org # Запрет отправки писем, когда адрес MAIL FROM не совпадает с логином пользователя #reject_authenticated_sender_login_mismatch, # Отклоняем письма от несуществующих доменов reject_unknown_sender_domain, # Отклоняем письма от доменов в не FQDN формате reject_non_fqdn_sender, # Отклонение писем с несуществующим адресом отправителя reject_unlisted_sender, reject_unauth_destination, # Отклонять сообщения от отправителей, ящики которых не существуют, использовать аккуратно #reject_unverified_sender, # Список приватных сетей, которые не могут быть использованы в качестве IP для MX записей check_sender_mx_access cidr:/etc/postfix/_mx_access, # Правила для блокировки различных динамических ip. check_client_access regexp:/etc/postfix/_block_dsl, permit # проверка RCPT TO smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination, permit # проверка RCPT TO после пересылки smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, # spf check - требуется установка # check_policy_service unix:private/policy-spf, reject_unauth_pipelining, reject_unknown_sender_domain, # Отклонение писем с несуществующим адресом получателя reject_unlisted_recipient, # Отклоняет сообщения на несуществующие домены reject_unknown_recipient_domain, # Отклоняет сообщения если получатель не в формате FQDN reject_non_fqdn_recipient, # Отклоняем прием от отправителя с пустым адресом письма, предназначенным нескольким получателям. reject_multi_recipient_bounce, permit # проверка при передаче DATA smtpd_data_restrictions = permit # проверка при передаче END-OF-DATA smtpd_end_of_data_restrictions = permit
/etc/postfix/ldap_mailbox_maps.cf - конфиг работы с AD
server_host = ad.domain.local
server_port = 389
version = 3
search_base = dc=domain,dc=local
query_filter = (&(objectClass=user)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
scope = sub
#bind = yes
bind_dn = userad@domain.local
bind_pw = password123
debuglevel = 0r
master.cf - существенные изменения
# для связки с dovecot
submission inet n - n - - smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=/var/spool/postfix/private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
# для связки с amavis
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
127.0.0.1:10025 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8:
Карты
/etc/postfix/_block_dsl - блокировка всяческих DSL
/^mail\.mydomain\.ru$/ Reject That's my hostname, use your own
/^mail2\.mydomain\.ru$/ Reject That's my hostname, use your own
#/^[0-9.]+$/ Reject Your client not RFC 2821 compilant
#/([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}/ 553 SPAM-raw-ip-in-helo
#/(^|[0-9.-])([axv]dsl|isadsl|as|bgp|dynamicIP|broadband|cable|[ck]lient|dhcp|dial|dialin|dialup|dialer|dip|dsl|dslam|dup|dyn|dynamic|host|ip|isdn|modem|nas|node|pool|ppp|pppo[ae]|sirius.*ukrtel.*|user|users|vpn)[0-9.-]/i 553 SPAM_DYNAMIC-in-helo
/\.lan$/i 533 SPAM-lan-in-helo
/^dsl.*\..*\..*/i 553 AUTO_DSL spam
/dsl.*\..*\..*/i 553 AUTO_DSL1 spam
/[ax]dsl.*\..*\..*/i 553 AUTO_XDSL spam
/client.*\..*\..*/i 553 AUTO_CLIENT spam
/cable.*\..*\..*/i 553 AUTO_CABLE spam
/pool.*\..*\..*/i 553 AUTO_POOL spam
/dial.*\..*\..*/i 553 AUTO_DIAL spam
#/ppp.*\..*\..*/i 553 AUTO_PPP spam
/dslam.*\..*\..*/i 553 AUTO_DSLAM spam
/node.*\..*\..*/i 553 AUTO_NODE spam
#/([0-9]*-){3}[0-9]*(\..*){2,}/i 553 SPAM_ip-add-rr-ess_networks
#/([0-9]*\.){4}(.*\.){3,}.*/i 553 SPAM_ip-add-rr-ess_networks
/.*\.pppool\..*/i 553 SPAM_POOL
/[0-9]*-[0-9]*-[0-9]*-[0-9]*-tami\.tami\.pl/i 553 SPAM_POOL
/pool-[0-9]*-[0-9]*-[0-9]*-[0-9]*\..*/i 553 SPAM_POOL
/.*-[0-9]*-[0-9]*-[0-9]*-[0-9]*\.gtel.net.mx/i 553 SPAM_POOL
/dhcp.*\..*\..*/i 553 SPAM_DHCP
/etc/postfix/_mx_access - блокировка по IP
127.0.0.1 DUNNO
127.0.0.2 550 Domains not registered properly
0.0.0.0/8 REJECT Domain MX in broadcast network
10.0.0.0/8 REJECT Domain MX in RFC 1918 private network
127.0.0.0/8 REJECT Domain MX in loopback network
169.254.0.0/16 REJECT Domain MX in link local network
172.16.0.0/12 REJECT Domain MX in RFC 1918 private network
192.0.2.0/24 REJECT Domain MX in TEST-NET network
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network
224.0.0.0/4 REJECT Domain MX in class D multicast network
240.0.0.0/5 REJECT Domain MX in class E reserved network
248.0.0.0/5 REJECT Domain MX in reserved network
/etc/postfix/mynetworks - доверенные сети
127.0.0.0/8
172.16.0.0/16
192.168.0.0/24
104.47.0.0/16
, последняя - microsoft, для настройки транспорта с облака "Exchange admin center/mailflow/connectors"
в случае, если office365 прописан в mx - записи домена
/etc/postfix/transport - карта транспорта
#user1@domain.ru smtp:[domain-ru.mail.protection.outlook.com]:25
user2@domain.ru smtp:[domain-ru.mail.protection.outlook.com]:25
user3@domain.ru smtp:[domain-ru.mail.protection.outlook.com]:25
, где user1 уже перемещен, а почта остальных всё еще уходит в облако
/etc/postfix/header_checks - для логирования тем
/^Subject:/ WARN
#/etc/postfix/helo_access доверенные по HELO
mydomain.ru OK
x-domain.com OK
#/etc/postfix/helo_regexp регулярки HELO
/([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i REJECT IP-able helo SPAM
/^mail\.mydomain\.ru$/ REJECT That's my hostname, use your own
/(^\w+$)/i REJECT SPAM_bad_helo
#/etc/postfix/rbl_override доверенные rbl
1.1.1.1 OK otherMyIp OK 198.2.129.162 REJECT You IP are blacklisted!
#/etc/postfix/sender_access доверенные отправители
mydomain.ru REJECT Relay from gardaricafm.ru are denied
a@some-domain.ru REJECT You e-mail are blacklisted!r
#/etc/postfix/virtual виртуальные ящики (aliases не работают в мультидоменной конфигурации корректно)
adm@domain.ru user1@domain.ru user2@domain.ru user3@domain.ru
all@domain.ru user1@domain.ru user2@domain.ru user3@domain.ru
и тд..
№/etc/postfix/apply-changes.sh применение изменений всех карт
postmap transport virtual sender_access rbl_override helo_access _block_dsl _mx_access header_checks /etc/init.d/postfix reloadr
Dovecot
#/etc/dovecot/dovecot-ldap.conf.ext конфигурация в ldap
hosts = ad.domain.local:389
ldap_version = 3
auth_bind = yes
dn = userad@domain.local
dnpass = password123
base = dc=domain,dc=local
scope = subtree
deref = never
user_attrs = homeDirectory=/home/vmail/%d/%n,uid=5000,gid=5000
user_filter = (&(objectClass=user)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter = (&(objectClass=user)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
#/etc/dovecot/conf.d/10-mail.conf: отредактировать
auth_username_format = %Lu
auth_mechanisms = plain login digest-md5 cram-md5
disable_plaintext_auth = no
mail_location = maildir:/home/vmail/%d/%n
!include auth-ldap.conf.ext
#/etc/dovecot/10-mail.conf: отредактировать
mail_location = maildir:/home/vmail/%d/%n
mail_home = /var/vmail/%d/%n/sieve
mail_uid = vmail
mail_gid = vmail
#/etc/dovecot/10-master.conf: отредактировать
service auth {
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service stats {
unix_listener stats-reader {
user = vmail
group = vmail
mode = 0660
}
unix_listener stats-writer {
user = vmail
group = vmail
mode = 0660
}
}
#/etc/dovecot/10-ssl.conf
ssl = yes
ssl_cert = </etc/ssl/private/full.crt
ssl_key = </etc/ssl/private/domian.ru.key
#/etc/dovecot/conf.d/15-lda.conf
protocol lda {
mail_plugins = $mail_plugins sieve
}
#/etc/dovecot/15-mailboxes.conf
namespace inbox {
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Trash {
special_use = \Trash
}
mailbox Черновики {
auto = subscribe
special_use = \Drafts
}
mailbox Спам {
auto = subscribe
special_use = \Junk
}
mailbox Spam {
auto = no
special_use = \Junk
}
mailbox "Junk E-mail" {
auto = no
special_use = \Junk
}
mailbox "Deleted Messages" {
auto = no
special_use = \Trash
}
mailbox Отправленные {
auto = subscribe
special_use = \Sent
}
mailbox Удаленные {
auto = subscribe
special_use = \Trash
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Sent {
auto = no
special_use = \Sent
}
mailbox "Sent Messages" {
auto = no
special_use = \Sent
}
mailbox "Sent Items" {
auto = no
special_use = \Sent
}
}
#/etc/dovecot/20-managesieve.conf: отредактировать
protocols = $protocols sieve
...
service managesieve-login {
inet_listener sieve {
port = 4190
}
...
#/etc/dovecot/90-sieve.conf: отредактировать
...
plugin {
...
sieve = /home/vmail/%d/%n/sieve/dovecot.sieve
sieve_global_path = /etc/dovecot/sieve/default.sieve
sieve_dir = /home/vmail/%d/%n/sieve
sieve_global_dir = /etc/dovecot/sieve/global/
...
Донастройка Sieve:
#mkdir -p /etc/dovecot/sieve/global
#chown dovecot:dovecot -R /etc/dovecot/sieve
AMAVIS + clamav + spamassassin
Установка
apt-get install amavisd-new clamav clamav-daemon spamassassin
usermod -a -G amavis clamav
/etc/amavis/conf.d/05-domain_id - внести свои домены
@local_domains_acl = ( "mydomain.ru", "mydomain2.ru" );
/etc/amavis/conf.d/20-debian_defaults
...
$sa_spam_modifies_subj = 1;
$sa_spam_subject_tag = '***SPAM*** ';
..
/etc/amavis/conf.d/15-content_filter_mode отредактировать
...
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
...
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
...
/etc/amavis/conf.d/20-debian_defaults отредактировать
qr'.\.(exe|xz|vbs|pif|scr|bat|cmd|com|cpl)$'i, # banned extension - basic
/etc/amavis/conf.d/50-user добавить
$allowed_header_tests{'multiple'} = 0;
$allowed_header_tests{'missing'} = 0;
$spam_quarantine_to = "spam\@domain.ru";
$virus_quarantine_to = "virus\@domain.ru";
systemctl enable clamav-daemon amavis
Обновить clamav можно вручную, разместив скачанные каким либо с адресов
https://database.clamav.net/main.cvd
https://database.clamav.net/daily.cvd
https://database.clamav.net/bytecode.cvd
https://packages.microsoft.com/clamav/
файлы в /var/lib/clamav
Обновить спам базы
sa-update --nogpg --verbose
Обучение:
# обучение спаму
#sa-learn --spam /home/vmail/_spam
# обучение ошибочных определений спама
#sa-learn --ham /home/vmail/_am
# статистика
#sa-learn --dump magic
Postfix/SPF
Sender Policy Framework (SPF) - это технология защиты электронной почты от подделки, которая позволяет владельцам доменов перечислять в службе доменных имен (DNS) авторизованные источники почты из своих доменов. Это позволяет получателям почты отклонять почту, которая поступает из неавторизованных источников
sudo apt-get install postfix-policyd-spf-python
или для перл
sudo apt-get install postfix-policyd-spf-perl
/etc/postfix/main.cf добавить
policy-spf_time_limit = 3600s
/etc/postfix/master.cf
policy-spf unix - n n - 0 spawn
user=nobody argv=/usr/bin/policyd-spf /etc/postfix-policyd-spf-python/policyd-spf.conf
или для перл
policy-spf unix - n n - - spawn
user=nobody argv=/usr/sbin/postfix-policyd-spf-perl
/etc/postfix/main.cf
smtpd_recipient_restrictions =
...
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
check_policy_service unix:private/policy-spf
...
/etc/postfix-policyd-spf-python/policyd-spf.conf
# For a fully commented sample config file see policyd-spf.conf.commented
debugLevel = 2
TestOnly = 0
# 1- test
HELO_reject = SPF_Not_Pass
#SPF_Not_Pass
#Fail
Mail_From_reject = Fail
PermError_reject = False
TempError_Defer = False
skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1
Domain_Whitelist =x-domain.ru,mail.rur
Логирование
mkdir /var/log/mail
Помечаются логи от dovecot /etc/dovecot/conf.d/10-logging.conf
syslog_facility = local5
/etc/rsyslog.conf отредактировать
mail.info -/var/log/mail/mail.info
mail.warn -/var/log/mail/mail.warn
mail.err /var/log/mail/mail.err
local5.* -/var/log/mail/dovecot.log
local5.warning;local5.error;local5.crit -/var/log/mail/dovecot-errors.log
/etc/logrotate.d/mail
su root adm
/var/log/mail/mail.info /var/log/mail/mail.warn /var/log/mail/mail.err /var/log/mail/*.log {
rotate 30
daily
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
systemctl restart rsyslog
systemctl restart dovecot
systemctl restart postfix
endscript
}
Перезапуск:
# systemctl restart logrotate && systemctl restart rsyslog
# systemctl restart amavis && systemctl restart dovecot && systemctl restart postfix
Тестирование:
Проверка открытых портов
#netstat -tpln
Проверка postmap (в зависимости от таблицы)
#postmap -vq user@domain.ru ldap:/etc/postfix/ldap_mailbox_maps.cf
или
#postmap -q 122.187.227.167 cidr:/etc/postfix/rbl_override
Отправка SMTP
#echo "Test mail" | mail -s "Test mail" user@domain.ru
Проверка ldap
#ldapsearch -x -h ad.domain.ocal -D 'userad' -W -b 'cn=Users,dc=domain,dc=local'
Проверка IMAP
#openssl s_client -crlf -connect 127.0.0.1:993
#tag login user@domain.ru password123
NextCloud
Установка
Для функционирования требуется стандартный LAMP (Linux, Apache, MySQL/MariaDB, PHP). или LEMP с рекомендуемыми модулями, описанными в https://docs.nextcloud.com/
Настроить базу данных для nextcloud MySQL или SQLite
mysql -uroot -p
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on nextcloud.* to 'username'@'localhost';
FLUSH privileges;
quit;
Скачать со страницы загрузки nextcloud последнюю стабильную версию
https://download.nextcloud.com/server/releases/
Распаковать в root директорию веб-сервера
Применить права
#chown -R www-data:www-data /var/www/nextcloud/
Использовать веб или консольную установку
Обновление Nextcloud
Сделать бэкап data/ и config/
Режим обслуживания и остановить apache
sudo -u www-data php occ maintenance:mode --on
/etc/init.d/apache2 stop
mv /var/www/nextcloud/ /var/www/_nextcloud/
Скачать и распаковать дистрибутив
wget https://download.nextcloud.com/server/releases/nextcloud-28.0.2.zip
или актуальную
unzip nextcloud-28.0.2.zip -d /var/www/
Перезаписать config/
chown -R www-data:www-data nextcloud
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;
Запустить apache и обновление
/etc/init.d/apache2 start
sudo -u www-data php occ upgrade
При ключевых обновлениях может потребуется поправить индексы
$ sudo -u www-data php occ db:add-missing-columns $ sudo -u www-data php occ db:add-missing-indices $ sudo -u www-data php occ db:add-missing-primary-keys
Выход из режима обслуживания
sudo -u www-data php occ maintenance:mode --off
Настройка
Полезное в сonfig.php:
Вынести директорию /data в другое расположение
'datadirectory' => '/home/vcloud',
Указать доверенные домены функционирования
'trusted_domains' =>
array (
0 => 'mail.domain.ru',
1 => 'mail.domain.com',
),
Приложения
Приложение user_external
Позволяет авторизоваться пользователям по определенному протоколу
https://github.com/nextcloud/user_external#readme
Например IMAP
Прописать в config.php:
'user_backends' => array(
array(
'class' => '\OCA\UserExternal\IMAP',
'arguments' => array(
'192.168.0.1', 993, 'ssl', 'domain.ru', false, false
),
),
),
Если используется LDAP - данное приложение не нужно
Приложение LDAP user and group backend
Позволяет добавлять пользователей домена
Настройка по ссылке https://$nextcloudserver/index.php/settings/admin/ldap
Параметры:
Сервер:
Сервер ad.domain.local 389
user password
dc=domain,dc=local
Пользователи:
(&(objectClass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Учетные данные:
(&(objectClass=user)(mail=%uid)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Эксперт:
Атрибут для внутреннего имени: mail
Дополнительно:
Поле отображаемого имени пользователя - name
База дерева пользователей - dc=domain,dc=local
Атрибуты поиска пользователей - mail
displayName - name
Поле адреса email - mail
apporder
Настраивает порядок приложений и первое открывающееся прописать в config.php:
'defaultapp' => 'apporder',
Контакты
общие контакты у всех пользователей
1. Создать пользовательскую группу, например company
2. Выгрузить всех пользователей и добавить их в группу
#!/bin/bash
sudo -u www-data php occ user:list | sed -r 's@ *- ([^:]*):.*@\1@' > /home/userlist
while read p; do
sudo -u www-data php occ group:adduser company $p
done </home/userlist
3. Установить приложение Auto Groups
4. "Параметры сервера" - > Дополнительные параметры -> Автогруппы - добавить company
5. В одном из пользователей или в администраторе создать адресную книгу, например company, и заполнить её данными
6. Расшарить эту адресную книгу на группу company
SnappyMail Webmail
Работает шустрее и гибче чем штатный mail
Управление
https://$nextcloudserve/index.php/apps/snappymail/?admin#
- в разделе домены добавить свой домен с настройками сервера приема/отправки/сортировки(sieve)
(желательно с localhost для быстроты)
Talk
Приложение конференций.
Работает из коробки, но желательно настроить свои STUN / TURN сервера.
apt install coturn
/etc/turnserver.conf:
server-name=mail.domain.ru
use-auth-secret
static-auth-secret=<yourChosen/GeneratedSecret>
total-quota=0
bps-capacity=0
stale-nonce
realm=domain.ru
listening-port=3478
listening-ip=1.1.1.1
fingerprint
total-quota=100
bps-capacity=0
stale-nonce
no-multicast-peers
#no-stdout-log
log-file=/var/log/tun.log
syslog
simple-log
Операции с OCC
Удаление пользователя
# sudo -u www-data php occ user:delete user@domain.ru
Сброс пароля пользователя
# sudo -u www-data php user:resetpassword user
Клиенты
MS Office Outlook
Авто-настройка
Согласно документации, при автоматической настройке, outlook опрашивает:
https://<SMTP-address-domain>/autodiscover/autodiscover.xml
https://autodiscover.<smtp-address-domain>/autodiscover/autodiscover.xml
Причем он делает это не методом GET, а методом POST.
Нужно создать скрипт autodicover.php:
<?php
//get raw POST data so we can extract the email address
$request = file_get_contents("php://input");
// optional debug log
# file_put_contents( 'request.log', $request, FILE_APPEND );
// retrieve email address from client request
preg_match( "/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $request, $email );
// check for invalid mail, to prevent XSS
if (filter_var($email[1], FILTER_VALIDATE_EMAIL) === false) {
throw new Exception('Invalid E-Mail provided');
}
// get domain from email address
$domain = substr( strrchr( $email[1], "@" ), 1 );
// POP settings
$popServer = 'mail.' . $domain; // pop.example.com
$popPort = 995;
$popSSL = true;
// IMAP settings
$imapServer = 'mail.' . $domain; // imap.example.com
$imapPort = 993;
$imapSSL = true;
// SMTP settings
$smtpServer = 'mail.' . $domain; // smtp.example.com
$smtpPort = 465;
$smtpSSL = true;
//set Content-Type
header( 'Content-Type: application/xml' );
?>
<?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server><?php echo $imapServer; ?></Server>
<Port><?php echo $imapPort; ?></Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $email[1]; ?></LoginName>
<SPA>off</SPA>
<SSL><?php echo $imapSSL ? 'on' : 'off'; ?></SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>POP3</Type>
<Server><?php echo $popServer; ?></Server>
<Port><?php echo $popPort; ?></Port>
<LoginName><?php echo $email[1]; ?></LoginName>
<DomainRequired>off</DomainRequired>
<SPA>off</SPA>
<SSL><?php echo $popSSL ? 'on' : 'off'; ?></SSL>
<DomainRequired>off</DomainRequired>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server><?php echo $smtpServer; ?></Server>
<Port><?php echo $smtpPort; ?></Port>
<DomainRequired>off</DomainRequired>
<LoginName><?php echo $email[1]; ?></LoginName>
<SPA>off</SPA>
<SSL><?php echo $smtpSSL ? 'on' : 'off'; ?></SSL>
<AuthRequired>on</AuthRequired>
<UsePOPAuth>off</UsePOPAuth>
<SMTPLast>off</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>
Разместить его в веб директории и создать 301 редирект
правилами nginx
location = /autodiscover/autodiscover.xml {
return 301 $scheme://autodiscover.vzlot.ru/autodiscover/autodiscover.php;
}
или .htaccess для apache
Ссылка для онлайн для проверки
https://testconnectivity.microsoft.com/tests/Ola/input
Ручная настройка
выглядит так:
IMAP Сервер
mail.domain.ru
Логин - email
SSL Порт 993
SMTP Сервер
mail.domain.ru
Логин - email
SSL Порт465
OutlookCalDavSynchronizer
Надстройка для Outlook для синхронизации календарей и контактов для M$ OutLook
Создать профиль календаря:
CalDav адрес можно скопировать с персональной страницы календаря nextcloud
https://$nextcloudserver/remote.php/dav/calendars/$email/personal/
username - email
+ Use pop3/IMAP accaumt passwordу
Создать профиль контактом
CardDav адрес можно скопировать с персональной страницы контактов nextcloud
https://nextcloudserver/remote.php/dav/addressbooks/users/$email/contacts/
username - email
+ Use pop3/IMAP accaumt password
Можно подключить системную адресную книгу Nextcloud со всеми пользователями облака по адресу
https://$nextcloudserver/remote.php/dav/addressbooks/system/system/system/
Android OpenSync
Клиент для Android для формирования и синхронизации CalDav/CardDav
Настройка:
Адрес (системная адресная книга):
https://$nextcloudserver/remote.php/dav/addressbooks/system/system/system/
username - email
Остальные источники синхронизации подхватятся сами.
Решения проблем
Сообщение в dovecot-errors.log типа
Обычно в серверах с большим количеством пользователей
exceeded, disabling. Increase /proc/sys/fs/inotify/max_user_instances
В /etc/sysctl.conf прописать 256 (может и более)
fs.inotify.max_user_instances=256
fs.inotify.max_user_watches=256
Применить
sysctl -p
Или просто
echo 2048 > /proc/sys/fs/inotify/max_user_watches
Imap-login: Warning: Auth process not responting... при большой нагрузке в dovecot
Постепенно тюнить в /etc/dovecot/10-master.conf параметры:
default_process_limit = 1500
default_client_limit = 4000
default_vsz_limit = 1024M
Перманентно пропадают пометки "отвечено"/"переслано" в Microsoft Outlook 2013/2016
Якобы происходит из-за надстроек.
Рекомендуется запустить в безопасном режиме (CTRL+R -> outlook.exe /safe), потом в обычно
Работа с очередью сообщений POSTFIX
#Показать
postqueue -p
#Отправить
postqueue -f
#Очистить
postsuper -d ALL
Добавление Subject (тем письма) в логи (для аналитики)
main.cf:
header_checks = regexp:/etc/postfix/header_checks
header_checks:
/^Subject:/ WARN
Can't locate Mail/SpamAssassin/CompiledRegexps/body_neg2000.pm in @INC (you may need to install the Mail::SpamAssassin::CompiledRegexps::body_neg2000 module)
Сообщение Spamassasin
# Checking if the packages are installed
sudo apt install re2c sa-compile
# Update and compile the SpamAssassin Rules
sa-update
sa-compile
# Restart SpamAssassin service
systemctl restart spamassassin.service
# Check if the error is still present
tail -f /var/log/maillog
tail -f /var/log/mail.err
Мобильное приложение BLUEMAIL не видит персональный календарь, хотя удачно подключилось
(BlueMail can't synhromize with nextcloud CalDAV)
Прописан адрес DAV: https://[nextcloud-instance]/remote.php/dav/
Оно пытается к remote.php/dav/ добавить еще раз remote.php/dav/ -> remote.php/dav/remote.php/dav/
Для сервера на apache2 требуется добавить в конфигурацию virtualhost:
<IfModule mod_rewrite.c>
RewriteEngine on
...
RewriteRule "(.*)remote.php/dav/remote.php.dav(.*)" "$1remote.php/dav$2" [R=301,L]
</IfModule>
Включение PUSH уведомлений в Dovecot
Требуется для различных приложений, которые засыпают
15-lda.conf
protocol lda {
# Space separated list of plugins to load (default is global mail_plugins).
#mail_plugins = $mail_plugins
mail_plugins = $mail_plugins sieve notify push_notification
}
90-plugin.conf:
plugin {
#setting_name = value
# push_notification_driver = dlog
push_notification_driver = ox:url=http://mynotifyserver/push.php
}
99-metadata.conf:
# Store METADATA information within user's Maildir directory
mail_attribute_dict = file:/home/vmail/%d/%n/dovecot-attributes
protocol imap {
imap_metadata = yes
}
Включить metadata для пользователя
doveadm mailbox metadata set -u UserName@example.com -s "" /private/vendor/vendor.dovecot/http-notify user=UserName@example.com
Lisolog / 2022