跳转至内容

SOGo

来自 ArchWiki

本文章或章节需要扩充。

原因: 使用 Apache 或 nginx 作为 HTTP 服务器,Samba 或 MariaDB/MySQL 作为用户源,以及 Postfix (SMTP) 和 Dovecot (IMAP/POP3) 的配置已完成。还需要为 OpenLDAP 和 PostgreSQL 添加用户源配置,以及其他 SMTP、IMAP 和 HTTP 服务器的配置。(在 Talk:SOGo 讨论)

SOGo 提供丰富的基于 AJAX 的 Web 界面,并通过 CalDAV、CardDAV 和 GroupDAV 等标准协议以及 Microsoft ActiveSync 支持多个原生客户端。本文档介绍了如何使用 SOGo 设置群件服务器。

安装

考虑因素

SOGo 可以使用多种不同的用户认证来源,包括但不限于 Active Directory、OpenLDAP、MySQL/MariaDB、PostgreSQL,以及可能通过 PAM 支持的许多其他来源。本文档将重点介绍使用集中管理的数据库作为用户认证和提供全局地址列表。

此外,必须使用 mariadbpostgresql 来存储用户的日历和地址簿。截至本文撰写时,SOGo 文档明确偏好 MariaDB(或 MySQL),但如果您已有 PostgreSQL 安装,使用它也是合理的。其他 SQL 实现可能也受支持,但目前未涵盖。

最后,目前有两个 SOGo 版本正在积极维护。SOGo-2.x 具有类似于桌面客户端的外观和感觉,而 SOGo-3.x 则采用了更现代的界面,借鉴了 Google 的 AngularJS 设计。两个版本之间的说明和配置是可互换的。

前提条件

安装 sogoAURsogo2AUR

初始 Web 服务器配置

Apache

按照 Apache HTTP Server 的说明安装和配置 apache,并配置为 TLS 连接。通过在 /etc/httpd/conf/httpd.conf 文件或 VirtualHost 条目的末尾添加以下行来将 SOGo 添加到 Apache 配置中。

...
# Include SOGo configuration
include conf/extra/SOGo.conf

如果尚未完成,请在 /etc/httpd/conf/httpd.conf 中取消注释 mod_xml2enc 和所需的代理模块 mod_proxy{,_http,_html}。

# cp /etc/httpd/conf/httpd.conf{,.bak}
# sed /mod_xml2enc\.so/s/#//    -i /etc/httpd/conf/httpd.conf
# sed /mod_proxy\.so/s/#//      -i /etc/httpd/conf/httpd.conf
# sed /mod_proxy_http\.so/s/#// -i /etc/httpd/conf/httpd.conf
# sed /mod_proxy_html\.so/s/#// -i /etc/httpd/conf/httpd.conf

编辑 /etc/httpd/conf/extra/SOGo.conf 文件并修改以下行(将 mail.domain.tld 替换为您所需配置的相应主机名)。

...
## adjust the following to your configuration
  RequestHeader set "x-webobjects-server-port" "443"
  RequestHeader set "x-webobjects-server-name" "mail.domain.tld"
  RequestHeader set "x-webobjects-server-url" "https://mail.domain.tld"
...

nginx

如果使用 nginx 作为 Web 服务器,您只需在 443 端口进行配置,SSL 证书必须在配置之前就已到位。将以下内容添加到 /etc/nginx/nginx.conf

   server {
       listen 443;
       root /usr/lib/GNUstep/SOGo/WebServerResources/;
       server_name mail.domain.tld
       server_tokens off;
       client_max_body_size 100M;
       index  index.php index.html index.htm;
       autoindex off;
       ssl on;
       ssl_certificate path /path/to/your/certfile; #eg. /etc/ssl/certs/keyfile.crt
       ssl_certificate_key /path/to/your/keyfile; #eg /etc/ssl/private/keyfile.key
       ssl_session_cache shared:SSL:10m;
       #optional ssl_stapling on;
       #optional ssl_stapling_verify on;
       #optional ssl_trusted_certificate /etc/ssl/private/cacert-stapeling.pem; 
       #optional resolver 8.8.4.4 8.8.8.8 valid=300s;
       #optionalresolver_timeout 10s;
       ssl_prefer_server_ciphers on;
       #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/lib/GNUstep/SOGo/WebServerResources/;
               allow all;
       }
       location /SOGo/WebServerResources/ {
               alias /usr/lib/GNUstep/SOGo/WebServerResources/;
               allow all;
       }
       location ^/SOGo/so/ControlPanel/Products/([^/]*)/Resources/(.*)$ {
               alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
       }
       location ^/SOGo/so/ControlPanel/Products/[^/]*UI/Resources/.*\.(jpg|png|gif|css|js)$ {
               alias /usr/lib/GNUstep/SOGo/$1.SOGo/Resources/$2;
       }
   }

