SOGo

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.
Sogo.logo.png

Сервер групповой работы, аналогичный Microsoft Exchange, с веб-интерфейсом и доступом по MAPI для Microsoft Outlook

Внимание! MAPI через HTTPS не поддерживается. {{#ev:youtube|1hcBSB4Kxww}}

Возможности

  • Общие почтовые папки, календари и адресные книги;
  • Веб-интерфейс, аналогичный Outlook Web Access;
  • Поддержка протоколов CalDAV, CardDAV, GroupDAV, Microsoft ActiveSync, IMAPS и SMTPS;
  • Доступ по MAPI (но не через HTTPS) для Microsoft Outlook, не требующий внешних модулей;
  • Делегирование, резервирование, уведомления, поддержка категорий и почтовых фильтров;
  • Поддержка нескольких почтовых ящиков в веб-интерфейсе;
  • SSO через CAS, WebAuth или Kerberos.

Установка

Веб-интерфейс

После настройки и запуска страница SOGo будет доступна по адресу:

С апачем

Подробнее здесь.

  1. Для версии SOGo, доступной в стабильных p9/10/11 и нестабильном Sisyphus (клиент PostgreSQL и прочее нужное будет установлено автоматически):
    apt-get install task-sogo
  2. Добавить и задействовать недостающие модули:
    LIST=(
        dav env ssl
        proxy proxy_http
        headers rewrite setenvif version
        auth_basic authn_core authn_file authz_user
    ) 
    for MOD in ${LIST[@]}; do
        a2enmod $MOD && {
            [ -L /etc/httpd2/conf/mods-enabled/$MOD.load ] ||
            ln -s ../mods-available/$MOD.load /etc/httpd2/conf/mods-enabled/
        }
    done
    a2ensite SOGo && {
        [ -L /etc/httpd2/conf/sites-enabled/SOGo.conf ] ||
        ln -s ../sites-available/SOGo.conf /etc/httpd2/conf/sites-enabled/
    }
    

С энджи

Легковесней, шустрее и проще в настройке, чем апач.

  1. Установить нужные пакеты:
    apt-get install -y angie dovecot-pigeonhole memcached postfix-dovecot postfix-ldap postfix-tls postgresql16-server sogo-activesync sogo-tool
  2. Добавить конфиг для SOGo:
/etc/angie/http.d/sogo.conf  
server {
    listen 80 default_server;
    server_name mail.test.alt;
    # Redirect all HTTP to HTTPS:
    return 301 https://$host$request_uri/SOGo;
}
server {
    listen 443 ssl;
    ssl_certificate     /etc/letsencrypt/sogo/sogo.pem;
    ssl_certificate_key /etc/letsencrypt/sogo/sogo.pem;
    server_name mail.test.alt;
    server_tokens off;
    root /usr/lib64/GNUstep/SOGo/WebServerResources/;
    client_max_body_size 100M;
    index index.php index.html index.htm;
    autoindex off;
    ssl_session_cache shared:SSL:10m;
    ssl_prefer_server_ciphers on;
#   optional ssl_stapling on;
#   optional ssl_stapling_verify on;
#   optional ssl_trusted_certificate /etc/ssl/private/cacert-staplin.pem;
#   optional resolver 8.8.4.4 8.8.8.8 valid=300s;
#   optionalresolver_timeout 10s;
#   optional ssl_dhparam /etc/ssl/certs/dhparam.pem;
#   optional add_header Strict-Transport-Security max-age=63072000;
#   optional add_header X-Frame-Options DENY;
#   optional add_header X-Content-Type-Options nosniff;
    location = / {
        rewrite ^ https://$server_name/SOGo;
        allow all;
    }
    location = /principals/ {
        rewrite ^ https://$server_name/SOGo/dav;
        allow all;
    }
    location ^~/SOGo {
        proxy_pass http://127.0.0.1:20000;
        proxy_redirect http://127.0.0.1:20000 default;
        # forward user's IP address
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header x-webobjects-server-protocol HTTP/1.0;
        proxy_set_header x-webobjects-remote-host 127.0.0.1;
        proxy_set_header x-webobjects-server-name $server_name;
        proxy_set_header x-webobjects-server-url $scheme://$host;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
        client_max_body_size 50m;
        client_body_buffer_size 128k;
        break;
    }
    location /SOGo.woa/WebServerResources/ {
        alias /usr/lib64/GNUstep/SOGo/WebServerResources/;
        allow all;
    }
    location /SOGo/WebServerResources/ {
        alias /usr/lib64/GNUstep/SOGo/WebServerResources/;
        allow all;
    }
#   location ^/SOGo/so/ControlPanel/Products/([^/]*)/Resources/(.*)$ {
#       alias /usr/lib64/GNUstep/SOGo/$1.SOGo/Resources/$2;
#   }
#   location ^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$ {
#       alias /usr/lib64/GNUstep/SOGo/$1.SOGo/Resources/$2;
#   }
}

Подготовка среды

СУБД

  1. См. предварительную подготовку к запуску PostgreSQL.
  2. Создадим на локальном узле 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
    

Почтовые службы

Для подключения к электронной почте следует настроить аутентификацию Postfix и Dovecot из Active Directory.

Настройки клиентов[1]
Шифрование SSL/TLS
SMTPS 465
IMAPS 993

Sieve

«Сито» — это пользовательский фильтр сообщений, работающий не в пределах почтового клиента, а непосредственно на сервере. Настраивается админом через конфиги Dovecot и становится доступен пользователям из почтового клиента или веб-надстроек типа «ШароКуба» (RoundCube), но в случае с SOGo всё несколько сложнее[2].

Почтовые адреса из Active Directory

  1. См. предварительное создание домена на контроллере Samba DC и безопасное подключение к нему.
  2. Создадим доменного пользователя sogo с бессрочным паролем Pa$$word (при запросе ввести его дважды):
     samba-tool user create sogo
     samba-tool user setexpiry --noexpiry sogo
    

Рассылки

Для объединения в простые списки рассылки разрозненных пользователей и групп безопасности, не связанных правами и допусками, закреплёнными за их подразделениями, можно добавлять их в группы типа distribution — то есть, «рассылки» (в ADMC) или «распространения» (в RSAT).

При этом сами группы безопасности с заданным атрибутом mail тоже работают такими списками.

Обеим разновидностям групп можно добавлять в т.ч. псевдонимы (см. ниже).

Псевдонимы[3]

Штатно управление ими производится через LDAP-атрибут proxyAddresses в виде smtp:alias@domain.zone, где smtp — обязательно строчными буквами (возможен вариант с атрибутом otherMailbox в формате alias@domain.zone, но он только для пользователей).

При этом следует учитывать, что при добавлении псевдонимов к списку proxyAddresses, в нём уже должен присутствовать основной адрес из атрибута mail, но с префиксом SMTP — заглавными: именно по этому признаку на него перенаправляются письма, адресованные другим псевдонимам из списка.

По настройке псевдонимов для Postfix см. содержимое файлов /etc/postfix/ad_*.cf, а для Dovecot — файл /etc/dovecot/dovecot-ldap.conf.ext.

Внимание! Псевдонимы не должны повторяться или дублировать реальные адреса.

Если в качестве псевдонимов предполагается задавать не только внутренние адреса, то основным — как и в атрибуте mail — нужно указывать именно внешний (см. ниже пример с ldbedit) :

  • Изменить запись в AD из командной строки Linux можно добавлением недостающего либо по сети:
    $ ldapmodify -H ldap://dc.test.alt -D CN=Administrator,CN=Users,DC=test,DC=alt -w Pa$$word
    dn: CN=petrov,CN=Users,DC=test,DC=alt
    changetype: modify
    add: proxyAddresses
    proxyAddresses: SMTP:petrov@test.alt
    proxyAddresses: smtp:petrovAN@test.alt
    
    ...либо на контроллере домена — правкой в предпочитаемом редакторе (задаётся переменной $EDITOR):
    # ldbedit -H /var/lib/samba/private/sam.ldb '(samaccountname=administrator)'
    ...
    mail: administrator@domain.tld
    proxyAddresses: SMTP:administrator@domain.tld
    proxyAddresses: smtp:postmaster@domain.tld
    proxyAddresses: smtp:postmaster@test.alt
    proxyAddresses: smtp:administrator@test.alt
    
  • Через Windows RSAT:
    1. Включить «Дополнительные параметры» в меню «Вид» оснастки Active Directory.
    2. Каталог домена ⇾ Папка юзеров или групп ⇾ ПКМ на юзере/группе ⇾ Свойства ⇾ Вкладка «Редактор атрибутов» ⇾ Атрибут «proxyAddresses».

SOGo

Настройка и запуск

/etc/sogo/sogo.conf  
{
/* Основное */
    SxVMemLimit = 384;
    SOGoMailDomain = test.alt;
    SOGoCalendarDefaultRoles = (
        PublicDAndTViewer,
        ConfidentialDAndTViewer
    );
/* Региональное */
    SOGoLanguage = Russian;
    SOGoTimeZone = Europe/Moscow;
    SOGoFirstDayOfWeek = 1;
/* Веб-морда */
    SOGoPageTitle = SOGo;
    SOGoForwardEnabled = YES;
    SOGoVacationEnabled = YES;
    SOGoMailCustomFromEnabled = YES;
    SOGoMailAuxiliaryUserAccountsEnabled = YES;
//  SOGoTrustProxyAuthentication = NO;
//  SOGoXSRFValidationEnabled = NO;
/* Подключение к БД (postgresql://, mysql:// или oracle://).
NB! Для переключения между блоками локальных и сетевых настроек убрать/поставить '/'
    в начале блока ниже и сохраниться: '//*' - работает первый блок, '/*' - второй.*/
//* Системный юникс-сокет:
    SOGoProfileURL = "postgresql://sogo@/sogo/sogo_user_profile";
    OCSAdminURL = "postgresql://sogo@/sogo/sogo_admin";
    OCSFolderInfoURL = "postgresql://sogo@/sogo/sogo_folder_info";
    OCSSessionsFolderURL = "postgresql://sogo@/sogo/sogo_sessions_folder";
    OCSEMailAlarmsFolderURL = "postgresql://sogo@/sogo/sogo_alarms_folder";
/*/// Подключение по сети:
    SOGoProfileURL = "postgresql://sogo:sogo@localhost:5432/sogo/sogo_user_profile";
    OCSAdminURL = "postgresql://sogo:sogo@localhost:5432/sogo/sogo_admin";
    OCSFolderInfoURL = "postgresql://sogo:sogo@localhost:5432/sogo/sogo_folder_info";
    OCSSessionsFolderURL = "postgresql://sogo:sogo@localhost:5432/sogo/sogo_sessions_folder";
    OCSEMailAlarmsFolderURL = "postgresql://sogo:sogo@localhost:5432/sogo/sogo_alarms_folder";
/*/
/* Оповещения */
//  SOGoAppointmentSendEMailNotifications = NO;
//  SOGoACLsSendEMailNotifications = NO;
//  SOGoFoldersSendEMailNotifications = NO;
    SOGoEnableEMailAlarms = YES;
/* Файлы и папки */
    WOPidFile = /run/sogo/sogo.pid;
// Перенацеливание следующей опции на юникс-сокет ведёт к ошибке вида:
// "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY"
    SOGoMemcachedHost = localhost;
//  SOGoMemcachedHost = /run/memcached/memcached.sock;
    SOGoMailSpoolPath = /var/spool/sogo;
    SOGoDraftsFolderName = Drafts;
    SOGoJunkFolderName = Junk;
    SOGoSentFolderName = Sent;
    SOGoTrashFolderName = Trash;
/* SMTP (по переключению блоков см. выше) */
//* Локальный sendmail:
    SOGoMailingMechanism = sendmail;
/*/// Подключение по сети:
    SOGoMailingMechanism = smtp;
    SOGoSMTPServer = "smtps://127.0.0.1";
/*/
/* IMAP */
    NGImap4AuthMechanism = "plain";
    NGImap4ConnectionStringSeparator = "/";
//* Отключить одноранговую проверку на локалхосте:
//  SOGoIMAPServer = "imap://127.0.0.1:143/?tls=YES&tlsVerifyMode=allowInsecureLocalhost";
    SOGoIMAPServer = "imaps://localhost:993/?tlsVerifyMode=allowInsecureLocalhost";
/*/// или без танцев (по переключению блоков см. выше):
    SOGoIMAPServer = imaps://localhost:993;
/*/
/* Сито (требуется доп. настройка Dovecot)*/
//  SOGoSieveScriptsEnabled = YES;
//  SOGoVacationEnabled     = YES;
//  SOGoForwardEnabled      = YES;
//  SOGoSieveServer         = sieve://127.0.0.1:4190;
    /* или */
//  SOGoSieveServer         = sieve://127.0.0.1:4190/?tls=YES;
//  SOGoSieveServer         = "sieve://127.0.0.14190/?tls=YES&tlsVerifyMode=allowInsecureLocalhost";
/* Аутентификация */
//  SOGoSuperUsernames = (ivanov, petrov); // Это массив, скобки обязательны!
    SOGoForceExternalLoginWithEmail = NO;
//  SOGoPasswordChangeEnabled = YES;
    SOGoUserSources = (
        {
            displayName     = "Вход через AD/Samba4";
            id              = sambaLogin;
            type            = ldap;
            hostname        = "ldaps://dc.test.alt ldaps://127.0.0.1";
            baseDN          = "CN=Users,DC=test,DC=alt";
            bindDN          = "CN=sogo,CN=Users,DC=test,DC=alt";
            bindPassword    = "Pa$$word";
            bindFields      = (sAMAccountName);
            canAuthenticate = YES;
            CNFieldName     = cn;
            IDFieldName     = cn;
            UIDFieldName    = sAMAccountName;
        },
        { /* Адреса групп из AD/Samba4 */
            displayName     = "Подразделения";
            id              = directory;
            type            = ldap;
            hostname        = "ldaps://dc.test.alt ldaps://127.0.0.1";
            canAuthenticate = NO;
            CNFieldName     = cn;
            UIDFieldName    = sAMAccountName;
            baseDN          = "CN=Groups,DC=test,DC=alt";
            bindDN          = "CN=sogo,CN=Users,DC=test,DC=alt";
            bindPassword    = "Pa$$word";
            bindFields      = (sAMAccountName, mail);
            canAuthenticate = YES;
            filter          = "mail = '*'";
            isAddressBook   = YES;
        },
        { /* Адреса юзеров из AD/Samba4 */
            displayName     = "Внутренние адреса";
            id              = sambaShared;
            type            = ldap;
            hostname        = "ldaps://dc.test.alt ldaps://127.0.0.1";
            baseDN          = "CN=Users,DC=test,DC=alt";
            bindDN          = "CN=sogo,CN=Users,DC=test,DC=alt";
            bindPassword    = "Pa$$word";
            canAuthenticate = NO;
            isAddressBook   = YES;
            CNFieldName     = cn;
            IDFieldName     = mail;
            UIDFieldName    = mail;
            filter = "(
                (NOT isCriticalSystemObject='TRUE') AND
                (NOT objectClass=contact) AND
                (mail='*')
            )";
        },
        { /* Контакты из AD/Samba4 */
            displayName     = "Общие контакты";
            id              = sambaContacts;
            type            = ldap;
            hostname        = "ldaps://dc.test.alt ldaps://127.0.0.1";
            baseDN          = "CN=Users,DC=test,DC=alt";
            bindDN          = "CN=sogo,CN=Users,DC=test,DC=alt";
            bindPassword    = "Pa$$word";
            canAuthenticate = NO;
            isAddressBook   = YES;
            CNFieldName     = cn;
            IDFieldName     = mail;
            UIDFieldName    = mail;
            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");
            };
        }
    );
    WOLogFile = -;// исходно задаётся в юните службы
/* Для детальной диагностики раскомментировать нижеследующий блок, добавив '/' в начало этой строки.
    GCSFolderDebugEnabled = YES;
    GCSFolderStoreDebugEnabled = YES;
    ImapDebugEnabled = YES;
    LDAPDebugEnabled = YES;
//  MySQL4DebugEnabled = YES;
    PGDebugEnabled = YES;
    NGImap4DisableIMAP4Pooling = YES;
    OCSFolderManagerSQLDebugEnabled = YES;
    SoClassRegistryDebugEnabled  = YES;
    SoDebugBaseURL = YES;
    SoDebugKeyLookup  = YES;
    SoDebugObjectTraversal = YES;
    SoDebugProductLoading  = YES;
    SoDebugProductRegistry  = YES;
    SoDebugRequestClassification  = YES;
    SoDebugTraversal  = YES;
    SOGoDebugRequests = YES;
    SOGoEASDebugEnabled = YES;
    SOGoMailKeepDraftsAfterSend = YES;
    SOGoUIxDebugEnabled = YES;
    SoLogSecurityDeclarations  = YES;
    SoObjCClassDebugEnabled  = YES;
    SoObjectDataSourceDebugEnabled  = YES;
    SoObjectMethodDispatcherDebugEnabled  = YES;
    SoObjectRequestHandlerDebugEnabled  = YES;
    SoObjectSOAPDispatcherDebugEnabled  = YES;
    SoOFSDebugAuthLookup  = YES;
    SoOFSDebugFactory  = YES;
    SoOFSDebugNegotiate  = YES;
    SoOFSDebugPlistObject  = YES;
    SoOFSDebugRestore  = YES;
    SoOFSResourceManagerDebugEnabled  = YES;
    SoOFSWebMethodDebugEnabled  = YES;
    SoPageInvocationDebugEnabled  = YES;
    SoProductResourceManagerDebugEnabled  = YES;
    SoRedirectToDefaultMethods  = YES;
    SoRendererDebugEnabled  = YES;
    SoSecurityManagerDebugEnabled  = YES;
    SoSecurityManagerDebugEnabled = YES;
    WODebugZipResponse = YES;
    WODontZipResponse = YES;
    WOIsRedirectionEnabled  = YES;
//*/
}

