Ubuntu

SOGo Groupware

Kopanoコミュニティエディションの更新が終了したので、ActiveSyncに対応する新しいグループウェアを探してみたところ、SOGoというオープンソースのグループウェアがあることが分かった。
SOGo | Open Source Groupware

夜間ビルド版が無料で提供されている。2023/12/31現在。

立ち上げてみたところ、メール、アドレス帳、カレンダー、タスクの機能が提供されており、ActiveSyncにも対応していた。
ただし、iPhoneで一部の親戚が使っているメモ機能(Notes)は提供されていなかった。

今回はシステムを立ち上げるところの手順を整理する。



広告


環境

VMware Playerで仮想PCを立ち上げて、インストール手順を確立する。
Ubuntu 22.04 LTS server、英語、通常構成とした。

システム構成

基本的には推奨する環境でインストールするべきだと思うけれども、個人的な慣れも含めて以下を選択。

サービス推奨今回使用するもの
Database serverPostgreSQL 7.4 or laterMariaDB 10.6
LDAP serverOpenLDAP 2.3.x or laterSamba AD DC
SMTP serverPostfix 2.xPostfix 3.6
IMAP serverCyrus IMAP Server 2.4.x or laterDovecot 2.3.16

ホームラボでは架空のhogeserver.hogeddns.jpというドメインを運用している。
この記事をみて設定を試すならば、これを読み替える。

  • LDAPサーバーは addc.hogeserver.hogeddns.jp で稼働しているSamba AD DC。
    SOGoを利用するユーザーの情報を持っている。
  • 新しく立ち上げた仮想サーバーは sogo.hogeserver.hogeddns.jp とした。
    ドメインには参加しない。
    DHCPとDNSが連携していて、LAN内で名前解決ができるようになる。

サービス構成

周辺サービスを色々整備してからでないとSOGo本体が動かないので、事前の設定作業が長い。
サービス構成をイメージしながら進めるように、ちょっと図にしてみた。

Dovecotをあまり使ったことがなく、Postfixとの役割分担がよく分からなかったので、メール1つ受け取って処理するだけでも一苦労。

     Internet
┌───┴───┐    ┌──────────────────┐
│  [hn: addc]  │    │          [hostname: sogo]          │
│ Router, DNS  │    │┌────┐┌────┐┌────┐│
│ Samba AD DC  ├──┤│ Apache ││Postfix ├┤Dovecot ││
└───────┘    │└─┬──┘└─┬──┘└─┬──┘│
                      │    └─────┼─────┘      │
                      │            ┌─┴──┐┌────┐│
                      │            │  SOGo  ├┤ MariaDB││
                      │            └────┘└────┘│
                      │      Ubuntu 22.04 LTS Server       │
                      └──────────────────┘
└──────────────┬──────────────┘
                Domain: hogeserver.hogeddns.jp

サービス役割/動作
Samba AD DCSambaで運用する Active Directory / Domain Controller。
Postfix、Dovecot、SOGoにLDAPでユーザーの情報を提供する。
Dockerで構築済みのため、この記事の対象外。
ApacheSOGoが提供するWeb UIを外部に提供する。
HTTPSで通信ができるよう、SSLエンジンをオンにしている。
https://sogo.hogeserver.hogeddns.jp/SOGo にアクセスされるとSOGoにリバースプロキシする。
PostfixSOGoでメールを作成すると、Postfixにメールが送られて配送される。
メールを受信したら、LDAPでユーザーの存在を確かめて、LMTPでDovecotにメールを送信する。
DovecotSOGoからの要求に応じて、IMAPサーバーとして動作する。
Postfixからメールを受け取ったら、IMAP用のメールボックスに格納する。
MariaDBSOGoの管理情報等を保管する。

登場するユーザー

今回構築したシステムのユーザーを整理しておく。

sogo.hogeserver.hogeddns.jp(SOGoをインストールしたUbuntu)

ユーザーグループパスワードいつ作られたか備考
sogosogoなしsogoのインストールほとんど意識しないが、sogo-toolコマンドを使用するときに使う。
www-datawww-dataなしApache2のインストールほとんど意識しない。
postfixpostfix saslなしPostfixのインストールグループsaslは、sasl2-binをインストールしたときに作られる。
SASL認証を使用するため、ユーザーpostfixをグループsaslに追加。
dovecotdovecotなしDovecotのインストールほとんど意識しない。
mysqlmysqlなしMysqlのインストールほとんど意識しない。
vmailvmailなし
p@ssword
手作業DovecotのIMAPで仮想ユーザーのメールを扱うために作成。
パスワードは持たせていないので、ログインはできない。
DovecotのIMAPの管理者としてのパスワードは p@ssword。
rohhierohhie<secret>Ubuntuのインストールインストール時に作成した最初のユーザー。
Samba ad dcにもいるが、厳密には別ユーザー。

Samba AD DC(Active Directory/Domain Controller ホームラボ用のテスト環境)

sAMAccountName区分役割パスワード備考
Administratorユーザー管理者<secret>ビルトインユーザーで管理権限を持つ。
root@hogeserver.hogeddns.jpがメインのアドレス。
otherMailboxにadministratorとwebmasterを持つ。
rohhieユーザー管理者<secret>日頃、管理に使うユーザー。
管理権限を持たせている。
hogeユーザー自分<secret>ユーザーとしてのテストで使用。
hogewifeユーザー<secret>ユーザーとしてのテストで使用。
piyoユーザー子供<secret>ユーザーとしてのテストで使用。
ssoauthユーザー認証用p@sswordLDAP認証で使用。
parentグループhoge,hogewifeを収容-学校からのメールを受け取るために作成。
SOGo UsersグループSOGoを利用するユーザー/グループを収容-ssoauthでSOGoを利用しない…と考えた。
ユーザー/グループを限定するために作成。

MariaDB

ユーザーパスワード備考
rootなしビルトインユーザー。
sogosogopasswd手作業で作成。

証明書の準備

HTTPS/LDAPS/IMAPSで証明書を使用するために、以下を用意しておく。

ファイル内容配置場所
hoge-ca.crtプライベート認証局の証明書/usr/local/share/ca-certificates/
sogo.hogeserver.hogeddns.jp.crt自己署名した証明書(*.hogeserver.hogeddns.jp)/etc/ssl/private/
sogo.hogeserver.hogeddns.jp.key自己署名した証明書の秘密鍵/etc/ssl/private/

Ubuntuをインストールしたときに、Snake oilな秘密鍵や証明書を作成してくれる。

  • /etc/ssl/certs/ssl-cert-snakeoil.pem
  • /etc/ssl/private/ssl-cert-snakeoil.key

デフォルトでは、Dovecotはこのファイルのシンボリックリンクで使用しているし、Postfixはダイレクトに使用している。
Apacheでもこれを使えばとりあえずの暗号化ができる。
受け取る側で、信頼されていない認証局が発行した証明書であることを無視して、強制的にアクセスすることもできるだろう。
ということで、Snake oilな証明書を使う場合には、設定している箇所で読み替えて使う。

世の中で信用されている認証局に署名してもらった証明書を使用する場合には、ルート認証局の証明書がシステムに登録されているので、プライベート認証局の証明書を用意する必要はない。
例えば、Let's Encryptで署名してもらったなら、Let's Encrypt配下にできた証明書と秘密鍵を使えばOK。

MicrosoftのActive Directoryを運用していて、端末をドメインに参加させている場合には、認証局の証明書を端末に配布していることだろう。
この時には、ADの認証局の証明書をUbuntuに登録し、認証局に署名してもらった証明書を使えばOK。

今回の手順では、いつも通りhogeserver.hogeddns.jpという架空のドメインを使って手順を確立するので、プライベート認証局で署名している。
プライベート認証局で署名した証明書を信用するためには、各システムでプライベート認証局の証明書を信用しておく必要がある。

  • Samba ad dcが提供するLDAPSにアクセスするときに必要。
    • SOGoをインストールするUbuntu
  • SOGoを利用するクライアント。
    • Chromeを動かすWindowsやUbuntu
    • FirefoxやThuderbirdのようにOSとは別に証明書を管理しているソフト
    • Android端末

Ubuntuでは、上記表の配置場所にファイルを配置して、以下のコマンドを実行する。

$ sudo update-ca-certificates

Windowsでは、証明書ストアでルート認証局をインストールする。
Andoroidでは、CA証明書をダウンロードしてインストールする。

インストール

インストールドキュメントはこちら。
Installation and Configuration Guide

ソースはこちら。
Github / Alinto / Sogo

バグトラッキングシステムはこちら。
SOGo | BTS

ファイアウォールの設定

ファイアウォールを設定する。

$ sudo ufw allow to any port 22 proto tcp from any comment "SSH"
$ sudo ufw allow to any port 443 proto tcp from any comment "HTTPS"
$ sudo ufw allow to any port 25 proto tcp from any comment "SMPT"
$ sudo ufw allow to any port 993 proto tcp from any comment "IMAPS"
$ sudo ufw allow to any port 587 proto tcp from any comment "Submission"
$ sudo ufw allow to any port 465 proto tcp from any comment "SMTPS"

ファイアウォールを有効化。