启动并测试 Web 访问

创建状态目录并启动服务。

# mkdir /var/run/sogo
# chown sogo:sogo /var/run/sogo
# chown sogo:sogo /etc/sogo/sogo.conf
# chmod 0644 /etc/sogo/sogo.conf

然后启用并启动 sogo 以及 httpdnginx 服务。

打开浏览器,对于 Apache,请访问 http://mail.domain.tld/SOGo/;对于 nginx,请访问 https://mail.domain.tld/SOGo/。请勿尝试登录,只需验证您是否能连接并看到登录屏幕,因为认证来源尚未设置。

SOGo 数据库配置

MySQL/MariaDB

如果尚未完成,请使用以下命令创建第一个 MySQL/MariaDB 数据库。

# mysql_install_db --user=mysql --basedir=/usr/ --ldata=/var/lib/mysql/

启用并启动 mariadb,然后以 root 用户身份进入 MySQL Shell。

# mysql -u root

在 mysql 提示符下,输入以下命令(将 SogoPW 替换为安全的密码)。

CREATE DATABASE sogo;
CREATE USER 'sogo'@'localhost' IDENTIFIED BY 'SogoPW';
GRANT ALL PRIVILEGES ON `sogo`.* TO 'sogo'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

从之前的 PostgreSQL 配置迁移

如果您之前使用过 PostgreSQL,可以使用 sogo-tool 进行备份和恢复,将用户数据迁移到 MySQL/MariaDB。详细信息当然是特定于站点的,但此示例应该适用于大多数情况。使用以下命令备份完整的 sogo 数据库。

# mkdir /root/sogo-backup
# sogo-tool backup /root/sogo-backup ALL

现在停止 sogo 守护进程,停止 postgresql(如果未用于其他目的),并使用 sogo 用户和 sogo 数据库重新配置 sogo (/etc/sogo/sogo.conf),保留最后一个路径元素(参见下面的示例)。

要恢复所有用户数据,请运行以下命令。

# for user in `ls -d /root/sogo-backup/*`
  do
      sogo-tool restore -f ALL /root/sogo-backup $(basename $user)
  done

只需重新启动 sogo 即可继续使用 MySQL/MariaDB。

PostgreSQL

如果您选择使用 PostgreSQL 而非 MySQL/MariaDB,旧的说明将保留以供方便。如果这是新安装,建议仅使用 MySQL/MariaDB 来存储 sogo/openchange 数据。

初始化默认数据库并启动 PostgreSQL(请确保将 en_US.UTF-8 替换为适合您安装的区域设置)。

# mkdir -p /var/lib/postgres/data
# chown -R postgres:postgres /var/lib/postgres
# su - postgres -c "initdb --locale en_US.UTF-8 -D '/var/lib/postgres/data'"

然后启动并启用 postgresql 服务。

为 PostgreSQL 创建 sogo 用户和 sogo DB(不要为 sogo 用户选择强密码,为简单起见,仅使用“sogo”。这是临时的,稍后会更改)。

# su - postgres
$ createuser --no-superuser --no-createdb --no-createrole --encrypted --pwprompt sogo
$ createdb -O sogo sogo

编辑 openchange 数据库的访问配置。

# cp /var/lib/postgres/data/pg_hba.conf{,.bak}
# sed \
      's/D$/D\n\n#Configuration for OpenChange/' \
      -i /var/lib/postgres/data/pg_hba.conf
# sed \
      's/ange$/ange\nhost\topenchange\topenchange\t127.0.0.1\/32\t\tmd5/' \
      -i /var/lib/postgres/data/pg_hba.conf
# chown postgres:postgres /var/lib/postgres/data/pg_hba.conf{,.bak}

重新启动 postgresql 服务。

配置用户数据库

Active Directory

如果使用 Active Directory 进行用户认证,无论是使用 Samba(遵循 Samba/Active Directory domain controller 文章)还是使用 Microsoft 服务器,所需的邮件用户属性都已包含在默认模式中。但是,用户必须同时设置 mailproxyAddresses 属性。标记为 SMTP(而非 smtp)的 proxyAddress 属性是默认的邮件地址。如果使用内部和外部域,您需要将 SMTP 设置为用户的外部地址,因为这将是外发邮件的 SMTP 发件人地址和信封发件人。此外,mail 属性也必须设置为用户的外部电子邮件地址。

