ALTSOGO
Содержание
Введение
План
1. Ставим ALT DC
2. Ставим PostgreSQL сервер
3. Ставим SOGO и настраиваем его на ALT DC и PostgreSQL
4. Настраиваем Postfix и Dovecot на работу с ALT DC
5. Радуемся (наверное)...
Делаем всё на Alt Starterkit GNOME P11, опираясь на документацию от P10 (на момент создания этой статьи для P11 официальной документации не было).
Ставим ALT DC
После обновления системы и ядра...
Выставляем часовой пояс и синхронизируем время
timedatectl set-timezone Europe/Moscow ntpdate pool.ntp.org
Отключаем сервисы и устанавливаем необходимые пакеты
for service in smb nmb; do systemctl disable $service; systemctl stop $service; done apt-get install -y task-samba-dc admc
Подготовка конфигурационных файлов ситемы
Задаём имя хоста
hostnamectl set-hostname dc.domain.alt
Также проверить и при необходимости поправить имя хоста в файле
/etc/sysconfig/network
Перезагрузиться для проверки
reboot
Далее настраиваем 127.0.0.1 в качестве DNS сервера системы (далее в команде создания домена мы добавим возможность для этого DNS сервера делать запросы к внешним DNS серверам)
cat << EOF > /etc/resolv.conf search alt nameserver 127.0.0.1 EOF
Здесь приведена команда конфигурирования файла /etc/hosts, исходя из того, что у настраиваемого сервера локальный IP-адрес: 192.168.1.246
cat << EOF > /etc/hosts 192.168.1.246 dc.domain.alt domain.alt 127.0.0.1 localhost EOF
Создание домена одной командой
Перед выполнением команды создания домена нужно удалить конфигурационный файл:
/bin/rm -rf /etc/samba/smb.conf /var/lib/samba /var/cache/samba mkdir -p /var/lib/samba/sysvol
Для домена
domain.alt
с паролем
Pa$$word
и адресом внешнего DNS сервера
8.8.8.8
команда создания домена будет такой:
samba-tool domain provision --realm=domain.alt --domain domain --adminpass='Pa$$word' --dns-backend=SAMBA_INTERNAL --server-role=dc --option="dns forwarder=8.8.8.8"
Включение сервиса и проверка работы домена
Включение
systemctl enable --now samba
Проверка
samba-tool domain info 127.0.0.1
В ответ должно прилететь что-то типа этого:
Forest : domain.alt Domain : domain.alt Netbios domain : DOMAIN DC name : dc.domain.alt DC netbios name : DC Server site : Default-First-Site-Name Client site : Default-First-Site-Name
Настройка Kerberos
/bin/cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
Запуск ADMC
ADMC -- графическая утилита. Поэтому желательно на сервере иметь графику.
В этой статье контроллер домена развёртывается на базе Alt Starterkit GNOME P11, поэтому с наличием графики проблем нет (да и кого волнует в 21 веке лишние пару сотен мегабайт на диске виртуальной машины).
Для корректной работы приложения ADMC необходимо получить билет Kerberos командой
kinit Administrator
В ответ необходимо ввести пароль от доменного администратора.
ВАЖНО! Иногда стоит эту команду вводить вручную, а не полагаться на написанный скрипт (про скрипт буквально ченез несколько строчек ниже будет), поскольку
иногда утилита
kinit
предупреждает об устаревании пароля и необходимости его поменять. Также не забываем после смены пароля изменять его в скрипте...
Собственно, про скрипт: Чтобы это автоматизировать, можно, например, сделать скрипт автоматического запуска ADMC.
В примере создаётся скрипт в файле
/opt/admc.sh
для запуска ADMC с получением билета для пользователя
Administrator с паролем
Pa$$word
Пример heredoc-команды:
cat << 'EOF' > /opt/admc.sh #!/bin/bash echo 'Pa$$word' | kinit Administrator admc EOF
chmod +x /opt/admc.sh
Ставим PostgreSQL сервер
Установка
apt-get install -y postgresql17-server postgresql17-contrib
Первоначальный запуск
/etc/init.d/postgresql initdb
ВНИМАНИЕ!
Два последующих конфигурационных файла будут созданы без лишних комментариев внутри только для ускорения процесса демонстрации. Поэтому предварительно для них будут созданы резервные копии, в которые настоятельно рекомендуется хотя-бы один раз заглянуть, чтобы понять, что параметров значительно больше чем необходимых и достаточных для работы!
Делаем резервные копии
cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.backup cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.backup
Далее используем heredoc-синтаксис, потому что мы ленивы и прагматичны...
cat << 'EOF' > /var/lib/pgsql/data/pg_hba.conf # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 md5 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust EOF
cat << 'EOF' > /var/lib/pgsql/data/postgresql.conf listen_addresses = '*' # what IP address(es) to listen on; max_connections = 100 # (change requires restart) shared_buffers = 128MB # min 128kB dynamic_shared_memory_type = posix # the default is usually the first option max_wal_size = 1GB min_wal_size = 80MB log_destination = 'stderr' # Valid values are combinations of logging_collector = on # Enable capturing of stderr, jsonlog, log_directory = 'log' # directory where log files are written, log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, log_file_mode = 0600 # creation mode for log files, log_rotation_size = 10MB # Automatic rotation of logfiles will log_min_messages = warning # values in order of decreasing detail: log_checkpoints = off log_connections = off log_disconnections = off log_timezone = UTC datestyle = 'iso, mdy' timezone = UTC default_text_search_config = 'pg_catalog.english' EOF
systemctl enable --now postgresql
Создаём пользователя и базу данных для SOGO:
su - postgres -s /bin/sh -c 'createuser --no-superuser --no-createdb --no-createrole sogo' su - postgres -s /bin/sh -c 'createdb -O sogo sogo'
Перезапускаем сервис
systemctl restart postgresql
Проверяем
psql -U sogo sogo -c "\l"
Ставим SOGO и настраиваем его на ALT DC и PostgreSQL
Ставим SOGO
apt-get install -y task-sogo
Настройка Samba DC
Для этого места была настройка контроллера домена, описанная в разделе 1.1 этой статьи.
Итак, создаём в домене пользователя sogo с паролем
Pa$$word
(при запросе дважды ввести пароль):
samba-tool user create sogo samba-tool user setexpiry --noexpiry sogo
Создание конфигурационного файла для SOGO
Сделаем резервную копию старого конфига:
cp /etc/sogo/sogo.conf /etc/sogo/sogo.conf.backup
Здесь конфигурационный файл приведён для домена
domain.alt
Для другого домена рекомендуется в тексте содержимого файла предварительно заменить поочерёдно слова
domain
и
alt
на части необходимого доменного имени.
Также, конфигурационный файл предполагает подключение к домену, работающему на
127.0.0.1
под пользователем
sogo
с паролем
Pa$$word
Исходя из этого, можно скорректировать текст конфигурационного файла при необходимости!
Создать файл одной heredoc-командой:
cat << 'EOF' > /etc/sogo/sogo.conf { SOGoProfileURL = "postgresql://sogo@/sogo/sogo_user_profile"; OCSFolderInfoURL = "postgresql://sogo@/sogo/sogo_folder_info"; OCSSessionsFolderURL = "postgresql://sogo@/sogo/sogo_sessions_folder"; OCSEMailAlarmsFolderURL = "postgresql://sogo@/sogo/sogo_alarms_folder"; SOGoEnableEMailAlarms = YES; SOGoDraftsFolderName = Drafts; SOGoSentFolderName = Sent; SOGoTrashFolderName = Trash; SOGoIMAPServer = "imaps://localhost:993/?tlsVerifyMode=allowInsecureLocalhost"; SOGoMailingMechanism = sendmail; SOGoForceExternalLoginWithEmail = NO; NGImap4ConnectionStringSeparator = "/"; SOGoUserSources = ( { id = sambaLogin; displayName = "SambaLogin"; canAuthenticate = YES; type = ldap; CNFieldName = cn; IDFieldName = cn; UIDFieldName = sAMAccountName; hostname = "ldaps://127.0.0.1"; baseDN = "CN=Users,DC=domain,DC=alt"; bindDN = "CN=sogo,CN=Users,DC=domain,DC=alt"; bindPassword = "Pa$$word"; bindFields = (sAMAccountName); }, { id = sambaShared; displayName = "Shared Addressbook"; canAuthenticate = NO; isAddressBook = YES; type = ldap; CNFieldName = cn; IDFieldName = mail; UIDFieldName = mail; hostname = "ldaps://127.0.0.1"; baseDN = "CN=Users,DC=domain,DC=alt"; bindDN = "CN=sogo,CN=Users,DC=domain,DC=alt"; bindPassword = "Pa$$word"; filter = "((NOT isCriticalSystemObject='TRUE') AND (mail='*') AND (NOT objectClass=contact))"; }, { id = sambaContacts; displayName = "Shared Contacts"; canAuthenticate = NO; isAddressBook = YES; type = ldap; CNFieldName = cn; IDFieldName = mail; UIDFieldName = mail; hostname = "ldaps://127.0.0.1"; baseDN = "CN=Users,DC=domain,DC=alt"; bindDN = "CN=sogo,CN=Users,DC=domain,DC=alt"; bindPassword = "Pa$$word"; filter = "((((objectClass=person) AND (objectClass=contact) AND ((uidNumber>=2000) OR (mail='*'))) AND (NOT isCriticalSystemObject='TRUE') AND (NOT showInAdvancedViewOnly='TRUE') AND (NOT uid=Guest)) OR (((objectClass=group) AND (gidNumber>=2000)) AND (NOT isCriticalSystemObject='TRUE') AND (NOT showInAdvancedViewOnly='TRUE')))"; mapping = { displayname = ("cn"); }; } ); SOGoSieveScriptsEnabled = YES; SOGoLanguage = Russian; SOGoTimeZone = Europe/Moscow; SOGoFirstDayOfWeek = 1; } EOF
Включение и перезапуск служб
for service in samba postgresql memcached sogo httpd2; do systemctl enable $service; systemctl restart $service; done
Где смотреть ошибки?
Возможные ошибки будут записаны в файл журнала
/var/log/sogo/sogo.log
Включение веб-интерфейса
for mod in proxy proxy_http authn_core authn_file auth_basic authz_user env dav headers rewrite version setenvif; do a2enmod $mod; done a2ensite SOGo systemctl restart httpd2 sogo
Проверка доступности веб-интерфейса: http://адрес_сервера/SOGo/
Каким пользователем заходить в веб-интерфейс?
Входить пользователями домена. Добавлять их через ADMC или через консольную утилиту (обязательно заполнять у пользователей поле с электропочтой!).
Настройка электронной почты
Донастройка SambaDC
Доступ к серверу LDAP осуществляется по протоколу ldap без шифрования.
Для SambaDC отключаем обязательный ldaps. Для этого в файле
/etc/samba/smb.conf
в секцию
[global]
добавляем параметр
ldap server require strong auth = no
Рестартуем сервис
systemctl restart samba
Создание пользователя в Active Directory
Создаём пользователя vmail с не истекающей учётной записью и паролем
Pa$$word
(пароль нужно будет два раза ввести после выполнения первой команды):
samba-tool user create -W Users vmail samba-tool user setexpiry vmail --noexpiry
Настройка Postfix
Устанавливаем пакет
apt-get install -y postfix-ldap
Делаем резервные копии конфигурационных файлов
cd /etc/postfix
cp main.cf main.cf.backup cp master.cf master.cf.backup
Настраиваем конфигурационные файлы heredoc-командами, исходя из названия домена
domain.alt
Файл main.cf
cat << 'EOF' > main.cf # Global Postfix configuration file. This file lists only a small subset # of all parameters. For the syntax, and for a complete parameter list, # see the postconf(5) manual page. For a commented and more complete # version of this file see /etc/postfix/main.cf.dist mailbox_command = /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT" inet_protocols = ipv4 # Mappings virtual_mailbox_base = /var/mail virtual_mailbox_domains = domain.alt virtual_mailbox_maps = ldap:/etc/postfix/ad_local_recipients.cf virtual_alias_maps = ldap:/etc/postfix/ad_mail_groups.cf virtual_transport = dovecot local_transport = virtual local_recipient_maps = $virtual_mailbox_maps # SSL/TLS smtpd_use_tls = yes smtpd_tls_security_level = encrypt #smtpd_tls_security_level = may smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = domain.alt smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot smtpd_sender_login_maps = ldap:/etc/postfix/ad_sender_login.cf smtpd_tls_auth_only = yes smtpd_tls_cert_file = /var/lib/ssl/certs/dovecot.cert smtpd_tls_key_file = /var/lib/ssl/private/dovecot.key smtpd_tls_CAfile = /var/lib/ssl/certs/dovecot.pem smtpd_recipient_restrictions = permit_sasl_authenticated, permit_auth_destination, reject smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch default_destination_recipient_limit = 1 EOF
Файл master.cf
cat << 'EOF' > master.cf # # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master" or # on-line: http://www.postfix.org/master.5.html). # # Do not forget to execute "service postfix reload" after editing this file. # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== pickup fifo n - y 60 1 pickup cleanup unix n - y - 0 cleanup qmgr fifo n - y 300 1 qmgr tlsmgr unix - - y 1000? 1 tlsmgr rewrite unix - - y - - trivial-rewrite bounce unix - - y - 0 bounce defer unix - - y - 0 bounce trace unix - - y - 0 bounce verify unix - - y - 1 verify flush unix n - y 1000? 0 flush proxymap unix - - n - - proxymap proxywrite unix - - n - 1 proxymap smtp unix - - y - - smtp relay unix - - y - - smtp -o syslog_name=postfix/$service_name showq unix n - y - - showq error unix - - y - - error retry unix - - y - - error discard unix - - y - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - y - - lmtp anvil unix - - y - 1 anvil scache unix - - y - 1 scache postlog unix-dgram n - y - 1 postlogd # ==================================================================== # Interfaces to non-Postfix software. Be sure to examine the manual # pages of the non-Postfix software to find out what options it wants. # # Many of the following services use the Postfix pipe(8) delivery # agent. See the pipe(8) man page for information about ${recipient} # and other message envelope options. # ==================================================================== filter unix - n n - 10 pipe flags=Rq user=_filter argv=content-filter -f ${sender} -- ${recipient} dovecot unix - n n - - pipe flags=DRhu user=mail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient} smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject smtp inet n - n - - smtpd -o smtpd_sasl_auth_enable=no -o smtpd_tls_security_level=may -o smtpd_client_restrictions=permit_mynetworks,reject_unauth_destination EOF
Файл ad_local_recipients.cf
cat << 'EOF' > ad_local_recipients.cf version = 3 server_host = domain.alt:389 search_base = dc=domain,dc=alt scope = sub query_filter = (&(|(mail=%s)(otherMailbox=%u@%d))(sAMAccountType=805306368)) result_filter = %s result_attribute = mail special_result_attribute = member bind = yes bind_dn = cn=vmail,cn=users,dc=domain,dc=alt bind_pw = Pa$$word EOF
Файл ad_mail_groups.cf
cat << 'EOF' > ad_mail_groups.cf version = 3 server_host = domain.alt:389 search_base = dc=domain,dc=alt timeout = 3 scope = sub query_filter = (&(mail=%s)(sAMAccountType=268435456)) result_filter = %s leaf_result_attribute = mail special_result_attribute = member bind = yes bind_dn = cn=vmail,cn=users,dc=domain,dc=alt bind_pw = Pa$$word EOF
Файл ad_sender_login.cf
cat << 'EOF' > ad_sender_login.cf version = 3 server_host = domain.alt:389 search_base = dc=domain,dc=alt scope = sub query_filter = (&(objectClass=user)(|(sAMAccountName=%s)(mail=%s))) result_attribute = mail bind = yes bind_dn = cn=vmail,cn=users,dc=domain,dc=alt bind_pw = Pa$$word EOF
Включаем и перезагружаем сервис
systemctl enable --now postfix service postfix reload
Тестируем работу
Проверка конфигурации Postfix (не должно быть никаких сообщений:
postconf >/dev/null
Прикручиваем подпись писем через OpenDKIM
Настройка Dovecot
Устанавливаем пакет
apt-get install -y dovecot
Делаем резервные копии конфигурационных файлов
cd /etc/dovecot/conf.d cp 10-auth.conf 10-auth.conf.backup cp 10-mail.conf 10-mail.conf.backup cp 10-master.conf 10-master.conf.backup cp 15-lda.conf 15-lda.conf.backup cp 15-mailboxes.conf 15-mailboxes.conf.backup
Настраиваем конфиги посредством heredoc-команд
cd /etc/dovecot
Файл dovecot-ldap.conf.ext
cat << 'EOF' > dovecot-ldap.conf.ext hosts = domain.alt:3268 ldap_version = 3 auth_bind = yes dn = cn=vmail,cn=Users,dc=domain,dc=alt dnpass = Pa$$word base = cn=Users,dc=domain,dc=alt scope = subtree deref = never user_filter = (&(objectClass=user)(|(mail=%Lu)(sAMAccountName=%Lu))) user_attrs = =uid=8,gid=12,mail=user pass_filter = (&(objectClass=user)(|(mail=%Lu)(sAMAccountName=%Lu))) pass_attrs = mail=user EOF
cd /etc/dovecot/conf.d
Файл 10-auth.conf
cat << 'EOF' > 10-auth.conf auth_mechanisms = plain !include auth-ldap.conf.ext EOF
Файл 10-mail.conf
cat << 'EOF' > 10-mail.conf mail_location = maildir:/var/mail/%d/%n:UTF-8:INBOX=/var/mail/%d/%n/Inbox mail_uid = mail mail_gid = mail first_valid_uid = 5 first_valid_gid = 5 EOF
Файл 10-master.conf
cat << 'EOF' > 10-master.conf service imap-login { inet_listener imap { port = 0 } inet_listener imaps { } } service pop3-login { inet_listener pop3 { port = 0 } inet_listener pop3s { port = 0 } } service lmtp { unix_listener lmtp { } } service imap { } service pop3 { } service auth { unix_listener auth-userdb { } unix_listener /var/spool/postfix/private/auth { mode = 0600 user = postfix group = postfix } } service auth-worker { } service dict { unix_listener dict { } } EOF
Файл 15-lda.conf
cat << 'EOF' > 15-lda.conf protocol lda { hostname = domain.alt postmaster_address = administrator@domain.alt } EOF
Файл 15-mailboxes.conf
cat << 'EOF' > 15-mailboxes.conf namespace inbox { inbox = yes mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Trash { auto = subscribe special_use = \Trash } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } } EOF
Файл 10-stats.conf
cat << 'EOF' > 10-stats.conf service stats { unix_listener stats-reader { user = mail group = mail mode = 0660 } unix_listener stats-writer { user = mail group = mail mode = 0660 } } EOF
Включаем и перезагружаем сервис
systemctl enable --now dovecot service dovecot reload
Тестируем работу
Проверка конфигурации Dovecot (не должно быть никаких сообщений):
doveconf >/dev/null
Безопасность
В связи с тем, что конфигурационные файлы содержат пароль пользователя LDAP, их необходимо сделать недоступным для чтения прочим пользователям:
chown dovecot:root /etc/dovecot/dovecot-ldap.conf.ext chmod 0640 /etc/dovecot/dovecot-ldap.conf.ext chown root:postfix /etc/postfix/ad_local_recipients.cf /etc/postfix/ad_mail_groups.cf /etc/postfix/ad_sender_login.cf chmod 0640 /etc/postfix/ad_local_recipients.cf /etc/postfix/ad_mail_groups.cf /etc/postfix/ad_sender_login.cf
Перезапускаем службы:
service dovecot restart service postfix restart
или
systemctl restart dovecot systemctl restart postfix