$ sudo ufw enable

SOGo夜間ビルドのリポジトリを登録

新規にUbuntu 22.04 LTS serverを立ち上げた。
これを最新の状態にする。

$ sudo apt update && sudo apt -y dist-upgrade && sudo apt -y autoremove
$ sudo reboot

無料で提供されているのは、夜間バージョン。
このリポジトリを登録する。
SOGo FAQ / How to install nightly SOGo versions on Ubuntu?

apt-keyが非推奨になっているため、少し手順を改変。
鍵のテキストをダウンロードして連結し、dearmorした。

$ wget -O- "https://pgp.mit.edu/pks/lookup?op=get&search=0xCB2D3A2AA0030E2C" > sogo.txt
$ wget -O- "https://keys.openpgp.org/vks/v1/by-fingerprint/74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9" >> sogo.txt
$ cat sogo.txt | gpg --dearmor > sogo.gpg

※pgp.mit.eduからのダウンロードにはとても時間が掛かる。時々失敗もするので、成功するまで粘る。

gpgファイルを確かめる。

$ file sogo.gpg
sogo.gpg: OpenPGP Public Key Version 4, Created Tue Mar 15 18:44:09 2016, RSA (Encrypt or Sign, 4096 bits); User ID; Signature; OpenPGP Certificate

$ gpg --show-keys sogo.gpg
pub   rsa4096 2016-03-15 [SC]
      B022C48D3D6373D7FC256A8CCB2D3A2AA0030E2C
uid                      Inverse Support (RPM package signing) <support@inverse.ca>

pub   rsa4096 2022-07-29 [SC]
      74FFC6D72B925A34B5D356BDF8A27B36A6E2EAE9
uid                      SOGo by Alinto <gpg@sogo.nu>
sub   rsa4096 2022-07-29 [E]

どうやらうまくできたようなので、所定の場所に保管する。

$ sudo cp sogo.gpg /etc/apt/keyrings/

リポジトリを追加する。この時に、先程の鍵が使われていることを示しておく。

$ cat <<EOF | sudo tee /etc/apt/sources.list.d/sogo.list > /dev/null
deb [signed-by=/etc/apt/keyrings/sogo.gpg] http://packages.sogo.nu/nightly/5/ubuntu/ jammy jammy
EOF

アップデートリストを更新する。
これでエラーが出なければ、リポジトリの追加はうまくいっている。

$ sudo apt update

作業用に作成したsogo.txtとsogo.gpgは削除して構わない。

SOGo

SOGoのインストール

ここからは、公式の手順に沿ってシステムをインストールしていく。
Installation and Configuration Guide

構成図で示したように、かなり複雑な構成になっていて、かつ、なかなか画面が見られない。
やることがかなりあって時間が掛かるが、1つ1つ進めて行こう…。

最初に、apache2をインストールするように書かれている。
後から分かったことだけれど、SOGoのパッケージには/etc/apache/conf.d/SOGo.confというファイルが含まれている。
これをすんなりとインストールするために、先にApacheをインストールしているのかなと思う。

$ sudo apt install -y apache2

続いて、sogoをインストール。
ActiveSyncも使いたいので、一緒にインストールする。

$ sudo apt install -y sogo sogo-activesync

Memcachedの設定

SOGoはMemcachedを使用するようだ。
実際に、sogoと共にインストールされていた。
設定ファイルを見ると、同じサーバー内でMemcachedが動いていて、ソケットで通信ができるようになることを期待しているようだった。

設定方法がよく分からなかったけれど、ここに例がたくさん並んでいたので、それを設定してみたところ、上手く動作した。
serverfault / How to set up memcached to use unix socket?

/etc/memcached.conf

...
# Use a socket
-s /var/run/memcached/memcached.sock
-a 0666

※最後に追加。

memcachedの再起動。

$ sudo systemctl restart memcached

SOGoの基本的な設定

設定ファイルを編集。

SOGo自体の動作に関わるところを書いてみている。
管理者として、Administratorとrohhieを設定してあり、このユーザーでWebからログインすると、管理メニューが使えるようになる。
debugのところは、ZEGの設定ファイルからコピーしてきたものに置き換えた。

/etc/sogo/sogo.conf

...
  /* Mail */
  SOGoDraftsFolderName = Drafts;
  SOGoSentFolderName = Sent;
  SOGoTrashFolderName = Trash;
  SOGoJunkFolderName = Junk;
  SOGoMailSpoolPath = /var/spool/sogo;
...
  /* General - SOGoTimeZone *MUST* be defined */
  SOGoLanguage = Japanese;
  SOGoTimeZone = Asia/Tokyo;
  SOGoCalendarDefaultRoles = (
    PublicDAndTViewer,
    ConfidentialDAndTViewer
  );
  SOGoSuperUsernames = (Administrator, rohhie); // This is an array - keep the parens!
  SxVMemLimit = 384;
  WOPidFile = "/var/run/sogo/sogo.pid";
  SOGoMemcachedHost = "/var/run/memcached/memcached.sock";
...
  /* Debug */
  //SOGoUIxDebugEnabled                    = YES;
  //LDAPDebugEnabled                       = YES;
  //MySQL4DebugEnabled                     = YES;
  //OCSFolderManagerSQLDebugEnabled        = YES;
  //PGDebugEnabled                         = YES;
  //SOGoDebugRequests                      = YES;
  //WODebugTakeValues                      = YES;
  //SaxDebugReaderFactory                  = YES;
  //SaxObjectDecoderDebugEnabled           = YES;
  //SoDebugObjectTraversal                 = YES;
  //SoSecurityManagerDebugEnabled          = YES;
  //VSSaxDriverDebugEnabled                = YES;
  //WODebugResourceLookup                  = YES;
  //WEResourceManagerDebugEnabled          = YES;
  //WEResourceManagerComponentDebugEnabled = YES;
...

SOGoSuperUsernamesは、大文字小文字もしっかりとあわせておく必要がある。
設定を修正した場合には、SOGoだけでなく、Memcachedの再起動も必要なようだ。

一旦設定を反映しておく。

$ sudo systemctl restart sogo memcached

SOGo利用ユーザーを指定

SOGo利用ユーザーを明確にするため、SOGo Usersというグループを作成し、ユーザーとグループを入れておくことにした。

Samba AD DCはDockerで運用しているので、コンテナに入ってからユーザー追加のコマンドを実行する。

addc$ sudo docker exec -it samba bash --login
# samba-tool group add "SOGo Users"
# samba-tool group addmembers "SOGo Users" Administrator,rohhie,hoge,hogewife,piyo

あわせて、メールを受け取るグループもSOGo Usersに追加しておく。
ここでは、Parentというグループ、hogeとhogewifeが含まれたグループを追加している。

# samba-tool group listmembers parent
hoge
hogewife
# samba-tool group addmembers "SOGo Users" parent

この先、LDAPで認証したり、ユーザーの情報を探したりするときに、グループ"SOGo Users"に含まれているかどうかを条件として使うことができるようになった。

SOGoのユーザー認証

SOGoには幾つかユーザーの管理方法が用意されているが、ここでSamba AD DCのユーザーをLDAPで認証できるようにする。

ホームラボは、以下の状況になっている。

これにあわせて、SOGoのLDAP認証設定をしていく。

  • LDAPSで、TLS暗号化+シンプルのバインド。
  • バインドするユーザーとして、ssoauthを使用する。
    Active Directoryでは<ユーザー名>@<ドメイン名>の形式で使用可能らしく、上手くいく。
  • SOGoが利用できるユーザーを、memberOfでフィルターする。
  • displayNameとして、ドメイン名を設定しておいた。
    メールアドレスを入力中のサジェスト等で表示されるので、わかりやすい名前を付けておく。

/etc/sogo/sogo.conf

...
  /* LDAP authentication example */
  SOGoUserSources = (
    {
      type = ldap;
      CNFieldName = cn;
      UIDFieldName = sAMAccountName;
      baseDN = "CN=users,dc=hogeserver,dc=hogeddns,dc=jp";
      bindDN = "ssoauth@hogeserver.hogeddns.jp";
      bindFields = (sAMAccountName, mail);
      bindPassword = p@ssword123;
      canAuthenticate = YES;
      displayName = "MYHOME";
      hostname = "ldaps://addc.hogeserver.hogeddns.jp:636";
      filter = "memberOf='CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp'";
      id = directory;
      isAddressBook = YES;
    }
  );
...

Windows ServerやOpenLDAPを利用する場合には、これとは少し違った構成になるかもしれない。
でも、baseDNやbindDNあたりがちょっと違う程度ではないかと思う。

Apache

Apacheは、SOGoのインストール前にインストール済み。

SOGoはApacheの設定ファイルを提供しているが、/etc/apache2/conf.d/SOGo.confは、そのディレクトリが独特。
Ubuntuの場合、多くは/etc/apache2/conf-available にファイルが提供され、それを有効化するのがお決まりのパターンだけれども、あえて違うディレクトリに提供されているところを見ると、インクルードして使うのがいいんじゃないか?と考えた。