对于 Samba,您可以使用 ldbedit 命令来编辑用户。在此示例中,我们将修改“Administrator”用户并添加 postmaster 的别名,以及内部和外部电子邮件地址。在以下命令中,将 vim 替换为您喜欢的编辑器。

# LDB_MODULES_PATH="/usr/lib/samba/ldb" ldbedit -e vim -H /var/lib/samba/private/sam.ldb '(samaccountname=administrator)'

重要的是同时更改 mail 属性(这将用于群组扩展和全局地址列表功能)以及主要的 SMTP 地址。proxyAddresses 的 smtp 条目充当别名。添加以下属性(同样,请替换 internal.domain.tlddomain.tld 的适当值)。

...
mail: administrator@domain.tld
proxyAddresses: SMTP:administrator@domain.tld
proxyAddresses: smtp:postmaster@internal.domain.tld
proxyAddresses: smtp:postmaster@domain.tld
proxyAddresses: smtp:administrator@internal.domain.tld
...

如果您使用 Microsoft 的 Active Directory 用户和计算机 MMC 管理单元来编辑用户,您需要从“工具”菜单启用“显示高级功能”,并使用“属性编辑器”选项卡。

接下来,允许守护进程通过 LDAP 在目录中查找用户。为此,请创建一个非特权用户用于 LDAP 查找,并可选地(推荐)设置密码永不过期。如果使用 Samba,请执行以下命令。请务必设置一个足够强的密码。

# samba-tool user create ldap --description="Unprivileged user for LDAP lookups"
# samba-tool user setexpiry ldap --noexpiry

最后,在 Samba 4.3.8 或 4.2.2 之后,默认禁用非加密通信。如果您无法启用 TLS 或 StartTLS,请将以下配置项添加到 /etc/samba/smb.conf 的 [global] 部分。

        ldap server require strong auth = no

MySQL/MariaDB

