SOGo est un groupware qui met l’accent sur l’évolutivité et les normes ouvertes. SOGo est publié sous la licence GNU GPL/LGPL v2. SOGo fournit une interface Web riche basée sur AJAX et supporte de multiples clients natifs grâce à l’utilisation de protocoles standards tels que CalDAV, CardDAV et GroupDAV, ainsi que Microsoft ActiveSync.
SOGo est le composant manquant de votre infrastructure ; il se place au milieu de vos serveurs pour offrir à vos utilisateurs une interface uniforme et complète pour accéder à leurs informations. Il a été déployé dans des environnements de production avec des milliers d’utilisateurs.
Table of Contents
Architecture
Un proxy sous Dovecot a été installé afin de permettre aux utilisateurs de se connecter de façon transparente à la messsagerie, qu’ils se trouvent sous Oracle ou sous Exchange.
Création des images Dockers
Afin de toujours avoir les dernières mises à jour, j’ai créé plusieurs images Dockers :
- pmietlicki/sogo:v4 (alias de pmietlicki/sogo:latest) : l’image avec les paquets officiels d’ubuntu, cela vous garantit une version stable et officielle supportée par la communauté, malheureusement dépourvue du composant ActiveSync.
- pmietlicki/sogo:v5 : une image avec les paquets d’un référentiel tiers (http://www.axis.cz/linux/debian) contient le composant ActiveSync mais n’est pas l’image officielle de l’éditeur SOGo.
- pmietlicki/sogo-from-sources : ma dernière image, l’objectif étant d’avoir une image avec la dernière version officielle stable de SOGo, contient le composant ActiveSync. Pour ce faire, l’image récupère les sources, les compile et les déploie sur le système, cela vous garantit d’avoir toujours la dernière version stable de SOGo.
Important : pour avoir les paquets officiels de SOGo (debian, ubuntu, redhat, etc.), il vous faudra un abonnement au support. Cela vous coutera à minima 750$ par an, ce n’est pas cher payé vu la qualité de ce logiciel et son interface Web ergonomique responsive design sous AngularJS.
Configuration
Afin de fédérer nos différentes solutions de messagerie (Oracle, Exchange), il a fallu mettre en place la notion de domaine que l’on retrouve donc à la fois dans la configuration de SOGo mais aussi dans la configuration de Dovecot. L’intérêt est qu’un utilisateur de n’importe quel référentiel (AD, LDAP) puisse se connecter. Ainsi un utilisateur AD, même inexistant dans le LDAP, pourra tout de même utiliser le webmail SOGo.
sogo.conf
{ SOGoProfileURL = "postgresql://sogo:[email protected]:5432/sogotest/sogo_user_profile"; OCSFolderInfoURL = "postgresql://sogo:[email protected]:5432/sogotest/sogo_folder_info"; OCSSessionsFolderURL = "postgresql://sogo:[email protected]:5432/sogotest/sogo_sessions_folder"; OCSEMailAlarmsFolderURL = "postgresql://sogo:[email protected]:5432/sogotest/sogo_alarms_folder"; SOGoLanguage = French; SOGoPageTitle = "Webmail"; SOGoAppointmentSendEMailNotifications = YES; SOGoMailingMechanism = smtp; SOGoSMTPServer = serveur-smtp.domain.local; SOGoTimeZone = Europe/Paris; SOGoIMAPServer = "imaps://proxy-dovecot:143/?tls=YES&tlsVerifyMode=none"; SOGoVacationEnabled = NO; SOGoForwardEnabled = NO; SOGoSieveScriptsEnabled = NO; SOGoFirstDayOfWeek = 0; SOGoMailMessageCheck = manually; SOGoMailAuxiliaryUserAccountsEnabled = YES; SOGoMemcachedHost = memcached.memcached; WOWorkersCount = 128; SOGoMaximumPingInterval = 3540; SOGoMaximumSyncInterval = 3540; SOGoInternalSyncInterval = 60; SOGoDebugRequests = NO; SOGoEASDebugEnabled = NO; ImapDebugEnabled = NO; LDAPDebugEnabled = NO; MySQL4DebugEnabled = NO; PGDebugEnabled = NO; domains = { domain.local = { SOGoMailDomain = mondomaine.fr; SOGoSentFolderName = "Éléments envoyés"; SOGoTrashFolderName = "Éléments supprimés"; SOGoDraftsFolderName = "Brouillons"; SOGoJunkFolderName = "Courrier indésirable"; SOGoUserSources = ( { type = ldap; CNFieldName = cn; IDFieldName = cn; UIDFieldName = userPrincipalName; bindFields = (userPrincipalName, sAMAccountName, mail); baseDN = "DC=nomdomaine,DC=domain,DC=fr"; bindDN = "cn=bind.sogo,ou=Services,dc=nomdomaine,dc=domain,dc=fr"; bindPassword = "*********"; canAuthenticate = YES; displayName = "AD"; hostname = ldap://ad.domain.local; filter = "(objectClass='user')"; scope = SUB; id = ad; isAddressBook = YES; } ); }; mondomaine.fr = { SOGoMailDomain = mondomaine.fr; SOGoSentFolderName = Sent; SOGoTrashFolderName = Trash; SOGoDraftsFolderName = Drafts; SOGoJunkFolderName = Spam; SOGoUserSources = ( { type = ldap; CNFieldName = cn; UIDFieldName = uid; IDFieldName = uid; // first field of the DN for direct binds bindFields = (mail, uid); // array of fields to use for indirect binds baseDN = "ou=domain,ou=local,c=fr"; bindDN = "cn=Directory Manager"; bindPassword = "********"; canAuthenticate = YES; displayName = "Mon entreprise"; hostname = ldap://ldap.domain.local:389; id = ldap; isAddressBook = YES; } ); }; }; }
apache.conf
Apache est utilisé comme reverse proxy interne pour SOGo (directive ProxyPass).
Alias /SOGo.woa/WebServerResources/ \ /usr/local/lib/GNUstep/SOGo/WebServerResources/ Alias /SOGo/WebServerResources/ \ /usr/local/lib/GNUstep/SOGo/WebServerResources/ <Directory /usr/local/lib/GNUstep/SOGo/> AllowOverride None <IfVersion < 2.4> Order deny,allow Allow from all </IfVersion> <IfVersion >= 2.4> Require all granted </IfVersion> # Explicitly allow caching of static content to avoid browser specific behavior. # A resource's URL MUST change in order to have the client load the new version. <IfModule expires_module> ExpiresActive On ExpiresDefault "access plus 1 year" </IfModule> </Directory> ProxyRequests Off SetEnv proxy-nokeepalive 1 ProxyPreserveHost On RedirectMatch ^/$ http://sogo.domain.local/SOGo ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0 ProxyPass /Microsoft-Server-ActiveSync http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync retry=60 connectiontimeout=5 timeout=360 <Proxy http://127.0.0.1:20000/SOGo> <IfModule headers_module> RequestHeader set "x-webobjects-server-port" "80" RequestHeader set "x-webobjects-server-name" "%{HTTP_HOST}e" env=HTTP_HOST RequestHeader set "x-webobjects-server-url" "http://%{HTTP_HOST}e" env=HTTP_HOST ## When using proxy-side autentication, you need to uncomment and ## adjust the following line: RequestHeader unset "x-webobjects-remote-user" # RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0" </IfModule> AddDefaultCharset UTF-8 Order allow,deny Allow from all </Proxy> # For Apple autoconfiguration <IfModule rewrite_module> RewriteEngine On RewriteRule ^/.well-known/caldav/?$ /SOGo/dav [R=301] RewriteRule ^/.well-known/carddav/?$ /SOGo/dav [R=301] </IfModule>
Connecteur Active Sync
Le plugin Active Sync à installer sur Outlook vous permettra de synchroniser automatiquement votre calendrier sur SOGo, il vous suffira d’indiquer l’URL de votre serveur SOGo et la synchronisation fonctionnera instantanément.
Une solution de messagerie complète et clef en main sous Docker : MailCow ?
Pour une solution de messagerie complète clef en main et facile à installer avec tous les outils indispensables pour gérer sereinement l’ensemble de la solution, je vous conseille mailcow qui est un produit tout intégré (Dovecot, ClamAV, solr, oletools, memcached, redis, mariaDB, unbound, Postfix, ACME, Nginx, Rspamd, SOGo, Netfilter, etc.). Il y a toute une documentation pour la déployer sous Docker et donc sous un cluster kubernetes Rancher. Une interface Web épurée est livrée avec et vous permet de tout contrôler de façon unifiée.