ALTSOGO

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Содержание

Введение

План

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

Источники

sogo--chapter

sambadc--chapter

PostfixDovecot