以下过程适用于 mariadb 10.1.25-1,但也应该适用于 MySQL。

  1. 确保在数据库中创建了 sogo 用户(请参见 #MySQL/MariaDB)。
  2. 确保存在一个名为 sogo 的数据库,并且该数据库使用的是 utf8(而非 utf8mb4)模式。这是必需的,否则 sogo_sessions_folder 表的自动创建将失败。
 SQL: SELECT count(*) FROM sogo_sessions_folder;
 ERROR: Table 'sogo.sogo_sessions_folder' doesn't exist
 SQL: CREATE TABLE sogo_sessions_folder ( c_id VARCHAR(255) PRIMARY KEY, c_value VARCHAR(255) NOT NULL, c_creationdate INT NOT NULL, c_lastseen INT NOT NULL);
 ERROR: Specified key was too long; max key length is 767 bytes          <-- This happens because VARCHAR(255) is too big as primary key for utf8mb4

可以通过以下方式更改模式:

 ALTER SCHEMA `sogo`  DEFAULT CHARACTER SET utf8

更新:似乎有绕过此问题的方法,并且可以使用 utf8mb4。请参阅 SOGo 安装指南 PDF 的第 33 页及之后的内容。

必须手动创建 sogo_users 表。

更改用户并创建带有注释的表,解释每个列的含义(请参见 https://www.sogo.nu/files/docs/SOGoInstallationGuide.html#Authentication-using-SQL)。

 USE sogo;
 CREATE TABLE `sogo`.`sogo_users` (
 `c_uid` VARCHAR(128) NOT NULL COMMENT 'c_uid: will be used for authentication - it’s a username or username@domain.tld',  
 `c_name` VARCHAR(128) NOT NULL COMMENT 'c_name: will be used to uniquely identify entries - which can be identical to c_uid',
 `c_password` VARCHAR(128) NOT NULL COMMENT 'c_password: password of the user, plain text, crypt, md5 or sha encoded',
 `c_cn` VARCHAR(128) NULL COMMENT 'c_cn: the user’s common name',
 `mail` VARCHAR(128) NOT NULL COMMENT 'mail: the user’s email address',  PRIMARY KEY (`c_uid`));

创建一个用户。

  • 生成密码的 MD5 校验和(截至 2017 年 8 月,MD5 对于密码检查仍然是安全的。此外,Web 访问应始终通过 SSL 进行)。
 echo -n 'mypassword' | md5sum
 34819d7beeabb9260a5c854bc85b3e44  -
  • 为此用户创建条目。
 INSERT INTO `sogo`.`sogo_users` (`c_uid`, `c_name`, `c_password`, `c_cn`, `mail`) VALUES ('username', 'username', '34819d7beeabb9260a5c854bc85b3e44', 'Archie Username', 'archie@example.com');

OpenLDAP

待补充...

PostgreSQL

待补充...

Dovecot 配置

基本配置

创建非常基本的 dovecot 配置布局。

# install -vdm755 /etc/dovecot/conf.d
# cp /usr/share/doc/dovecot/example-config/dovecot.conf /etc/dovecot/
# cp -r /usr/share/doc/dovecot/example-config/conf.d /etc/dovecot/conf.d.dist

/etc/dovecot/dovecot.conf 文件中移除 submission 协议(这将由 postfix 处理)。此外,如果您不希望提供 POP3 支持,请移除 pop3。

...
protocols = imap lmtp
...

然后使用以下内容创建 /etc/dovecot/conf.d/local.conf 文件。

auth_mechanisms = plain login
disable_plaintext_auth = no
ssl = no
auth_username_format = %n
mail_location = /home/vmail/%Lu/Maildir

启用并启动 dovecot

用户源

Active Directory

添加 LDAP 查找配置 /etc/dovecot/conf.d/ldap.conf

passdb ldap {
    driver = ldap
    args = /etc/dovecot/dovecot-ldap-passdb.conf
}
userdb ldap {
    driver = ldap
    args = /etc/dovecot/dovecot-ldap-userdb.conf
}

设置权限。

# chmod 0644 /etc/dovecot/conf.d/ldap.conf
# chown root:root /etc/dovecot/conf.d/ldap.conf

创建 LDAP 用户和密码配置文件(将 dc=internal,dc=domain,dc=tldINTERNALldapPW 替换为适当的值)。如果您没有在目录中启用 TLS 配置,请删除下面的 tls 行。

/etc/dovecot/dovecot-ldap-passdb.conf

hosts = localhost
auth_bind = yes
auth_bind_userdn = INTERNAL\%u
ldap_version = 3
tls = yes
base = dc=internal,dc=domain,dc=tld
scope = subtree
deref = never
pass_filter = (&(objectClass=person)(sAMAccountName=%u)(mail=*))

/etc/dovecot/dovecot-ldap-userdb.conf

hosts = localhost
dn = cn=ldap,cn=Users,dc=internal,dc=domain,dc=tld
dnpass = ldapPW
ldap_version = 3
tls = yes
base = cn=Users,dc=internal,dc=domain,dc=tld
user_attrs = =uid=5000,=gid=5000,=home=/home/vmail/%Lu,=mail=maildir:/home/vmail/%Lu/Maildir/
user_filter = (&(objectClass=person)(sAMAccountName=%u)(mail=*))

# Attributes and filter to get a list of all users
iterate_attrs = sAMAccountName=user
iterate_filter = (objectClass=person)

设置权限。

# chown root:root /etc/dovecot/dovecot-ldap-{pass,user}db.conf
# chmod 0600 /etc/dovecot/dovecot-ldap-userdb.conf
# chmod 0644 /etc/dovecot/dovecot-ldap-passdb.conf

创建 SASL 配置 /etc/dovecot/conf.d/sasl.conf

service auth {
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
     }
}

设置权限。

# chmod 0644 /etc/dovecot/conf.d/sasl.conf
# chown root:root /etc/dovecot/conf.d/sasl.conf

重新加载 Dovecot 以使配置生效。

# dovecot reload

Maria DB

待补充...

OpenLDAP

待补充...

PostgreSQL

待补充...

测试 Dovecot 认证

创建 vmail 用户和组。

# groupadd -g 5000 vmail
# useradd -u 5000 -g vmail -s /usr/bin/nologin -d /home/vmail -m vmail
# chmod 750 /home/vmail

打开一个 telnet 会话并进行测试(您输入的命令为粗体,将 Administrator 替换为有效的用户帐户,将 UserPass 替换为您的真实密码)。

telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
a LOGIN Administrator UserPass
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND  URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in
a LOGOUT
* BYE Logging out
. OK Logout completed.
Connection closed by foreign host.

如果返回的不是 OK,请返回并仔细检查配置后再继续。

LMTP 配置

创建 LMTP 配置文件 /etc/dovecot/conf.d/lmtp.conf

mail_location = /home/vmail/%Lu/Maildir
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
  user = vmail
}

protocol lmtp {
  postmaster_address = postmaster@domain.tld
}
# chmod 0644 /etc/dovecot/conf.d/lmtp.conf
# dovecot reload

TLS 配置

将您的证书放到位并创建 TLS 配置文件 /etc/dovecot/conf.d/tls.conf(根据需要调整路径和名称)。密钥文件应由 root 拥有,权限为 0600。任何中间证书都应与公共证书连接在一起。

