‘Dovecot’ タグのアーカイブ

aikawa

ソースからビルドしたDovecotにpigeonholeを入れる

以前Dovecotをソースからビルドしましたが、dnfでdovecot-pigeonholeを入れても(当然)動かなかったので、別途入れる事にしました。








https://pigeonhole.dovecot.org/download.html

こちらから安定版リリースを取得。
いつの間にか、pigeonholeとmanagesieveが一つのパッケージにまとまっていました。

make

デフォルトで/usr/localに入るようで、configureでディレクトリ指定のオプションは不要でした。

tar xzf dovecot-2.3-pigeonhole-0.5.20.tar.gz 
cd dovecot-2.3-pigeonhole-0.5.20/
./configure
make
make install

Dovecot 設定

/usr/local/share/doc/dovecot/example-config/conf.d/ にsieveのconfが出来るので、sieve関連のファイルを/usr/local/etc/dovecot/conf.d/へコピーします。

cp /usr/local/share/doc/dovecot/example-config/conf.d/*sieve*.conf /usr/local/etc/dovecot/conf.d/
  • 20-managesieve.conf

以下のコメント化を解きます。

protocols = $protocols sieve
service managesieve-login{
  inet_listener sieve {
    port = 4190
  }
}
service managesieve{
}

90-sieve.confはデフォルトのままで動作するので、編集不要です。

LMTP配信

以下、sieveがLMTPで動作するように設定します。

  • 10-master.conf
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
}

今回はRoundCubeへログインするアカウントが、メールアドレス形式(yamada@virtual.localdomain 等)なので不要ですが、ユーザ名のみ(yamada 等)の場合はauth_username_format = %nを設定します。
※下手に設定するとログイン出来なくなります。

  • 20-lmtp.conf

postmasterは実在するユーザの誰かを指定します。

protocol lmtp {
  postmaster_address = yamada@virtual.localdomain
  mail_plugins = $mail_plugins sieve
}

編集が終わったら、リロードします。

doveadm reload

Postfix

  • /etc/postfix/main.cf

virtualユーザを対象にします。

virtual_transport = lmtp:unix:private/dovecot-lmtp

RoundCube

  • config/config.inc.php

pluginsにmanagesieveを追加します。

$config['plugins'] = ['acl', 'managesieve'];

RoundCubeも同じサーバで動作しているので、plugins側の設定ファイルはなくても動作しますが、一応設定ファイルをコピーしておきます。

cp -p plugins/managesieve/config.inc.php.dist plugins/managesieve/config.inc.php

サーバが異なる場合は、managesieve_hostを変更して下さい。

RoundCubeにログインして設定を開くと、フィルターが追加されています。

動作するか確認するため作成を押して、件名 Subjectに「test」が含まれていたらtestフォルダへ移動させてみます。

これで自分宛に件名を「test」を含んだメールを送って、テストフォルダへ到達していれば完了です。

aikawa

Dovecotのpush_notificationを使う前にソースからのビルドが必要だった話

Dovecotのイベントごとにプッシュ通知をするpush_notificationという機能が有ったので、やってみようと思ったら、CentOS Stream 9 の Dovecot(rpm)はLuaをサポートしていないため、mail-luaプラグインを使おうとするとエラーになりました。

OXもchronosもDovecot Pro用なので動かず、dlogはdebug_logに出力するだけなので、ちょっと動かす意味が薄そうです。



そこで、ソースからビルドする事になりました。

因みにどんなイベントをキャッチできるかというと、以下のようです。
使い道がぱっとは考え付かないですが、統計取ったりするのに役立つかも知れません。

  • フラグクリア
  • フラグセット
  • メールボックス作成
  • メールボックス削除
  • メールボックスの名前変更
  • メールボックス購読
  • メールボックス購読解除
  • メッセージ追加
  • MessageExpunge
  • メッセージNew
  • メッセージ読み取り
  • メッセージゴミ箱

ビルド

こちらからソースファイルをダウンロードします(現時点では2.3.20)。





luaは使うのでオプションに含むのですが、他にも主だったものは入れておきたいので、configureは以下のようにしました。

./configure --with-ldap --with-pam --with-sql --with-solr --with-pgsql --with-sqlite --with-mysql --with-lua

そこで依存関係をdnfでインストールします。Luaはオプションもいずれ使うだろうし、lua-*で全部入れておきます。

dnf install openldap-devel pam-devel expat-devel libpq-devel mariadb-connector-c-devel sqlite-devel lua lua-*

早速 ./configureをしてみた所エラーが。



configureに必要な肝心のlua-develが無いっぽいです。



EPELにLua5.1版が有ったので試したんですが、Dovecot 2.3.15でLua5.2までのサポートを切っているのでconfigureまでは通るんですが、makeでエラーが出てしまいました。

さてどうしようと思ったところ、CRBリポジトリに有るという話が。早速入れてみます。

dnf install lua-devel --enablerepo=crb

ここでmakeしても同じエラーが出て、あれっと思い暫く色々とやった結果、再度configureが必要なだけのようでした。Lua5.1版のファイルを見てたんですね。





で、makeが長い。VirtualBoxでやった所30分くらい掛かっていました。make installもそこそこ長いです。

tar xzf dovecot-2.3.20.tar.gz
cd dovecot-2.3.20/
./configure --with-ldap --with-pam --with-sql --with-solr --with-pgsql --with-sqlite --with-mysql --with-lua
make
make install

これで/usr/localにインストールされます。でもsystemctlの設定は上書きしてしまうようなので、dovecotは停止しておきましょう。

設定

設定ファイルを置く/usr/local/etc/dovecot/ は当初空なので、サンプルが有るのでそちらをコピーするか、使っていた設定をコピーします。

# サンプルをコピーするなら
cp -r /usr/local/share/doc/dovecot/example-config/* /usr/local/etc/dovecot/
# すでに動いている/etc/dovecotからコピーするなら
cp -r /etc/dovecot/* /usr/local/etc/dovecot/
  • /usr/local/etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota mail_lua notify push_notification push_notification_lua
  • /usr/local/etc/dovecot/conf.d/90-plugin.conf
plugin {
  push_notification_driver = lua:file=/home/vmb/dovecot-push.lua
  push_notification_driver2 = dlog
}

virtualドメインのユーザはvmbで動かしているので、/home/vmbに取り合えずluaファイルを(実行権限を付けて)置きます。

  • /home/vmb/dovecot-push.lua
#!/usr/bin/lua
os.execute("/usr/bin/php /home/vmb/dovecot-push.php");

Luaの使えない私は、PHPを呼び出して動くかどうかを見ます。

  • /home/vmb/dovecot-push.php
<?php
$str = print_r($_SERVER, 1);
file_put_contents(__DIR__."/push.log", $str, LOCK_EX);
echo $str;

ここでdovecotを起動・またはリロードします。

# 起動
/usr/local/sbin/dovecot
# リロード
/usr/local/sbin/dovecot reload

RoundCubeでフォルダの購読をオンオフ等してみて、/home/vmb/push.logが出来れば取り合えず動いている事が確認出来ます。出力は以下のようになりました。

Array
(
    [PROCESS_MIN_AVAIL] => 0
    [DOVECOT_CHILD_PROCESS] => 1
    [SOCKET0_SETTINGS] => imap
    [SOCKET_COUNT] => 2
    [LOG_DEBUG] => 
    [STATS_WRITER_SOCKET_PATH] => /usr/local/var/run/dovecot/stats-writer
    [CONFIG_FILE] => /usr/local/var/run/dovecot/config
    [PWD] => /var/spool/mail/vhosts/virtual.localdomain/aikawa
    [LOG_SERVICE] => 1
    [SERVICE_COUNT] => 1
    [GENERATION] => 35
    [PROCESS_LIMIT] => 1024
    [SERVICE_NAME] => imap
    [DOVECOT_HOSTDOMAIN] => localhost
    [CLIENT_LIMIT] => 1
    [IDLE_KILL] => 60
    [RESTRICT_SETEXTRAGROUPS] => 97
    [DOVECOT_HOSTNAME] => localhost.localdomain
    [SHLVL] => 0
    [DOVECOT_VERSION] => 2.3.20
    [SOCKET1_SETTINGS] => imap-master
    [DOVECOT_PRESERVE_ENVS] => TZ CORE_OUTOFMEM CORE_ERROR
    [_] => /usr/bin/php
    [PHP_SELF] => /home/vmb/dovecot-push.php
    [SCRIPT_NAME] => /home/vmb/dovecot-push.php
    [SCRIPT_FILENAME] => /home/vmb/dovecot-push.php
    [PATH_TRANSLATED] => /home/vmb/dovecot-push.php
    [DOCUMENT_ROOT] => 
    [REQUEST_TIME_FLOAT] => 1674196790.2264
    [REQUEST_TIME] => 1674196790
    [argv] => Array
        (
            [0] => /home/vmb/dovecot-push.php
        )

    [argc] => 1
)

pwdからユーザくらいは特定出来そうですが、何のイベントかまでは分からないようなので、次回はluaを使ってイベントごとに取得出来るようにしたいです。

aikawa

DovecotのQuotaをSQLで個別に設定

前回の投稿 にクォータを加えて、個人別に容量を制限出来るようにしてみます。






※使用したDovecotのバージョンは2.3.16でした。2.2.19以降であれば恐らく設定をそのまま使えると思います。












まずは、全員共通の設定が出来るようにします。

Dovecot設定

  • /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins quota
  • /etc/dovecot/conf.d/20-imap.conf
protocol imap{
   mail_plugins = $mail_plugins imap_quota
   # ...
}
  • /etc/dovecot/conf.d/90-quota.conf
plugin {
  quota_rule = *:storage=100M
  # res postfix
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is full"
}

# ...

# backend
plugin{
  quota_vsizes = yes
  quota = count:User quota
}
# for postfix
service quota-status {
  executable = quota-status -p postfix
  inet_listener {
    port = 12340
    # You can choose any port you want
  }
  client_limit = 1
}

quota_status_*とservice quota-statusはPostfix用の設定で、Dovecot 2.2からはPostfix用ポリシーサービスを使えるようになり、PostfixはDovecotにquotaのお伺いを立てるだけで良いようです。



https://blog.sys4.de/postfix-dovecot-mailbox-quota-en.html

バックエンドには2.2.19からcountが追加され、新規インストールにはcountを使う事を推奨しているようですのでcountを使います。
https://doc.dovecot.org/configuration_manual/quota_plugin/

Postfix設定

  • /etc/postfix/main.cf
smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12340

これでPostfixは送信前にDovecotへお伺いを立てるようになります。



ここまでの設定で、全員が100MBの容量制限を設定されました。



DovecotとPostfixをリロードしてRoundCubeで見ると、確かに100MBの制限が入っています。





次は個人ごとの設定です。

PostgreSQL

psqlコマンドラインでクォータ用カラムを追加します。



取り合えず細かい容量設定は必要無いのでquota_mbとして、MB単位での入力にしておきます。

ALTER TABLE mail_users ADD quota_mb integer DEFAULT 100;
DROP VIEW user_view;
CREATE VIEW user_view AS SELECT *,
    name||'@'||domain AS mail,
    '/var/mail/vhosts/'||domain||'/'||name AS dovecot_home,
    domain||'/'||name||'/Maildir/' AS maildir,
    '*:storage='||quota_mb||'M' AS quota_rule
    FROM mail_users;

user_viewにquota_ruleを追加する事で、前回のdovecot-sql.conf.extならquota_ruleを個別に適用してくれます。



Dovecotをリロードしてquota_mbの値を10にUPDATEしてみると、RoundCubeも10MBに更新されています(UPDATEするたびに値が変わるので、結構楽しいです)。

doveadm userでも10MBになっている事が確認出来ます。



ここで自分宛に送って10MB容量いっぱいにしてから送信をすると、送信時にエラーメッセージが表示され、送信出来ない事が確認出来ました。

これで全体の100MBでなく、ちゃんと個別の10MBで制限されている事が確認出来ました。








aikawa

CentOS Stream 9でRoundCubeの簡易テスト環境を作る

以前CentOS6でRoundCubeのテスト環境を作っていましたが、今回はCentOS Stream 9です。



postfixにSMTP認証がデフォルトで入っているらしく、無効にする事も考えましたが調査が必要そうなのと、それよりもSMTP認証をした方が早そうだったので、設定する事にしました。






SELinuxはpermissiveにして試しています。

PostfixとDovecot

インストールして有効化・起動します。

dnf -y install postfix dovecot
systemctl enable postfix dovecot
systemctl start postfix dovecot

設定は以前に加えてSMTP認証用の追加が必要になります。

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

service auth内のunix_listener項を有効にして、user,groupを追加します。

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

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

auth_mechanisms = plain login

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

mail_location = maildir:~/Maildir

/etc/postfix/main.cf

# myhostnameとhome_mailboxを編集
myhostname = localhost.localdomain
home_mailbox = Maildir/

# sasl認証関連を追加
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

設定後はリロード

systemctl reload postfix dovecot

RoundCube

installer/ 等でconfigの設定をします。先にfirewall-cmdで80番ポートも空けておきます。

firewall-cmd --add-service http --permanent
firewall-cmd --reload

config/config.inc.php

IMAP, SMTPサーバともにlocalhost.localdomainを指定して、SMTPはポート25も指定します。

IMAPポートは変更の必要が有りません。

$config['default_host'] = 'localhost.localdomain';
$config['smtp_server'] = 'localhost.localdomain';
$config['smtp_port'] = 25;

送受信に問題ないか試します。installer内でチェックをしても良いし、RoundCubeへログインして送受信しても構いません。

SubmissionポートでSMTPを利用する

追加でSMTPのサブミッションポートを利用してみます。但しTLSは使わない形です。

/etc/postfix/master.cf

tls関連は面倒が出ないよう切ってしまいます。また、reject_sender_login_mismatchもlocalhostではNG(Temporary lookup failure)になったので切っておきます。

submission inet n - n - - smtpd
# -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_sasl_local_domain=$myhostname
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
# -o smtpd_sender_restrictions=reject_sender_login_mismatch
 -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

※最後の行が折り返して見えますが、-o smtpd_recipient_restrictions=…と一行です。

  • RoundCubeのconfig.inc.phpのsmtp_portを587にして送信出来れば成功です。