ということで、SOGo用に設定ファイルを新規に作成する。

  • HTTPSで通信ができるように、自己署名証明書で通信を保護する。
    SOGoがHTTPSを要求しているわけではないので、HTTPでもOK。
  • テストなので、連絡先メールアドレスとしてホームラボだけで使えるものを設定。
  • SOGoの設定は、パッケージで提供されているものをインクルードする。

/etc/apache2/sites-available/sogo.conf

<VirtualHost *:443>
        ServerAdmin webmaster@hogserver.hogeddns.jp
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on
        SSLCertificateFile /etc/ssl/private/sogo.hogeserver.hogeddns.jp.crt
        SSLCertificateKeyFile /etc/ssl/private/sogo.hogeserver.hogeddns.jp.key

        include /etc/apache2/conf.d/SOGo.conf
</VirtualHost>

SOGoが提供する設定ファイルには、各種設定が入っていて、マニュアルを見なくても、ここにあるファイルである程度分かる。
この中に、ActiveSyncの設定がコメント化された状態で入っているので、先頭の#を外して有効にする。

/etc/apache/conf.d/SOGo.conf

...
# Enable to use Microsoft ActiveSync support
# Note that you MUST have many sogod workers to use ActiveSync.
# See the SOGo Installation and Configuration guide for more details.
#
ProxyPass /Microsoft-Server-ActiveSync \
 http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync \
 retry=60 connectiontimeout=5 timeout=360
...

Apacheの警告避け。

$ echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/fqdn.conf > /dev/null
$ sudo a2enconf fqdn

デフォルトの設定を無効、新たに作成した設定を有効、必要モジュールを有効にして、Apacheを再起動する。

$ sudo a2dissite 000-default.conf
$ sudo a2ensite sogo.conf
$ sudo a2enmod headers proxy_http ssl
$ sudo systemctl restart apache2

MariaDB

SOGoでMariaDBを利用するための情報は、こちらで提供されていた。
MySQLで書かれているけれど、MariaDBでも同じ。
Sogo FAQ / How do I configure SOGo to use MySQL?

MariaDBをインストールする。

$ sudo apt install -y mariadb-server

データーベースを作り、アクセス権を付ける。

$ sudo mariadb
MariaDB [(none)]> CREATE DATABASE `sogo` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
MariaDB [(none)]> CREATE USER 'sogo'@'localhost' IDENTIFIED BY 'sogopasswd';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON `sogo`.* TO 'sogo'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit

SOGoの設定ファイルで、MariaDBを使用するように設定する。
その後に調べたZEGの設定を真似して、設定項目を増やしている。

/etc/sogo/sogo.conf

...
  /* Database configuration (mysql://, postgresql:// or oracle://) */
  SOGoProfileURL          = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_user_profile";
  OCSFolderInfoURL        = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_folder_info";
  OCSSessionsFolderURL    = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_sessions_folder";
  OCSEMailAlarmsFolderURL = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_alarms_folder";
  OCSStoreURL             = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_store";
  OCSAclURL               = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_acl";
  OCSCacheFolderURL       = "mysql://sogo:sogopasswd@localhost:3306/sogo/sogo_cache_folder";
...

反映。

$ sudo systemctl restart sogo memcached

Dovecot

IMAPサーバーとしてはDovecotを使ってみることにした。
LDAPとLMTPD、Sieveのパッケージをあわせてインストールする。

$ sudo apt install -y dovecot-imapd dovecot-ldap dovecot-lmtpd dovecot-managesieved dovecot-sieve

IMAPのメールを管理するユーザーの作成

Dovecotはメールを管理するディレクトリを、uidで示されたUIDで保護しようとする。
今回は仮想ユーザー(ホームレスユーザー)のメールを管理しようとしているが、仮想ユーザーなのでUIDがない。
そこで、仮想ユーザーのメールを管理するためのアカウントを作成する。

$ sudo groupadd -g 5000 vmail
$ sudo useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/vmail -M vmail

Dovecotはfirst_valid_uidという項目でログインできるUIDの最低値が500と指定されている。
これは、システムユーザーでログインできないようにするためとのことだったが、この制限に引っかからないようにUIDを指定している。

このユーザーがマスターとして接続できるようにする。

vmailにはパスワードがない。
Dovecotが独自にもつパスワードファイルでパスワードを設定しておく。

/etc/dovecot/users ※新規作成

vmail:{PLAIN}p@ssword123:5000:5000

一般ユーザーに見えないようにする。

$ sudo chgrp dovecot /etc/dovecot/users
$ sudo chmod 660 /etc/dovecot/users

普通はパスワードを暗号化しておくみたいだけれども、プレーンテキストにしたので、それで読み取れるように設定を変更。

/etc/dovecot/conf.d/auth-passwdfile.conf.ext

passdb {
  driver = passwd-file
  #args = scheme=CRYPT username_format=%u /etc/dovecot/users
  args = username_format=%u /etc/dovecot/users
}

パスワードファイルによる認証がされるように、インクルード文を有効にする。

/etc/dovecot/conf.d/10-auth.conf

...
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-static.conf.ext

※auth-passwdfile.conf.extを有効にする。

メールボックスの設定

続いて、メールボックス用のディレクトリについて設定していく。

デフォルトの設定を見ると、mbox形式で、各ユーザーのホームディレクトリ配下に mail というディレクトリが作られ、そこでメールが管理される。
今回は仮想ユーザーでホームレスなので、/var/vmailで、かつ、maildir形式で管理することにした。

あわせて、管理用のユーザーをvmailで上書きするようにした。

/etc/dovecot/conf.d/10-mail.conf

...
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:/var/vmail/%n
...
mail_uid = vmail
mail_gid = vmail

メールボックス用のディレクトリを作成し、ユーザーをvmail、グループをdovecotに変更して、dovecotで操作ができるようにする。

$ sudo mkdir /var/vmail
$ sudo chown vmail:dovecot /var/vmail
$ sudo chmod 770 /var/vmail

このディレクトリを作っておくと、その後に以下のようなディレクトリが作られて、メールが保管されていく。

/var/mail-imap/                                          d775 vmail dovecot
|-- hoge                                                 d700 vmail vmail
|   |-- cur                                              d700 vmail vmail
|   |   `-- 1704530484.M199839P14205.sogo,S939,W=965:2,S  600 vmail vmail
|   |-- new                                              d700 vmail vmail
|   |   `-- <省略>
|   |-- sieve                                            d700 vmail vmail
|   |   `-- <省略>
|   |-- tmp                                              d700 vmail vmail
|   |   `-- <省略>
|   |-- .Sent                                            d700 vmail vmail
|   |   `-- <省略>
|   |-- dovecot.index.cache                               600 vmail vmail
|   |-- dovecot.list.index.log                            600 vmail vmail
|   |-- <省略>
|   `-- maildirfolder                                     600 vmail vmail
`-- rohhie                                               d700 vmail vmail
    `-- <省略>

  • メールは、curの下にあるようなファイルに入る。
  • ドットで始まるディレクトリは、メーラーで表示されるディレクトリ。
    必要なときに新たに作られるようで、メールを送信したら.Sentが作られた。
  • 通常は、ディレクトリやファイルはユーザーの持ち物になるが、今回の設定でvmailの持ち物になっている。

LDAP認証と情報取得

auth-ldap.conf.extには、passdbとuserdbが定義されている。
passdbがユーザー認証に使われ、userdbはユーザー固有の情報を取り出すために使われるそうだ。
bbr-software-memo / Dovecot:passdbとuserdb
DOVECOT Navigation / User Database (userdb)

デフォルトでは、LDAPサーバーからuidNumber/gidNumberを取り出して、uid/gidに格納しようとする。
これがメールを保管するディレクトリのユーザーに使われるが、仮想ユーザーのメールを管理するため、uid=imapadmin/gid=dovecotで上書きする。

/etc/dovecot/conf.d/auth-ldap.conf.ext

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

  # Default fields can be used to specify defaults that LDAP may override
  #default_fields = home=/home/virtual/%u
  override_fields = home=/var/vmail/%n
...

passdbとuserdbのプロセスで使用するLDAPのパラメーターを設定する。

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

uris = ldaps://addc.hogeserver.hogeddns.jp
dn = ssoauth@hogeserver.hogeddns.jp
dnpass = p@ssword123
auth_bind = yes
base = CN=Users,DC=hogeserver,DC=hogeddns,DC=jp

user_filter = (&(|(sAMAccountName=%n)(mail=%u)(otherMailbox=%u))(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp))
pass_filter = (&(|(sAMAccountName=%n)(mail=%u)(otherMailbox=%u))(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp))

※設定した項目を抜粋。

認証方式をLDAP(Samba AD DCのユーザー)を許可する。
あわせて、システムユーザーはSOGoを使わないので、ログインを禁止する。

/etc/dovecot/conf.d/10-auth.conf

...
#!include auth-system.conf.ext
#!include auth-sql.conf.ext
!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-static.conf.ext

※auth-system.conf.extの行をコメント化して、auth-ldap.conf.extを有効化。

これで、LDAP認証や情報取得ができるようになった。

LMTPでメールを受け取れるようにする

Postfixがメールを受け取ったメールはどうなるのか?