ssl = yes
ssl_cert = </etc/dovecot/ssl/host.domain.tld.pem
ssl_key = </etc/dovecot/ssl/host.domain.tld.key
# chmod 644 /etc/dovecot/conf.d/tls.conf
# chmod 600 /etc/dovecot/ssl/host.domain.tld.key

将 imaps 协议添加到 /etc/dovecot/dovecot.conf 文件。

...
protocols = imap imaps lmtp
...

local.conf 中移除之前明确定义的值,并重新加载 Dovecot。

# sed -e '/^ssl/d' -e '/disable_plaintext/s/no/yes/' \
      -i /etc/dovecot/conf.d/local.conf
# dovecot reload

Sieve 配置

如果您想支持 sieve 配置,请安装 pigeonhole 并编辑 /etc/dovecot/dovecot.conf。取消注释 protocols 行并将 sieve 添加为服务。移除 submission(这将由 PostfixExim 处理)和 pop3(如果您不打算提供 pop 访问)。

...
protocols = imap imaps lmtp sieve
...

将以下内容追加到 /etc/dovecot/conf.d/local.conf

...
plugin {
   sieve_before = /home/vmail/sieve/spam-global.sieve
   sieve=/home/vmail/%Lu/dovecot.sieve
   sieve_dir=/home/vmail/%Lu/sieve
}

创建全局 sieve 目录。

mkdir -p /home/vmail/sieve/

创建 /home/vmail/sieve/spam-global.sieve 文件,内容如下:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Spam";
}

设置目录(和文件)的权限。

chown -R vmail:vmail /home/vmail/sieve

修改 /etc/dovecot/conf.d/lmtp.conf 文件,添加以下粗体文本。

mail_location = /home/vmail/%Lu/Maildir
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
  user = vmail
}

protocol lmtp {
  postmaster_address = postmaster@domain.tld
  mail_plugins = sieve
}

plugin {
  sieve_before = /home/vmail/sieve/spam-global.sieve
  sieve = /home/vmail/%Lu/dovecot.sieve
  sieve_dir = /home/vmail/%Lu/sieve
}

重新加载 dovecot。

Postfix 配置

基本配置

创建一个最小化的 Postfix 配置。将 server.internal.domain.tld 替换为有效的内部 FQDN)。

# postconf -e myhostname=server.internal.domain.tld
# postconf -e mydestination=localhost

如果此服务器可以从互联网访问,请将 HELO/EHLO 值设置为与从互联网看到的 FQDN 匹配(替换 mail.domain.tld)。

# postconf -e smtp_helo_name=mail.domain.tld
# postconf -e smtpd_banner='$smtp_helo_name ESMTP $mail_name'

启用并启动 postfix

配置 Postfix 使用 vmail 用户和组。

# postconf -e virtual_minimum_uid=5000
# postconf -e virtual_uid_maps=static:5000
# postconf -e virtual_gid_maps=static:5000
# postconf -e virtual_mailbox_base=/home/vmail
# postfix reload

用户源

Active Directory

安装 postfix-ldap 并通过以 root 用户身份将以下行粘贴到文件 /etc/postfix/ldap-alias.cf 中来创建 Postfix 的 LDAP 别名和组映射(替换 dc=internal,dc=domain,dc=tld 为适当的值,并用 ldapPW 替换 ldap 用户的密码)。如果您的目录未配置 TLS,请删除 start_tls 行。

# Directory settings
server_host = 127.0.0.1
search_base = dc=internal,dc=domain,dc=tld
scope = sub
version = 3
start_tls = yes

# User Binding
bind = yes
bind_dn = cn=ldap,cn=users,dc=internal,dc=domain,dc=tld
bind_pw = ldapPW

# Filter
query_filter = (&(objectclass=person)(proxyAddresses=smtp:%s))
result_attribute = samaccountname
result_format = %s@internal.domain.tld

创建组映射。

# sed -e '/^query/d' \
      -e '/^result/d' \
      /etc/postfix/ldap-alias.cf > /etc/postfix/ldap-group.cf

