SOGo
Сервер групповой работы, аналогичный Microsoft Exchange, с веб-интерфейсом и доступом по MAPI для Microsoft Outlook
{{#ev:youtube|1hcBSB4Kxww}}
- Сайт: http://www.sogo.nu
- Лицензия: GPLv2 и LGPLv2
Возможности
- Общие почтовые папки, календари и адресные книги;
- Веб-интерфейс, аналогичный Outlook Web Access;
- Поддержка протоколов CalDAV, CardDAV, GroupDAV, Microsoft ActiveSync, IMAPS и SMTPS;
- Доступ по MAPI (но не через HTTPS) для Microsoft Outlook, не требующий внешних модулей;
- Делегирование, резервирование, уведомления, поддержка категорий и почтовых фильтров;
- Поддержка нескольких почтовых ящиков в веб-интерфейсе;
- SSO через CAS, WebAuth или Kerberos.
Установка
Веб-интерфейс
После настройки и запуска страница SOGo будет доступна по адресу:
- http://адрес.сервера/SOGo/ — через апач, или
- http://адрес.сервера/ — через энджи, который переадресует на шифрованный https://адрес.сервера/SOGo/.
С апачем
Подробнее здесь.
- Для версии SOGo, доступной в стабильных p9/10/11 и нестабильном Sisyphus (клиент PostgreSQL и прочее нужное будет установлено автоматически):
- apt-get install task-sogo
- Добавить и задействовать недостающие модули:
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/ }
С энджи
Легковесней, шустрее и проще в настройке, чем апач.
- Установить нужные пакеты:
- apt-get install -y angie dovecot-pigeonhole memcached postfix-dovecot postfix-ldap postfix-tls postgresql16-server sogo-activesync sogo-tool
- Добавить конфиг для 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;
# }
}
|
Подготовка среды
СУБД
- См. предварительную подготовку к запуску 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
Почтовые службы
Для подключения к электронной почте следует настроить аутентификацию Postfix и Dovecot из Active Directory.
| Настройки клиентов[1] | |
|---|---|
| Шифрование | SSL/TLS |
| SMTPS | 465 |
| IMAPS | 993 |
Sieve
«Сито» — это пользовательский фильтр сообщений, работающий не в пределах почтового клиента, а непосредственно на сервере. Настраивается админом через конфиги Dovecot и становится доступен пользователям из почтового клиента или веб-надстроек типа «ШароКуба» (RoundCube), но в случае с SOGo всё несколько сложнее[2].
Почтовые адреса из Active Directory
- См. предварительное создание домена на контроллере Samba DC и безопасное подключение к нему.
- Создадим доменного пользователя
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:
- Включить «Дополнительные параметры» в меню «Вид» оснастки Active Directory.
- Каталог домена ⇾ Папка юзеров или групп ⇾ ПКМ на юзере/группе ⇾ Свойства ⇾ Вкладка «Редактор атрибутов» ⇾ Атрибут «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 к вышеозначенному виду...
- Проверить его целостность:
plparse /etc/sogo/sogo.conf Parsing '/etc/sogo/sogo.conf' - a dictionary
- Включить/перезапустить нужные службы, где <web-server> — либо
httpd2, либоangie:for ACT in enable restart; do systemctl $ACT samba postgresql memcached sogo <web-server> done
- Диагностику и отладочные сообщения отслеживать через журнал /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 дефис в качестве значения.
- Перезапустить службу.
- Создать файл /etc/systemd/system/sogo.service.d/syslog.conf со следующим содержимым:
- Для перенаправления их в
Советы
Для отображения полного списка адресов (но не псевдонимов) в адресных книгах, завязанных на ЛДАП-каталог, достаточно в строке поиска такой книги («Внутренние адреса», «Подразделения» и т.п.) всего лишь поставить точку.
Решение проблем
- Для правильной работы SOGo на клиентских устройствах нужна актуальная база часовых поясов. Особенно это касается устройств под управлением iOS и macOS.
- Если при входе в веб-интерфейс выводится «Неправильный логин или пароль» (хотя учётные данные верны), а в логах присутствуют ошибки вида:
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
Примечания
- ↑ Ввиду использования SSL/TLS по обоим протоколам, порты IMAP/TLS (143) и Submission (587) настраивать не обязательно. Возможно, дополню описание в процессе освоения тематики.
- ↑ Дополню раздел по мере изучения вопроса.
- ↑ Единственное, что пока не удаётся — отображение реальных имён/адресов при наборе псевдонима в адресе создаваемого сообщения и в поиске через адресные книги..