通常、メールを受けたらユーザーのメールボックスにメールを保管する。
それをmailコマンドとかで読むと、メールボックスからメールが削除される。
(mailコマンドは、読んだメールを~/mboxというファイルに保管していた)

今回は、DovecotでIMAPサービスを提供するのだが、この場合には、Postfixは受け取ったメールをDovecotに送る必要があるらしい。
Dovecotはメールを受け取るために、LMTPのソケットを用意している。

ただし、初期設定では/var/run/dovecot/lmtpにあるので、chrootして動くPostfixからはアクセスができない。
そこで、ソケットの場所をchrootされた先に移動しておく。
Support needed creating Dovecot listener on Debian ( postfix)

/etc/dovecot/conf.d/10-master.conf

...
service lmtp {
  #unix_listener lmtp {
    #mode = 0666
  #}

  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
...

Sieveの設定

メール受信時のルールを処理する機能だが、SOGoはルールをデーターベースに保管するようだった。
そして、そのルールをDovecotが動作したときに動くようにファイル出力している。

デフォルトのままだと、フィルターを作成したときに.dovecot.sieveというファイルが作られ、Web UIでフォルダとして見えてしまう。
そのため、先頭の.を削除している。

/etc/dovecot/conf.d/90-sieve.conf

...
  #sieve = file:~/sieve;active=~/.dovecot.sieve
  sieve = file:/var/vmail/%n/sieve;active=/var/vmail/%n/dovecot.sieve
...

ルールは作られるけれど、LMTPでメールのフィルターが動作しなかった。
探してみたところ、LMTPにプラグインを追加することで動作することが分かった。
stack overflow / Dovecot Sieve filters not working

/etc/dovecot/conf.d/20-lmtp.conf

...
protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins
  mail_plugins = $mail_plugins sieve
}

本当にこれで良いのか…よく分からないけれども、これでフィルターが動くようになった。
また、IMAPで見る限りにおいて、sieve関連のディレクトリは見えなくなった。

SSL証明書の設定

構築中のサーバーの外からアクセスしてくるメールクライアントには、IMAPSを提供する。
用意していたSSL証明書と秘密鍵を使用するように設定。

/etc/dovecot/conf.d/10-ssl.conf

...
#ssl_cert = </etc/dovecot/private/dovecot.pem
#ssl_key = </etc/dovecot/private/dovecot.key
ssl_cert = </etc/ssl/private/sogo.hogeserver.hogeddns.jp.crt
ssl_key = </etc/ssl/private/sogo.hogeserver.hogeddns.jp.key
...

SOGoの側でIMAPを使うように設定

SOGoにIMAPの設定を入れる。
iRedMail / Why no sieve support (Vacation, Forwarding) in SOGo Groupware

/etc/sogo/sogo.conf

...
  /* Mail */
  SOGoDraftsFolderName = Drafts;
  SOGoSentFolderName = Sent;
  SOGoTrashFolderName = Trash;
  SOGoJunkFolderName = Junk;
  SOGoMailSpoolPath = /var/spool/sogo;

  SOGoIMAPServer = "imap://127.0.0.1";
  NGImap4AuthMechanism = "plain";
  NGImap4ConnectionStringSeparator = "/";

  SOGoSieveServer = "sieve://127.0.0.1:4190";
  SOGoSieveScriptsEnabled = YES;
  SOGoVacationEnabled = YES;
  SOGoForwardEnabled = YES;

  //SOGoTimeFormat = "%H:%M";
  SOGoShortDateFormat = "%y/%m/%d"; // 公式には説明されていない設定値
  //SOGoLongDateFormat = "%Y,%B,%d,%A";
...

なお、2024/01/03現在、SOGoVacationEnabledをYESにすると、メールの設定を変更できない問題が発生している。
インストールマニュアルに記載はなかったが、SOGoShortDateFormatを設定してみたところ問題を回避できたので、書いてみている。

設定の反映

これまでに入れてきた設定変更を反映させる。
ただし、DovecotはPostfixのユーザーがいることを期待しているので、Postfixをインストールした後で反映させる。

$ sudo systemctl restart sogo memcached

Postfix

PostfixとLDAPサポートをインストールして、設定を進めて行く。

$ sudo apt install -y postfix postfix-ldap

Postfixはインストール時に問い合わせをしてくるが、以下の通り回答している。

  • General mail configuration type: Internet Site
  • System mail name: sogo.hogeserver.hogeddns.jp

メールの受信設定

仮想メールボックスを設定する。

  • myhostnameはsogo.hogeserver.hogeddns.jpであり、このドメインへのメールを受け付ける。
    SOGoで送受信したいのは、hogserver.hogeddns.jpなので、それをvirtual_mailbox_domainsに設定する。
    これで、hogeserver.hogeddns.jp宛のメールを受け取ろうとしてくれる。
  • 受信者のリストは、virtual_mailbox_mapsで指定する。
    ここに、ldapの検索条件を指定しておく。
  • エイリアスのリストは、virtual_alias_mapsで指定する。
    各ユーザーが持つ別メールアドレスと、グループが持つメールアドレスの検索条件を指定しておく。
  • 受信者がいる場合には、Dovecotにメールを配信する。
    Dovecotでソケットの位置を/var/spool/postfix/private/dovecot-lmtpに移動しているから、ここではprivate/dovecot-lmtpと相対パスで指定している。
  • virtual_mailbox_baseは保険として設定しておくもののようだった。
    何か設定に失敗しても、/var/mail/<完全な受信者のアドレス>にメールが保管されるようになる。

/etc/postfix/main.cf

...
# for SOGo
virtual_mailbox_domains = hogeserver.hogeddns.jp
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf ldap:/etc/postfix/ldap-groups.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_base = /var/mail

virtual_mailbox_mapsで指定したユーザーの検索条件。

/etc/postfix/ldap-users.cf ※新規作成