将以下行追加到新创建的 /etc/postfix/ldap-group.cf(在 #Filter 部分)。

query_filter = (&(objectclass=group)(mail=%s))
special_result_attribute = member
leaf_result_attribute = mail

设置权限。

# chmod 0600 /etc/postfix/ldap-{alias,group}.cf

接下来测试我们的用户查找映射(组尚未创建)(替换 internal.domain.tld)。

# postmap -q administrator@domain.tld ldap:/etc/postfix/ldap-alias.cf
# postmap -q administrator@internal.domain.tld ldap:/etc/postfix/ldap-alias.cf

对于两个命令,都应该显示以下输出。

Administrator@internal.domain.tld

将其他托管域追加到下面的第一个命令,添加映射,然后重新加载 Postfix 配置(再次替换域名)。

# postconf -e virtual_mailbox_domains="domain.tld, internal.domain.tld"
# postconf -e virtual_alias_maps="ldap:/etc/postfix/ldap-alias.cf, ldap:/etc/postfix/ldap-group.cf"
# postfix reload

Maria DB

待补充...

OpenLDAP

待补充...

PostgreSQL

待补充...

SASL 配置

修改默认 smtpd 实例。

# postconf -e smtpd_sasl_type=dovecot
# postconf -e smtpd_sasl_path=private/auth
# postconf -e smtpd_sasl_auth_enable=yes
# postconf -e smtpd_relay_restrictions="permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"

LMTP 配置

使用 dovecot LMTP 进行投递。

# postconf -e virtual_transport=lmtp:unix:private/dovecot-lmtp

TLS 配置

如果您打算使用 STARTTLS(您应该这样做),请启用邮件提交端口并限制为已认证的客户端。编辑 /etc/postfix/master.cf 中的以下行。

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=ldap:/etc/postfix/ldap-sender.cf
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

添加 SSL 证书。如果您打算将 Postfix 放入 chroot 监狱(本文档未讨论),则需要将其放置在 Postfix 配置目录中,而不是默认的 /etc/ssl/private 目录。此外,任何中间证书都应与公共证书串联,公共证书应位于链的开头,密钥文件应由 root 拥有,权限模式为 0400(替换 mail.domain.tld)。

# postconf -e smtpd_tls_key_file=/etc/postfix/ssl/mail.domain.tld.key
# postconf -e smtpd_tls_cert_file=/etc/postfix/ssl/mail.domain.tld.pem

创建映射以验证已认证用户的地址 /etc/postfix/ldap-sender.cf。如果您的目录未配置 TLS,请删除 start_tls 行。

# Directory settings
server_host = localhost
search_base = dc=internal,dc=domain,dc=tld
version = 3
scope = sub
start_tls = yes

# User Binding
bind = yes
bind_dn = cn=ldap,cn=Users,dc=internal,dc=domain,dc=tld
bind_pw = ldapPW

# Filter
query_filter = (&(objectclass=person)(proxyAddresses=smtp:%s))
leaf_result_attribute = proxyAddresses
result_attribute = sAMAccountName

设置权限。

# chown root:root /etc/postfix/ldap-sender.cf
# chmod 0640 /etc/postfix/ldap-sender.cf

如果您想在默认 SMTP 端口上启用 TLS,应使其成为可选。如果您强制要求,您将无法从许多互联网主机接收邮件。

# postconf -e smtpd_tls_security_level=may

重新加载 postfix 以应用配置更改。

# postfix reload

测试 Postfix SASL 配置

首先获取用户名和密码的 base64 编码版本(将 Administrator 替换为有效的用户名,将 UserPass 替换为您的真实密码)。

$ echo -ne '\000Administrator\000UserPass' | openssl base64

您应该会收到类似以下的输出。

AEFkbWluaXN0cmF0b3IAVXNlclBhc3M=

现在,打开一个 telnet 会话并进行测试(您输入的命令为粗体,将 host.domain.tld 替换为真实的外部 FQDN,将 AEFkbWluaXN0cmF0b3IAVXNlclBhc3M= 替换为上一个命令的结果)。

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 host.domain.tld ESMTP Postfix
ehlo host.domain.tld
250-host.domain.tld
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN AEFkbWluaXN0cmF0b3IAVXNlclBhc3M=
235 2.7.0 Authentication successful
quit
221 2.0.0 Bye
Connection closed by foreign host.

如果返回的消息不是 235,则说明有问题,您应该立即进行故障排除。

SOGo 配置

基本配置

编辑 SOGo HTTP 配置​​文件 /etc/httpd/conf/extra/SOGo.conf,并注释掉以下行以进行测试(直到 SSL 证书到位并且配置完成)。

## adjust the following to your configuration
#  RequestHeader set "x-webobjects-server-port" "443"
#  RequestHeader set "x-webobjects-server-name" "yourhostname"
#  RequestHeader set "x-webobjects-server-url" "https://yourhostname"

/etc/sogo/sogo.conf 中创建一个合适的 SOGo 配置文件(将粗体项替换为适当的值)。如果您使用 PostgreSQL,请将“mysql:”行替换为相应的“postgresql:”行(如上)。

{
    /* Database Configuration */
    SOGoProfileURL = "mysql://sogo:SogoPW@localhost/sogo/sogo_user_profile";
    OCSFolderInfoURL = "mysql://sogo:SogoPW@localhost/sogo/sogo_folder_info";
    OCSSessionsFolderURL = "mysql://sogo:SogoPW@localhost/sogo/sogo_sessions_folder";

    /* Mail */
    SOGoDraftsFolderName = Drafts;
    SOGoSentFolderName = Sent;
    SOGoTrashFolderName = Trash;
    SOGoJunkFolderName = Junk;
    SOGoIMAPServer = localhost;
    SOGoSieveServer = sieve://127.0.0.1:4190;
    SOGoSMTPServer = 127.0.0.1;
    SOGoMailDomain = internal.domain.tld;
    SOGoMailingMechanism = smtp;
    SOGoForceExternalLoginWithEmail = NO;
    SOGoMailSpoolPath = /var/spool/sogo;
    NGImap4ConnectionStringSeparator = "/";

    /* Notifications */
    SOGoAppointmentSendEMailNotifications = YES;
    SOGoACLsSendEMailNotifications = NO;
    SOGoFoldersSendEMailNotifications = NO;

    /* Authentication */
    SOGoPasswordChangeEnabled = YES;

    /* Web Interface */
    SOGoPageTitle = SOGo;
    SOGoVacationEnabled = YES;
    SOGoForwardEnabled = YES;
    SOGoSieveScriptsEnabled = YES;
    SOGoMailAuxiliaryUserAccountsEnabled = YES;
    SOGoTrustProxyAuthentication = NO;
    SOGoXSRFValidationEnabled = NO;

    /* General */
    SOGoLanguage = English;
    SOGoTimeZone = America/Chicago;
    SOGoCalendarDefaultRoles = (
        PublicDAndTViewer,
        ConfidentialDAndTViewer
    );
    SOGoSuperUsernames = (administrator);
    SxVMemLimit = 384;
    //WOPidFile = "/var/run/sogo/sogo.pid";
    SOGoMemcachedHost = "127.0.0.1";

    /* Debug */
    //SOGoDebugRequests = YES;
    //SoDebugBaseURL = YES;
    //ImapDebugEnabled = YES;
    //LDAPDebugEnabled = YES;
    //PGDebugEnabled = YES;
    //MySQL4DebugEnabled = YES;
    //SOGoUIxDebugEnabled = YES;
    //WODontZipResponse = YES;
    //WOLogFile = /var/log/sogo/sogo.log;

}

然后执行以下命令。

# chown sogo:sogo /etc/sogo/sogo.conf
# chmod 0600 /etc/sogo/sogo.conf
# mkdir /var/spool/sogo
# chown sogo:sogo /var/spool/sogo
# chmod 700 /var/spool/sogo

SOGo 用户源

Active Directory

修改 /etc/sogo/sogo.conf 文件并添加 LDAP 用户源(和全局地址列表)。将以下内容放在 Web Interface 部分之前。如果您的目录未配置 TLS,请从 LDAP URI 末尾的“/????!StartTLS”字符串中排除。

    /* User Authentication */
    SOGoUserSources = (
     {
        id = directory;
        displayName = "Active Directory";
        canAuthenticate = YES;
        type = ldap;
        CNFieldName = cn;
        IDFieldName = sAMAccountName;
        UIDFieldName = sAMAccountName;
        baseDN = "dc=internal,dc=domain,dc=tld";
        bindDN = "cn=ldap,cn=Users,dc=internal,dc=domain,dc=tld";
        bindFields = (sAMAccountName);
        bindPassword = "ldapPW";
        hostname = ldap://server.internal.domain.tld:389/????!StartTLS;
      },
      {
        id = sambaShared;
        displayName = "Shared Addressbook";
        canAuthenticate = NO;
        isAddressBook = YES;
        type = ldap;
        CNFieldName = cn;
        IDFieldName = mail;
        UIDFieldName = mail;
        hostname = ldap://server.internal.domain.tld:389/????!StartTLS;
        baseDN = "dc=internal,dc=domain,dc=tld";
        bindDN = "cn=ldap,cn=Users,dc=internal,dc=domain,dc=tld";
        bindPassword = "ldapPW";
        filter = "((NOT isCriticalSystemObject='TRUE') AND (mail=\'*\') AND (NOT objectClass=contact))";
        //Uncomment to list local users in WebUI without searching (small directories only)
        //listRequiresDot = NO;
      },
      {
        id = sambaContacts;
        displayName = "Shared Contacts";
        canAuthenticate = NO;
        isAddressBook = YES;
        type = ldap;
        CNFieldName = cn;
        IDFieldName = mail;
        UIDFieldName = mail;
        hostname = ldap://server.internal.domain.tld:389/????!StartTLS;
        baseDN = "dc=internal,dc=domain,dc=tld";
        bindDN = "cn=ldap,cn=Users,dc=internal,dc=domain,dc=tld";
        bindPassword = "ldapPW";
        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");
        //Uncomment to list contacts in WebUI without searching (few contacts only)
        //listRequiresDot = NO;
        };
      }
    );