Приведя конфиг SOGo к вышеозначенному виду...

  1. Проверить его целостность:
    plparse /etc/sogo/sogo.conf
    Parsing '/etc/sogo/sogo.conf' - a dictionary
    
  2. Включить/перезапустить нужные службы, где <web-server> — либо httpd2, либо angie:
    for ACT in enable restart; do
        systemctl $ACT samba postgresql memcached sogo <web-server>
    done
    
  3. Диагностику и отладочные сообщения отслеживать через журнал /var/log/sogo/sogo.log.
    Для перенаправления их в syslog:
    • Создать файл /etc/systemd/system/sogo.service.d/syslog.conf со следующим содержимым:
      [Service]
      ExecStart =
      ExecStart = /usr/sbin/sogod -WONoDetach YES -WOWorkersCount ${PREFORK} -WOPidFile /run/sogo/sogo.pid
      
    • В приведённом выше конфиг-файле присвоить директиве WOLogFile дефис в качестве значения.
    • Перезапустить службу.

Советы

Для отображения полного списка адресов (но не псевдонимов) в адресных книгах, завязанных на ЛДАП-каталог, достаточно в строке поиска такой книги («Внутренние адреса», «Подразделения» и т.п.) всего лишь поставить точку.

Решение проблем

  1. Для правильной работы SOGo на клиентских устройствах нужна актуальная база часовых поясов. Особенно это касается устройств под управлением iOS и macOS.
  2. Если при входе в веб-интерфейс выводится «Неправильный логин или пароль» (хотя учётные данные верны), а в логах присутствуют ошибки вида:
    Feb 03 14:39:18 sogod [17543]: [ERROR] <0x0x55d2461cafe0[LDAPSource]> Could not bind to the LDAP server ldaps://127.0.0.1 (389) using the bind DN: CN=sogo,CN=Users,DC=test,DC=alt
    Feb 03 14:39:18 sogod [17543]: [ERROR] <0x0x55d2461cafe0[LDAPSource]> <NSException: 0x55d2463f43b0> NAME:LDAPException REASON:operation bind failed: Can't contact LDAP server  (0xFFFFFFFF) INFO:{"error_code" = "-1"; login = "CN=sogo,CN=Users,DC=test,DC=alt"; }
    
    ...имеет смысл перезапустить службу samba на контроллерах домена, выключиив в /etc/samba/smb.conf опцию строгой аутентификации:
    [global]
    ...
    ldap server require strong auth = no
    

Примечания

  1. Ввиду использования SSL/TLS по обоим протоколам, порты IMAP/TLS (143) и Submission (587) настраивать не обязательно. Возможно, дополню описание в процессе освоения тематики.
  2. Дополню раздел по мере изучения вопроса.
  3. Единственное, что пока не удаётся — отображение реальных имён/адресов при наборе псевдонима в адресе создаваемого сообщения и в поиске через адресные книги..

Источники