server_host = ldaps://addc.hogeserver.hogeddns.jp
bind = yes
version = 3
bind_dn = ssoauth@hogeserver.hogeddns.jp
bind_pw = p@ssword123
search_base = CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
query_filter = (&(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(objectClass=user)(mail=%s))
scope = one
result_attribute = mail

virtual_alias_mapsで指定した「ユーザーが持つ別メールアドレス」の検索条件。

/etc/postfix/ldap-aliases.cf ※新規作成

server_host = ldaps://addc.hogeserver.hogeddns.jp
bind = yes
version = 3
bind_dn = ssoauth@hogeserver.hogeddns.jp
bind_pw = p@ssword123
search_base = CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
query_filter = (&(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(objectClass=user)(otherMailbox=%s))
scope = one
result_attribute = mail

virtual_alias_mapsで指定したグループが持つメールアドレスの検索条件。
他と違ってspecial_result_attribute = member を指定しているが、これによってグループに含まれるメンバーが展開され、leaf_result_attributeを使うことで展開されたメールアドレスのみを取り出すようにしている。

/etc/postfix/ldap-groups.cf ※新規作成

server_host = ldaps://addc.hogeserver.hogeddns.jp
bind = yes
version = 3
bind_dn = ssoauth@hogeserver.hogeddns.jp
bind_pw = p@ssword123
search_base = CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
query_filter = (&(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(objectClass=group)(mail=%s))
scope = one
special_result_attribute = member
leaf_result_attribute = mail

これらのファイルにはパスワードが含まれるので、root以外では見えないようにする。

$ sudo chmod 600 /etc/postfix/ldap-*.cf

ユーザーの認証設定

デフォルトでは、25/TCPでメールを受け付けていて…

  • 自分のサーバー宛のメールは受け取る。
  • サーバーの外から他のサーバーに宛てたメールは転送しない。
    サーバーの中から他のサーバーに宛てたメールは転送する。

という動作をしている。

SOGoとPostfixが同居しているので、SOGoのWebインターフェースから送信するメールはこのままでもOK。
また、ActiveSyncを利用してメールを送る場合も、SOGoがメールを送信するのでOK。

でも、サーバーの外からメールを送信するときにはユーザー認証が必要(25/TCPを緩めると、スパムメールの送信に使われてしまう)。
例えば、Thunderbirdの場合は、受信メールはIMAPで閲覧するが、メールを送信するのはSMTPなので、以下2つのいずれかの認証を受けるようにする。

  • SMTPS(SMTP over SSL/TLS)は、465/TCP、SSL/TLS
  • Submissionは、587/TCP、STARTTLS

これを実現するために、

  • SASLの機構を入れる。
  • SASLのメカニズムをLDAPにする。
  • PostfixでSubmissionとSMTPSを動かし、認証にSASLを使うようにする。

という設定をする。

早速、SASLをインストールする。

$ sudo apt install -y sasl2-bin

以前はインストール後にsaslauthdが立ち上がっていたけれど、Ubuntu 22.04では止まっていた。
なので、止める必要もなく、そのまま設定を進めて行く。

SASLのメカニズムをLDAPにする。
また、Postfixがchrootで動いているので、ドメインソケットが作られるディレクトリをchrootの先に移動する。
以前のバージョンでは、STARTの設定があって書き換えれば良かった記憶だが、今回はなかったので行追加。

/etc/default/saslauthd

...
# Example: MECHANISMS="pam"
MECHANISMS="ldap"
...
# running in a chroot.
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

START=yes

ドメインソケットが作られるディレクトリは存在しないため、作成してグループをsaslに変更しておく。

$ sudo mkdir -p /var/spool/postfix/var/run/saslauthd
$ sudo chgrp sasl /var/spool/postfix/var/run/saslauthd

メカニズムをLDAPに変更したので、/etc/saslauthd.confを作成して条件を設定する。
/etc/default/saslauthdのコメントを見ると、cyrus-sasl2-docパッケージのLDAP_SASLAUTHDを参照せよとある。
Githubにマニュアルがあったので、これを見ながら設定値を作っていく。
https://github.com/winlibs/cyrus-sasl/blob/master/saslauthd/LDAP_SASLAUTHD

/etc/saslauthd.conf ※新規作成

ldap_servers: ldaps://addc.hogeserver.hogeddns.jp
ldap_version: 3
ldap_auth_method: bind
ldap_bind_dn: ssoauth@hogeserver.hogeddns.jp
ldap_bind_pw: p@ssword123
ldap_filter: (&(sAMAccountName=%u)(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(objectClass=user))
ldap_search_base: CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
ldap_scope: one

作成したファイルにパスワードが書かれているので、権限を変更しておく。

$ sudo chgrp sasl /etc/saslauthd.conf
$ sudo chmod 660 /etc/saslauthd.conf

SASLの設定ができたので、PostfixがSASL認証を使うように設定する。

/etc/postfix/sasl/smtpd.conf ※新規作成

pwcheck_method: saslauthd
mech_list: plain login

SMTPSで使用する証明書と秘密鍵を、用意したものに置き換える。
あわせて、SASL認証が失敗したら、要求を拒否するように設定する。

/etc/postfix/main.cf

...
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_cert_file=/etc/ssl/private/sogo.hogeserver.hogeddns.jp.crt
smtpd_tls_key_file=/etc/ssl/private/sogo.hogeserver.hogeddns.jp.key
...
# for SASL authentication
mua_client_restrictions = permit_sasl_authenticated, reject

SubmissionとSMPTSを有効にする。

/etc/postfix/master.cf

...
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
#  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
# Choose one: enable smtps for loopback clients only, or for any client.
#127.0.0.1:smtps inet n  -       y       -       -       smtpd
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
...

※最初はここに示したあたりが全てコメントアウトされているので、必要箇所の先頭#を削除して有効にする。

メールヘッダーの調整

メールを送信すると、ヘッダーにsogo→localhostへの送信履歴が残ってしまっている。

...
Received: from sogo.hogeserver.hogeddns.jp (mx.hogeserver.hogeddns.jp [192.168.110.10])
	by mx.rohhie.net (Postfix) with ESMTPS id E3BBA52000D
	for <rohhie@rohhie.net>; Sun, 31 Dec 2023 16:56:41 +0900 (JST)
Received: from localhost (localhost [127.0.0.1])
	by sogo.hogeserver.hogeddns.jp (Postfix) with ESMTP id 4134F21168
	for <rohhie@rohhie.net>; Sun, 31 Dec 2023 16:56:41 +0900 (JST)
From: "User Hoge" <hoge@hogeserver.hogeddns.jp>
...

これは、余所のサーバーに見せる必要が全然ないので、削除することにした。

/etc/postfix/main.cf

...
# Header edit
header_checks = regexp:/etc/postfix/header-edit

/etc/postfix/header-edit ※新規作成

/^Received: from localhost.*by sogo\.hogeserver\.hogeddns\.jp/ IGNORE

受信の方はこんな具合なので、問題はないだろう。

...
Received: from sogo.hogeserver.hogeddns.jp
	by sogo with LMTP
	id W91aNrQwkWVQHwAAVr3XNg
	(envelope-from <rohhie@rohhie.net>)
	for <hoge@hogeserver.hogeddns.jp>; Sun, 31 Dec 2023 18:13:24 +0900
Received: from mx.rohhie.net (unknown [192.168.110.222])
	by sogo.hogeserver.hogeddns.jp (Postfix) with ESMTPS id D540F21168
	for <hoge@hogeserver.hogeddns.jp>; Sun, 31 Dec 2023 18:13:24 +0900 (JST)
Subject: RE: test
...

※通信経路をマスクするためにちょっとだけ編集を加えているが、だいたいこんな感じ。

SOGoの設定

SOGoの側でSMTPを使うように設定する。
Postfixと同居していて、SMTPでメールを送信するので、認証は必要ない。

あわせて、リマインダーのメールが送信できるように設定する。
スケジュールを登録するときに、リマインダーが設定でき、画面表示orメール送信のいずれかが選択できるようになっている。

/etc/sogo/sogo.conf

...
  SOGoForwardEnabled = YES; // Devecotで入れた設定の最終行

  SOGoSMTPServer = "smtp://127.0.0.1";
  SOGoMailDomain = hogeserver.hogeddns.jp;
  SOGoMailingMechanism = smtp;
  SOGoForceExternalLoginWithEmail = NO;

  SOGoEnableEMailAlarms = YES;
...

リマインダーのメールは、cronで飛ばしている。

/etc/cron.d/sogo

...
# Email alarms - runs every minutes
# If you need to use SMTP AUTH for outgoing mails, specify credentials to use
# with '-p /path/to/credentialsFile' (same format as the sieve credentials)
* * * * *      sogo     /usr/sbin/sogo-ealarms-notify > /dev/null 2>&1
...

※コメントアウトされているので、先頭の#を削除して、有効化する。

時間が何も指定されていないのだけれど、これで1分ごとにこのコマンドが呼び出される。

設定の反映

ユーザーpostfixをグループsaslに追加して、saslauthdを開始。

$ sudo adduser postfix sasl
$ sudo systemctl start saslauthd

そして、これまでに入れてきたPostfixとSOGoの設定変更を反映させる。
先程保留していたので、Dovecotの設定も反映させておく。

$ sudo systemctl restart postfix sogo dovecot

ログの整理

ログの出力先を整理して、保存期間を設定する。

UFW

UFWは、標準でsyslogとufw.logにログを出力する。
出力先を/var/log/ufw.logのみに変更する。

/etc/rsyslog.d/20-ufw.conf

# Log kernel generated UFW log messages to file
:msg,contains,"[UFW " /var/log/ufw.log

# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
& stop

※最後の行の &stop を有効にする。

設定を反映。

$ sudo systemctl restart rsyslog

ログは週1回ローテーションされて、4週間保管される。
何かあったときのために…ということで、54週間保管してみる。

/etc/logrotate.d/ufw

/var/log/ufw.log
{
        rotate 54

        weekly
...

Apache

Apacheは、/var/log/apache2にログを出力するよう設定した。

ログは毎日ローテーションされて、14日間保管される。
これを54週間(378日)保管されるようにする。

/etc/logrotate.d/apache2

/var/log/apache2/*.log {
    daily
    missingok
    rotate 378
...

Dovecot

Dovecotは、標準でsyslogとmail.logにログを出力する。
出力先を/var/log/dovecot.logのみに変更する。

/etc/dovecot/conf.d/10-logging.conf

...
#log_path = syslog
log_path = /var/log/dovecot.log
...

ログをローテーションさせるために、以下のファイルを作っておいておく。
Web UIで受信トレイに1度アクセスしただけで、2KB程度のログが出るので、まぁまぁな量になりそうだけれど。
Dovecot Logging

/etc/logrotate.d/dovecot ※新規作成

/var/log/dovecot*.log {
  weekly
  rotate 54
  missingok
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
  doveadm log reopen
  endscript
  create 600 root root
  su root root
}

Postfix

Postfixは、標準でsyslogとmail.{log,err}にログを出力する。
出力先を/var/log/mail.{log,err}のみに変更するため、syslogへの出力対象から除外する。

/etc/rsyslog.d/50-default.conf

...
#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none,mail.none    -/var/log/syslog
#cron.*                         /var/log/cron.log
...

設定を反映。

$ sudo systemctl restart rsyslog

ログローテーションは、rsyslogを使う他のログと一緒に行われていた。
mail関連のファイルだけを切り出して、54週間に設定してみる。

/etc/logrotate.d/rsyslog

/var/log/syslog
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
        rotate 4
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
{
        rotate 54
        weekly
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

SOGo

SOGoのログ出力先は、/etc/sogo/sogo.confで指定できる。
今回は指定していないので、デフォルトの/var/log/sogo/sogo.logに出力されている。
特に変更の必要はないと思っている。

ログローテーションを54週間に変更する。

/etc/logrotate.d/sogo

/var/log/sogo/*.log {
        daily
        missingok
        rotate 54
        compress
        delaycompress
        notifempty
        copytruncate
        # requires logrotate >= 3.8.0
        su sogo sogo
}

テスト

ここまでの設定で、SOGoを使えるようになった。
かなり長かったが、これで終わりではない。テストしてみないと。

Web UI

https://sogo.hogeserver.hogeddns.jp/SOGo/ にアクセスすると、ログイン画面が現れる。
SOGo利用ユーザーのユーザー名とパスワードを入力して、右矢印をクリックするとログインできる。

自分にメールを送ったり、他のユーザーにメールを送ったり、色々試してみて、概ね問題ないところまで設定できたかな。

ただし、スケジュールとアドレス帳は確認していないし、その他の機能を全部試しているわけでもない。
何か問題を見つけたら、今後も記事を更新していく。

UbuntuデスクトップのThunderbird

メール

受信したメールはIMAPSで管理し、SMTPSでメール送信する。

どちらも自己署名証明書を使用しているので、プライベート認証局のCA証明書をインポートする必要がある。
設定 → プライバシーとセキュリティ → 証明書を管理

区分設定項目設定値
IMAPサーバー名sogo.hogeserver.hogeddns.jp
ポート番号993
接続の保護SSL/TLS
認証方式通常のパスワード認証
SMTPサーバー名sogo.hogeserver.hogeddns.jp
ポート番号Submission: 587
SMTPS: 465 のいずれか
接続の保護Submission: STARTTLS
SMTPS: SSL/TLS のいずれか
認証方式通常のパスワード認証
共通ユーザー名hoge@hogeserver.hogeddns.jp ※
パスワードhogeのパスワード

※これまでの設定で行くと、グループSOGo Usersに所属しているユーザーであればOK。

上記の設定で簡単にメール送受信を行い、とりあえずやりとりができるところまでは確認した。

カレンダー&アドレス帳

アドインを2つインストールして同期させる。

アドイン名機能使い方
TbSyncカレンダーやアドレス帳を同期する中央機能。https://github.com/jobisoft/TbSync/wiki/How-to-get-started
Provider for Exchange ActiveSyncTbSyncにActiveSyncの同期機能を提供する。https://github.com/jobisoft/EAS-4-TbSync/wiki/About:-Provider-for-Exchange-ActiveSync

この2つをインストールした上で、TbSyncアカウントマネージャー→アカウント操作→新規アカウントを追加→Exchange ActiveSyncの順にクリックし、カスタム設定で必要情報を入力していく。

Android

Android-x86のインストール

Android-x86は、ほぼこの手順のままでインストールができる。
まつこし(かり) / Windows10上で動作するAndroid-x86の仮想環境をVMware Workstation Playerで構築する

ウチではVMware Workstation 17 Playerを使用しており、インストール時にOSが自動検出されなかった。
そこで、参照先にあるように「FreeBSD バージョン 10以前」(64ビットじゃない方)を選択する。
これで、Android-x86に適切なハードウェアが構成されるものと思われる。

インストールもほぼ参照先にある手順でできる(ある程度分かっていれば、それぞれを上手く選択できると思う)。

インストール後に再起動すると、参照先にあるように真っ黒画面になってしまう。
そこで、

# reboot -f

で再起動し、GRUBでdebugを選択、一回[CTRL]+[d]を押してから、viでGrubメニューを編集して、以下を追記する。

/mnt/grub/menu.lst

...
title Android-x86 9.0-r2
        kernel /android-9.0-r2/dernel quiet root=/dev/ram0 SRC=/android-9.0-r2 nomodeset xforcevesa
        initrd /android-9.0-r2/initrd.img
...

※英語キーボード配列になっているので、コロン[:]は、[Shift]+[;]で入力。

保存後に再起動して通常起動すればGUIが起動し、初期セットアップがスタートする。

Androidはネットワークが使えないと、ほぼ何もできない。
このPCにはWi-Fiもないので、ブリッジもできないなと思っていたが、VirtWifiというのが選択できて、これを使えば問題なくネットワークにつながる。

ネットワークにつながりさえすれば、後はどうにか進めていける。
インストールを終えて思ったのは…凄いな、ほとんどそのままAndroidとして使えるじゃん!だった。

GmailでActiveSync

AndroidにはGmailが入っている。
一応、ストアで最新版に更新しておく。

今回の環境ではプライベート認証局が署名した証明書を使っている。
メールをセットアップするためには、プライベート認証局のCA証明書をインストールする必要があった。
そこで、以下でCA証明書をApacheのディレクトリにコピーし、クライアントからダウンロードができるようにした。

$ sudo cp /usr/local/share/ca-certificates//hoge-ca.crt /var/www/html

Android-x86でChromeブラウザーを開き、
 https://sogo.hogeserver.hogennds.jp/hoge-ca.crt
にアクセスすると、CA証明書がダウンロードされてインストールできる。

その後、Exchangeでアカウントを追加し、メールが見られるようになった。
もちろん、カレンダーなども同期できる。

ただし…過去のメールが見られなかった
この問題は解消できたが、全員にこの設定をするの?と少し不安になった。

設定の助けになりそうなこと

SOGoのアップデートを止める

今回、夜間ビルドのリポジトリを追加してSOGoをインストールした。
動きがある程度安定したら更新を止めておかないと、不安定な何かが入り込んでしまうかもしれない。

更新は、以下で止めることができた。

$ sudo mv /etc/apt/sources.list.d/sogo.list /etc/apt/sources.list.d/.sogo.list
$ sudo apt update

更新を再開したければ、ファイル名を元に戻せばOK。

$ sudo mv /etc/apt/sources.list.d/.sogo.list /etc/apt/sources.list.d/sogo.list
$ sudo apt update

気にしないでアップデートし続ける手もあるかもしれないけれど、別パッケージの過去の経験によれば、コミュニティエディションには時々熱いバグが入り込むことがあり、そうなると、アップデートを今か今かと待って試す日々が始まってしまう。

Githubの状態を確認しながら、良いタイミングでアップデートするのがいいのではないかと思うのだった。

LDAPサーバーへの問い合わせ

LDAPサーバーへの問い合わせが上手くいっているか、以下で確認ができる。

$ ldapsearch \
-H ldaps://addc.hogeserver.hogeddns.jp \
-b "CN=Users,DC=hogeserver,DC=hogeddns,DC=jp" \
-s sub \
-D "ssoauth@hogeserver.hogeddns.jp" \
-W \
"(&(sAMAccountName=hoge)(memberOf=CN=SOGo Users,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp))"

上から、接続先、検索のベースとなる場所、サブツリーを探す、バインドするユーザー、シンプル認証、フィルターを指定している。

これでテストをして、思い通りに検索できた条件を、各システムに合わせて設定していく。

Postfixへの問い合わせ

ユーザーのメールアドレスにメールが到着した場合、それが正しく届くのか、以下で確認ができる。

$ sudo postmap -q rohhie@hogeserver.hogeddns.jp ldap:/etc/postfix/ldap-users.cf
rohhie@hogeserver.hogeddns.jp

ユーザーが持つ別メールアドレスにメールが到着した場合、それがどこに届くのか、以下で確認ができる。

$ sudo postmap -q administrator@hogeserver.hogeddns.jp ldap:/etc/postfix/ldap-aliases.cf
root@hogeserver.hogeddns.jp

グループにメールが到着した場合、それがどこに届くのか、以下で確認ができる。

$ sudo postmap -q parent@hogeserver.hogeddns.jp ldap:/etc/postfix/ldap-groups.cf
hogewife@hogeserver.hogeddns.jp,hoge@hogeserver.hogeddns.jp

設定が間違っていると、何も表示されなかったり、別のメールアドレスが表示されるので、正しく届くことが確認できるまで設定を見直す。

IMAPへのログインと操作

IMAPにログインできるかどうか、以下で確認できる。

$ telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ STARTTLS AUTH=PLAIN] Dovecot (Ubuntu) ready.
tag login imapadmin p@ssword123
tag OK [CAPABILITY IMAP4rev1 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 BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in
tag logout
* BYE Logging out
tag OK Logout completed (0.001 + 0.000 secs).
Connection closed by foreign host.

IMAPSなら以下。

$ openssl s_client -crlf -connect localhost:993
CONNECTED(00000003)
Can't use SSL_get_servername
...
read R BLOCK
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] Dovecot (Ubuntu) ready.
tag login hoge@hogeserver.hogeddns.jp p@ssword123
tag OK [CAPABILITY IMAP4rev1 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 BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY SPECIAL-USE] Logged in
tag logout
* BYE Logging out
tag OK Logout completed (0.001 + 0.000 secs).
closed

SOGoのユーザーがログインできるかどうか、については、Web UIで確認すれば良いけれど、マスターユーザーでのログインを試すことができなかった。
そこで、コマンドでログインする方法を調べたもの。

ログローテーションのテスト

1つ1つのログローテーションをテストするなら、こんなコマンドが使える。

$ sudo logrotate -d /etc/logrotate.d/dovecot
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/dovecot
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
...
Creating new state

Handling 1 logs

rotating pattern: /var/log/dovecot*.log  weekly (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/dovecot.log
  Now: 2024-01-07 14:44
  Last rotated at 2024-01-07 11:50
  log does not need rotating (log has been rotated at 2024-01-07 11:50, which is less than a week ago)
not running postrotate script, since no logs were rotated

ただし、こうして直接実行すると、エラーが表示されるケースがある。

$ sudo logrotate -d /etc/logrotate.d/rsyslog
...
rotating pattern: /var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
 weekly (54 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mail.info
error: skipping "/var/log/mail.info" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
considering log /var/log/mail.warn
error: skipping "/var/log/mail.warn" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
considering log /var/log/mail.err
error: skipping "/var/log/mail.err" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
considering log /var/log/mail.log
error: skipping "/var/log/mail.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

メッセージに書かれているように、suでUID/GIDを指定すれば良いわけだけれど、元々そんなことしてないしな…
ということで確認してみたところ、こんな指定がされている。

/etc/logrotate.conf

...
# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm
...
# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may also be configured here.

大量に結果表示がされるので、大変になるけれど、こうやって実行すれば、想定通りに動いているかどうかが確認できる。

d$ sudo logrotate -d /etc/logrotate.conf
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apache2
...
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
...
rotating pattern: /var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
 weekly (54 rotations)
empty log files are not rotated, old logs are removed
switching euid from 0 to 0 and egid from 0 to 4 (pid 25963)
considering log /var/log/mail.info
  log /var/log/mail.info does not exist -- skipping
considering log /var/log/mail.warn
  log /var/log/mail.warn does not exist -- skipping
considering log /var/log/mail.err
  Now: 2024-01-07 14:49
  Last rotated at 2024-01-07 11:50
  log does not need rotating (log has been rotated at 2024-01-07 11:50, which is less than a week ago)
considering log /var/log/mail.log
  Now: 2024-01-07 14:49
  Last rotated at 2024-01-07 11:50
  log does not need rotating (log has been rotated at 2024-01-07 11:50, which is less than a week ago)
not running postrotate script, since no logs were rotated
switching euid from 0 to 0 and egid from 4 to 0 (pid 25963)
...

起きたこと

sogo-toolが動かない

sogo-toolでActiveSyncのデバイスを表示させようとしたところ、エラーになってデバイスが表示されなかった。

$ sogo-tool manage-eas listdevices hoge
2024-01-02 20:34:39.927 sogo-tool[3535:3535] ERROR(+[GCSFolderManager defaultFolderManager]): default 'OCSFolderInfoURL' is not configured.
...

このツールは、sogoユーザーで実行するのが良いらしい。

$ sudo -u sogo sogo-tool manage-eas listdevices hoge

メールの設定を変更できない

ユーザーrohhieで一通り上手くいったので、Administratorで動作を確認していたところ、フィルターが作成できなかった。
最初、何が起きているかよく分からなかったのだが、メールの設定に入ったところで他のメニューが押せなくなった。

ちょっと分かりづらいけれども、左ペインの「一般」「カレンダー」「アドレス帳」が非活性になっていて、押せない。

この状態になると、何かを変更しても、右上に薄く表示されているディスクマークがグレーのままで、設定を保存することができない。

最終的には、「設定」→「一般」→「短い日付の表示形式」を「年→月→日」の順で表示される形式に変更して、問題を回避できた。
順書さえそうなっていれば、どの形式を選択しても構わない。

これがなかなか見つけられず、最初には「休暇」タブを表示させないことで、この問題が回避できることを見つけた。

これをキーに探したところ、過去にはこの問題が言語に関係なく発生していたみたい。
でも、だいぶ前だし、修正されているようだ。
https://bugs.sogo.nu/view.php?id=5443

行き詰まってしまい、諦め掛けた頃に、rohhieユーザーでログインすると、問題発生しないことに気付いた。
hogeやadministratorだと問題発生する。なぜ!?

システムユーザーにrohhieはいるけれど、hogeやadministratorがいないから?
と思い、設定を調べたり、ユーザーを追加したりしたけれども、問題は解消できない。

ちょっと方向を変えよう、英語に変えてみたらどうか。
バグトラッキングシステムでも、この報告はされていないから、きっと英語圏では起きていないんだ。

これはあたり。hogeやadministratorで問題が発生しなくなる。英語だけでなく、様々な言語で問題は発生しない。
なぜ日本語でだけ問題が発生するんだ…

ならば、日本語表示に関わるところの問題か…と思い、
 /usr/lib/GNUstep/SOGo/PreferencesUI.SOGo/Resources/Japanese.lproj/Localizable.strings
  ↓
 /usr/lib/GNUstep/SOGo/PreferencesUI.SOGo/Resources/English.lproj/Localizable.strings
に置き換えたらどうか!とやってみたけれども、表示文字列が英語になっても問題は発生する。

では、何か個人の設定に違いがないか、と調べてみた。
次節の方法で c_defaults の値を取得して比較してみたところ、短い日付の表示形式が違っていることに気付いた。
これか!と気付いて、Web UIから設定をあわせてみたところ、問題が発生しなくなった。

でも、回避策が分かればいいってもんでもないよな。
新たに作られたユーザーに対して、最初にこの設定を変えてくれっていうのはちょっと変だ。
sogo.confで初期値を指定できないものか…と試したところ、上手くいったので、本編でもその手順としている。

言語を「简体中文」にしたら設定画面が見えなくなった

休暇タブを表示させると、メールの設定が変更できないのはなぜか…と調べていたとき、言語をくるくると切り替えていた。
そして、「简体中文」にしたら、設定画面が表示できなくなった。

言語をどうにかして戻さなければ…

まずは、言語の項目がなんなのかを探す。

$ sudo mariadb
MariaDB [sogo]> use sogo
MariaDB [sogo]> select c_settings from sogo_user_profile where c_uid = "hoge";
+---------------------------------------------------------------------------------------------------------------------------------------------+
| c_settings                                                                                                                                  |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| {"Contact":{},"Calendar":{"PreventInvitationsWhitelist":{}},"Mail":{},"General":{"PrivateSalt":"d9fde324ef5eb6987ea9bc9a96e4c6d4d487493a"}} |
+---------------------------------------------------------------------------------------------------------------------------------------------+

あれ?設定変更したはずなのに、settingsに設定値がない。
では、デフォルト設定を探してみよう。

MariaDB [sogo]> select c_defaults from sogo_user_profile where c_uid = "hoge";
... ,"SOGoFirstDayOfWeek":0,"SOGoLanguage":"ChineseChina","SOGoContactsCategories":[" VIP", ...

あった。物凄く長い一行に入っていた。

では、設定値をコマンドで見てみよう(ちゃんと値が見られれば、その値を設定し直すだけだから)。

$ sudo -u sogo sogo-tool user-preferences get defaults hoge SOGoLanguage
SOGoLanguage: "ChineseChina"

値を設定しようとしたけれども、拒否された。デフォルト値を設定しようとしたから?よく分からない。
そこで、未設定に変更することにした。

$ sudo -u sogo sogo-tool user-preferences unset defaults hoge SOGoLanguage

これで、デフォルト値に戻すことができた。

$ sudo -u sogo sogo-tool user-preferences get defaults hoge SOGoLanguage
SOGoLanguage: "Japanese"

Gmailアプリで受信トレイにある過去メールが見えない

Gmailを起動し、メールのアカウントを作成して、メールを同期したのだけれど、以下の症状が現れた。

  • 受信トレイにメールが見えない。
    新しく受信したメールは見えるけれど、過去のメールが見られない。
  • 送信済みにあるメールは見えている。

同期をリセットするために、デバイスをリセットしてみるか…(失敗)

$ sudo -u sogo sogo-tool manage-eas listdevices hoge
<0x0x55b7a87e0130[SOGoCache]> Cache cleanup interval set every 300.000000 seconds
<0x0x55b7a87e0130[SOGoCache]> Using host(s) '/var/run/memcached/memcached.sock' as server(s)
androidc970640448

MZTB330da80c77a83476a679d045251b

$ sudo -u sogo sogo-tool manage-eas resetdevice hoge androidc970640448

<0x0x5613fa6a93a0[SOGoCache]> Cache cleanup interval set every 300.000000 seconds
<0x0x5613fa6a93a0[SOGoCache]> Using host(s) '/var/run/memcached/memcached.sock' as server(s)

これは、アカウントを作り直すまで同期ができなかった。

では、フォルダーをリセットしてみよう。

$ sudo -u sogo sogo-tool manage-eas listfolders hoge androidc970640448

<0x0x5561dbbf53a0[SOGoCache]> Cache cleanup interval set every 300.000000 seconds
<0x0x5561dbbf53a0[SOGoCache]> Using host(s) '/var/run/memcached/memcached.sock' as server(s)
Folder Key: androidc970640448+folder13831523063e9165ba1f000056bdd736
   Folder Name: Trash

Folder Key: androidc970640448+folder28ebe23684f89165ec0c000056bdd736
   Folder Name: Templates

Folder Key: androidc970640448+folder2bf7fe2ef00891656815000056bdd736
   Folder Name: INBOX

Folder Key: androidc970640448+folder59aec419160991657915000056bdd736
   Folder Name: Sent

Folder Key: androidc970640448+folder7e0c943584f89165ec0c000056bdd736
   Folder Name: Junk

Folder Key: androidc970640448+folderab047519414d91659921000056bdd736
   Folder Name: Drafts

Folder Key: androidc970640448+vcard/personal
   Folder Name: 個人用アドレス帳

Folder Key: androidc970640448+vevent/personal
   Folder Name: 個人用カレンダー

Folder Key: androidc970640448+vtodo/personal
   Folder Name: 個人用カレンダー

$ sudo -u sogo sogo-tool manage-eas resetfolder hoge androidc970640448+folder2bf7fe2ef00891656815000056bdd736
<0x0x563815cea410[SOGoCache]> Cache cleanup interval set every 300.000000 seconds
<0x0x563815cea410[SOGoCache]> Using host(s) '/var/run/memcached/memcached.sock' as server(s)

この後で、Gmailアプリで受信トレイを更新したところ、過去のメールが見られるようになった。

答え合わせになるか ZEGを試してみる

セットアップが代替できたところで、ZEG(Zero Effort Groupware)があることが分かった。
すぐに使えるテスト環境とのこと。

VMwareでova(Open Virtualization Format)を「ファイル」→「開く」と仮想マシンができあがる。
どんな設定をすると良い感じで動くのか、試すことができそうだ。

ホームラボで動くように設定を変更

できあがった仮想マシンを起動してみた。

  • VMwareの動作なのかもしれないが、ネットワーク接続先がブリッジになっていた。
    どこに繋ぐのかという話で、ホームラボではNATの方が都合が良いので切り替えた。
  • 環境によっては本当にそのまま動くものと思われるが、今回は若干の設定変更が必要。
    • ネットワーク設定。(仮想マシンのethernet0.virtualDev = "e1000"を他のものに変えれば動くかも)
    • DNS設定。(必須ではないが、8.8.4.4からホームラボの192.168.110.10に変更)

仮想マシンにuser:sogo、pass:sogoでログインし、設定を変更する。

まずは、ネットワークが使えるようにしなくては。
NICの名前とMACアドレスを調べる。

$ ip a
...
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:a2:04:71 brd ff:ff:ff:ff:ff:ff

Netplanの設定を変更して、IPアドレスを指定する。
ここでは、固定のIPアドレスを振り出しているが、ホスト名がsogoでぶつかるのを避けようとしている。
(ホームラボではDHCPでアドレスを払い出したとき、DynamicDNSでホスト名が登録されてしまうから)
そういった余計な機能が動いていない環境ならば、DHCPでIPアドレスを払い出しても良さそう。

/etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        eth0:
            match:
                macaddress: 00:0C:29:A2:04:71
            set-name: enp0s3
           #dhcp4: true
            addresses:
            - 192.168.110.40/24 ← 固定のIPアドレス
            routes:
                - to: default
                  via: 192.168.110.10 ← ルーターのIPアドレス
#        enp0s3:
#            dhcp4: true
#            match:
#                macaddress: 02:7f:55:95:07:8e
#            set-name: enp0s3
    version: 2

設定を反映して、ネットワークの設定を確認する。

$ sudo netplan apply
$ ip a
...
    link/ether 00:0c:29:a2:04:71 brd ff:ff:ff:ff:ff:ff
    inet 192.168.110.40/24 brd 192.168.110.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea2:471/64 scope link
       valid_lft forever preferred_lft forever

続いて、DNSの設定を変更する。

ZEGではSamba AD DCがDNSを担当している。
デフォルトでは、DNSは8.8.4.4にフォワードしているので、ホームラボのDNSに変更する。
これで、ホームラボの中にあるサーバーにアクセスができるようになる。必要ではないけれど。

/etc/samba/smb.conf

  dns forwarder = 192.168.110.10

設定を反映させれば、Samba ad dcもこのIPアドレスを認識して、名前解決ができるようになる。

$ sudo systemctl restart samba-ad-dc

Samba ad dcの名前解決を試す。
ZEGははIPアドレスで動くように設定されているので、名前解決できなくても問題はないけれど、一応どうなるか見てみる。
あわせて、今回構築した環境の名前解決ができるのかも確認してみる。

$ dig sogo.example.com +short
10.0.2.15
192.168.110.40

$ dig sogo.hogeserver.hogeddns.jp +short
192.168.110.164

もしも、sogo.example.comで設定したIPアドレスが表示されないときには、このコマンドを実行(確か、裏で時々動くはずだけれど)。

$ sudo /usr/sbin/samba_dnsupdate

これで、とりあえずは動くはずだ。
再起動する。

$ sudo reboot

仮想PCのコンソールに、こちらのメッセージが表示される。
最初はIPアドレスのところが空っぽだったが、今回はしっかり表示されている。

      ___           ___           ___
     /  /\         /  /\         /  /\
    /  /::|       /  /:/_       /  /:/_
   /  /:/:|      /  /:/ /\     /  /:/ /\
  /  /:/|:|__   /  /:/ /:/_   /  /:/_/::\
 /__/:/ |:| /\ /__/:/ /:/ /\ /__/:/__\/\:\
 \__\/  |:|/:/ \  \:\/:/ /:/ \  \:\ /~~/:/
     |  |:/:/   \  \::/ /:/   \  \:\  /:/
     |  |::/     \  \:\/:/     \  \:\/:/
     |  |:/       \  \::/       \  \::/
     |__|/         \__\/         \__\/

     Start using your applicance from
          http://192.168.110.40

sogo login: _

ZEGにいるユーザー

ZEGをちょっと調べてみたところは以下の通り。

  • ログインできるユーザーは2人いた。
    • vagrant(pass:vagrant)
    • sogo(pass:sogo)
  • Samba ad dcには3人のユーザーが登録されていた。これは、説明画面でも表示される。
    • sogo1、sogo2、sogo3(pass:sogo)
    • Super User指定はされていないので、試すときには/etc/sogo/sogo.confで設定

ブラウザーでアクセスする

NATの配下にUbuntu desktopがあるので、ここからZEGにアクセスしてみる。

http://192.168.110.40にアクセスすると、ZEGの説明ページが表示される。
Loginボタンがあったので、ログインしてみる。

ログインした画面で一番最初に気付いたのは、クォータが設定されているらしいこと。
「0% used on 2048 MB」と表示されている。

メールの設定を開くと、色々な箇所がグレーになって、設定が保存できなくなる問題が発生している。
今回書いた手順が間違っていて、問題が発生しているものと思ったが、そうでもなさそうなことが分かる。

それ以外に今回構築した環境との差は見つけられていないので、概ね上手くいっているといえそうだ。

設定の違いあれこれ

結果からすると、かなり参考になって、設定手順をブラッシュアップすることができた。

メールボックス

メールはこのディレクトリに保存されていた。
/var/spool/dovecot/<user name>/maildir
そして、LDAPで属性を取得したときに、user_attrs = cn=home=/var/spool/dovecot/%s としていた。

Dovecotの設定ファイルを見ると、mboxと至る所に書かれている気がしたので、最初はmbox形式で設定を進めた。
でも、ZEGがmaildir形式を採用しているので違いを調べてみると、どうやらmaildir形式の方が新しく、色々改良されていて、良いもののようだった。
そこで、mbox形式からmaildir形式に変更することにした。

また、メールを保管するディレクトリについて、当初は/var/mail-imap/としていた。
でも、保存先を見て、これなら/var/vmailでもいいなと思ったので、これも変更した。

その他、vmailというユーザーでログインできるようにもした。

vmailユーザー

仮想ユーザーのメールを管理するために、imapadminユーザーを作成していた。
でもこれ、一般的にはvmailというユーザーでやるらしい。

このvmailユーザーでメールを管理したいが、やり方がよく分からず、LDAPからユーザー情報を取りだしたとき、UID/GIDをvmailで上書きしていた。
ZEGでは、Dovecotにはmail_uid/mail_gidでこれを指定していたので、これに倣って修正。

データーベースの指定

設定ファイルにあった、SOGoProfileURL、OCSFolderInfoURL、OCSSessionsFolderURLの3つだけを指定していた。
ZEGでは、これに加えて、OCSEMailAlarmsFolderURL、OCSStoreURL、OCSAclURL、OCSCacheFolderURLの4つ、計7つが指定されていた。

これは追加した。

Alarmsって何だろうと思ったら、リマインダーのことだった。
この機能も動くように設定した。

さいごに

手順としては、まっすぐに設定するように書いたけれども、実際にはカットアンドトライ状態だった。
ちょっと動かすと不具合が見つかり、修正してみるとまた次の不具合が見つかる。
一直線に設定できるガイドがないのは、なかなか辛いものがある。

チューニングについても書かれているが、まだそれは読むことすらできていない。
全部がちゃんと動いているのかがよく分からないのだ。

もう少し安定して動作させられるように、色々と学習が必要だ。

ところで、Kopanoからの移住先については、ここで議論されていた。
Kopano forum / Nightly builds

さらに、移行のためのエクスポートについても語られている。

Yes, and it’s usually a bad point when no real export tool exists (eml files isn’t just a good method). At least Kopano ship Gilles Lamiral’s ImapSync which allows to workaround missing export functionality, even if it’s a more a mess than it should be.

そう、そして、本当のエクスポートツール(emlファイルだけが良い方法ではない)が存在しないのは、通常悪い点です。少なくともKopanoはGilles LamiralのImapSyncを出荷しており、不足しているエクスポート機能を回避することができます。

DeepL先生の翻訳

確かにそうなんだよなぁ…どうやってデーターを移行するのか、という点は、よくよく考えないと。
移行手順を確立してからでないと、本番稼働には到底持って行けない。

移住までには、もう少し時間が掛かりそうだ。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他