Maria DB

为了调试目的,编辑 /etc/sogo/sogo.conf 以启用所有调试开关。

 /* Debug */
 SOGoDebugRequests = YES;
 SoDebugBaseURL = YES;  
 ImapDebugEnabled = YES;
 LDAPDebugEnabled = YES;
 PGDebugEnabled = YES;
 MySQL4DebugEnabled = YES;
 SOGoUIxDebugEnabled = YES;
 WODontZipResponse = YES;
 WOLogFile = /var/log/sogo/sogo.log;

如果出现问题,请作为 root 运行 journalctl -xe 进行检查。

进一步修改 /etc/sogo/sogo.conf 文件以包含 SQL 作为用户源(将密码更改为 sogo mysql 用户选择的密码)。

  SOGoUserSources =
    (
      {
        type = sql;
        id = directory;
        viewURL = "mysql://sogo:yoursogopassword@127.0.0.1:3306/sogo/sogo_users";
        canAuthenticate = YES;
        isAddressBook = YES;
        userPasswordAlgorithm = md5;
      }
    );

或者,可以使用视图而不是直接使用表。有关 SOGoUserSources 可用值的更多信息,请参阅:https://sogo.nu/files/docs/SOGoInstallationGuide.html#_authentication_using_sql

OpenLDAP

