はじめに
Dockerベースでpostfixの環境を作成しており、その際のつまづきポイントを記録として残す。
構成(前提条件)
環境としてはLinuxベースのhost(debian)にDockerにてイメージをフルスクラッチで作成。ベースイメージとしてはdebianのbookwormを採用。最初はminimumのイメージで作成していたが色々パッケージ不足等々で躓くところが多いので普通のイメージベースを採用しています。またLDAPにてユーザー管理を行う。
なにが起きたか
とりあえず正常に起動するところまでは設定を行いメールクライアントから送信テストを行った際に下記のエラーが出た。
まず疑った部分
logを見ると
error: unsupported dictionary type: ldap
が出ている。つまりLDAPが有効になっていない。しかしインストールしたパッケージを確認すると下記のようにpostfix-ldapは入れてある
# dpkg -l|grep postfix
ii postfix 3.7.10-0+deb12u1 amd64 High-performance mail transport agent
ii postfix-ldap 3.7.10-0+deb12u1 amd64 LDAP map support for Postfix
ii postfix-policyd-spf-python 3.0.4-2 all Postfix policy server for SPF checking
# dpkg -l|grep ldap
ii dovecot-ldap 1:2.3.19.1+dfsg1-2.1 amd64 secure POP3/IMAP server - LDAP support
ii libldap-2.5-0:amd64 2.5.13+dfsg-5 amd64 OpenLDAP libraries
ii libsasl2-modules-ldap:amd64 2.1.28+dfsg-10 amd64 Cyrus SASL - pluggable authentication modules (LDAP)
ii postfix-ldap 3.7.10-0+deb12u1 amd64 LDAP map support for Postfix
# dpkg -l|grep libc6
ii libc6:amd64 2.36-9+deb12u7 amd64 GNU C Library: Shared libraries
ii libc6-dev:amd64 2.36-9+deb12u7 amd64 GNU C Library: Development Libraries and Header Files
そしてモジュールのロードの設定としては下記のものを記載している。
# cat /etc/postfix/dynamicmaps.cf
# dict-type so-name (pathname) dict-function mkmap-function
ldap postfix-ldap.so dict_ldap_open
仮にこの記載が反映されていないのであれば
dynamicmaps=yes
でビルドされた物であればこの設定によりLDAPサポートが有効化されるはずなのでおそらくそこが問題?と思ったが結論としては下記のものが問題だった。
ふと有効な機能の確認をしていた際に最初は見逃していたが一行目に設定ファイル絡みのwarningが出ている。
# postconf -m
postconf: warning: /etc/postfix/dynamicmaps.cf: file is owned or writable by non-root users -- skipping this file
btree
cidr
environ
fail
hash
inline
internal
memcache
nis
pipemap
proxy
randmap
regexp
socketmap
static
tcp
texthash
unionmap
unix
設定ファイルのownerをrootにしてサービス再起動後確認するとldapが出てきた
# postconf -m
btree
cidr
environ
fail
hash
inline
internal
ldap
memcache
nis
pipemap
proxy
randmap
regexp
socketmap
static
tcp
texthash
unionmap
unix
ポイントとしてはDockerでホストのボリュームをマウントして設定ファイルを読み込ませているので、ここのファイルの権限が変化していたという事。最初にQueueに書けないというエラーの段階でQueueとMailDirの権限は疑っていて確認したが設定ファイルの権限はwarningが出ているだけで読み込まれていると思ったのでまさかの原因だった。
結論
Dockerを使用すると内部のUID/GIDに引きずられて色々な事が起きるのでファイルの権限系は適当にせずにしっかり設定しましょうという話・・・。