ALTSOGO: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Файл main.cf)
(Включение веб-интерфейса)
Строка 380: Строка 380:
 
===Включение веб-интерфейса===
 
===Включение веб-интерфейса===
 
<pre>
 
<pre>
a2enmod proxy
+
 
a2enmod proxy_http
+
for mod in proxy proxy_http authn_core authn_file auth_basic authz_user env dav headers rewrite version setenvif; do a2enmod $mod; done
a2enmod authn_core
 
a2enmod authn_file
 
a2enmod auth_basic
 
a2enmod authz_user
 
a2enmod env
 
a2enmod dav
 
a2enmod headers
 
a2enmod rewrite
 
a2enmod version
 
a2enmod setenvif
 
 
a2ensite SOGo
 
a2ensite SOGo
service httpd2 restart
+
systemctl restart httpd2 sogo
service sogo restart
 
 
</pre>
 
</pre>
  

Версия 23:19, 5 августа 2025

Содержание

План

1. Ставим ALT DC

2. Ставим PostgreSQL сервер

3. Ставим SOGO и настраиваем его на ALT DC и PostgreSQL

4. Настраиваем Postfix и Dovecot на работу с ALT DC

5. Радуемся (наверное)...

Делаем всё на Alt Starterkit GNOME P11, опираясь на документацию от P10 (на момент создания этой статьи для P11 официальной документации не было):

sogo--chapter

sambadc--chapter

PostfixDovecot

Ставим 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_mynetworks, reject_unauth_destination, permit_sasl_authenticated, 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
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


Настройка 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_username_format = %Lu
#auth_gssapi_hostname = "$ALL"
#auth_krb5_keytab = /etc/dovecot/dovecot.keytab
#auth_use_winbind = no
#auth_winbind_helper_path = /usr/bin/ntlm_auth
#auth_failure_delay = 2 secs
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 необходимо настроить аутентификацию в Active Directory для Postfix и Dovecot.

Это предстоит здесь описать, опираясь на документацию здесь