待补充...

PostgreSQL

待补充...

完成配置

现在启用并启动 memcached 服务,并重新启动 sogo 服务。通过访问 http://server.internal.domain.tld/SOGo/ 进行测试。

ActiveSync 配置

Apache

要添加 ActiveSync 支持,只需在 /etc/httpd/conf/extra/SOGo.conf 中取消注释以下行。

...
ProxyPass /Microsoft-Server-ActiveSync \
 http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync \
 retry=60 connectiontimeout=5 timeout=3600
...

如果您有超过几位用户,这会导致额外的锁定延迟,因此需要进行一些调整。您可能会注意到上述行已从 360 秒更改为 3600 秒(或一小时)。这是因为 EAS 设备需要将 HTTP 连接保持打开非常长的时间(最多一小时)。因此,您需要告诉 SOGo(参见下文)以遵守此超时。在继续之前重新加载 httpd 服务。

nginx

将以下内容添加到 /etc/nginx/nginx.com 中 SOGo 的服务器定义:

...
        location ^~ /Microsoft-Server-ActiveSync {
                proxy_pass http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync;
                proxy_redirect http://127.0.0.1:20000/Microsoft-Server-ActiveSync /;
        }

        location ^~ /SOGo/Microsoft-Server-ActiveSync {
                proxy_pass http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync;
                proxy_redirect http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync /;
        }
...

下面 SOGo 部分中的参数(特别是 timeout、retry 和 next host 值)可能需要进行额外的调整。

SOGo

如上所述,对于列出的 HTTP 服务器,使用 EAS 需要进行一些调整。虽然下面的超时(59 分钟)适用于上面设置的 HTTP 会话超时,但工作进程的数量取决于您必须支持的并发 EAS 客户端的数量。简而言之,您总是需要比 EAS 客户端更多的进程来允许启动另一个进程进行推送操作。此外,同步间隔将允许您减少服务器负载,从而生成更少的延迟,这取决于客户端的总数。SOGo 配置指南(可在 https://sogo.nu/files/docs/SOGoInstallationGuide.pdf 获取)列出了两个示例配置。本文档选择了 100 用户、10 EAS 用户的示例。将以下行追加到 /etc/sogo/sogo.conf,确保它们放在闭合大括号(“}”)字符之前。

  /* ActiveSync */
  WOWorkersCount = 15;
  WOWatchDogRequestTimeout = 59;
  SOGoMaximumPingInterval = 3540;
  SOGoMaximumSyncInterval = 3540;
  SOGoInternalSyncInterval = 30;

最后,重新启动 sogo 服务。