Postfix - Opendkim - ローカルソケットに接続できません

Postfix - Opendkim - ローカルソケットに接続できません

postfix が opendkim の UNIX ソケットに接続しようとすると、拒否エラーが発生します。実際のエラーは次のとおりです。

Sep 24 15:41:43 service-a-4 postfix/cleanup[17414]: warning: connect to Milter service unix:var/run/opendkim/opendkim.sock: Permission denied

によるとpostfix ドキュメントデフォルトでは、postfixは「chrootモード」で実行されるため、postfixは/var/spool/postfix/にロックダウンされ、postfix ドキュメント「chroot モード」で実行している場合、すべての milter (ソケット) 参照は相対的 (/var/spool/postfix に対して) になります。

私の設定は次のようになります:

# /etc/opendkim.conf
Socket local:/var/spool/postfix/var/run/opendkim/opendkim.sock

# /etc/postfix/main.cf
smtpd_milters = unix:/var/run/opendkim/opendkim.sock

今、テストメールを送信しようとすると、権限が拒否されたというエラーが表示されるので、いくつかの権限テストを試しました。

# Correctly lists the socket file
sudo su -s /bin/bash postfix -c "ls /var/spool/postfix/var/run/opendkim/opendkim.sock"

しかし、postfix として接続しようとすると何も起こりません。

# Does not work
sudo su -s /bin/bash postfix -c "nc -U -D /var/spool/postfix/var/run/opendkim/opendkim.sock"

# Does work (as root)
nc -U -D /var/spool/postfix/var/run/opendkim/opendkim.sock

この状況をデバッグしている間、SELinux は一時的に無効 (permissive) になっています。また、構成を変更するたびに両方のプロセス (opendkim と postfix) を再起動しています。

他に何が足りないでしょうか?

バージョン:

CentOS 6.5
Postfix v2.6.6
Opendkim v2.9

答え1

CentOS6 でテストしたところ、postfix は実際には「chroot」されていないようです。
私の設定:

# /etc/opendkim.conf
Socket local:/var/run/opendkim/opendkim.sock

# /etc/postfix/main.cf
smtpd_milters = unix:/var/run/opendkim/opendkim.sock

これにより、次のようになりますconnect to Milter service unix:/var/run/opendkim/opendkim.sock: Permission denied
ただし、ソケットの umask は 002 なので、次のようになりますsrwxrwxr-x. opendkim:opendkim opendkim.sock。umask

を 000 に変更すると、問題は解決します。それでも、opendkim で、ただ世界中に公開するよりも、ユーザー:グループを切り替える方が適切です。

環境:

centos 6.5 2.6.32-573.7.1.el6.x86_64
postfix 2.6.6-6.el6_5 @updates
opendkim 2.10.3-1.el6 @epel

答え2

これを見つけて、上記の回答で問題が解決しない場合は、私の問題はopendkimソケットフォルダーにグループ実行権限がないことによるものでした。/var/run/opendkim/

グループ権限が設定されていることを確認するために、cron @rebootを追加しました @reboot root chmod g+x /var/run/opendkim/

再起動後に次の警告が返されないように修正/パッチを適用します。

警告: Milter サービス unix:/var/run/opendkim/opendkim.sock に接続: 権限が拒否されました

私は 1 時間あたり 10 万通以上の電子メールに署名するため、TCP 接続は適切なソリューションではありませんでした。

答え3

記憶が正しければ、centos 6 の postfix は標準設定では chroot で実行されません。epel から opendkim を設定したとき、次の設定が付属していました。

Socket                  inet:8891@localhost

そのため、postfix でこれを有効にするには、main.cf に以下を追加するだけです。

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

en opendkimとpostfixの両方を再起動するキー、TrustedHosts、SigningTable、Keytable を適切に構成し、txt レコードを DNS に公開します。

ああ、忘れていましたが、postfix も opendkim グループのメンバーである必要があります。

答え4

postfix と opendkim が Unix ソケット経由で通信するには、opendkim がソケットを作成でき、postfix がソケットを読み取ることができる必要があります。

Debian では、postfix は chroot /var/spool/postfix として実行されるため、可能な設定の 1 つは次のとおりです。

/etc/opendkim.conf:
Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

/etc/postfix/main.cf:
smtpd_milters = unix:opendkim/opendkim.sock

/var/spool/postfix/opendkim が存在し、opendkim が所有している必要があります。

drwxr-xr-x 2 opendkim opendkim 4096 Jul 27 15:22 opendkim/

これにより、opendkim はソケットを作成し、postfix はディレクトリにアクセスできるようになりますが、postfix はまだソケットを読み取ることができません。

srwxrwx--- 1 opendkim opendkim 0 Jul 27 15:22 opendkim.sock=

ソケットを postfix グループに配置することもできます。

/etc/opendkim.conf:
UserID                  opendkim:postfix

srwxrwx--- 1 opendkim postfix 0 Jul 27 15:43 opendkim.sock=

または、postfix を opendkim グループに配置します。

$ usermod -a -G opendkim postfix

どちらも postfix に適切な権限を与える必要があります。これで postfix はメッセージに署名できるはずです。ディストリビューションによって動作が若干異なる場合がありますが、これで開始できるはずです。

理論的には、opendkim umask を 002 に変更することもできますが、そうするとソケットの世界が読み取り可能になり、おそらくセキュリティ上の問題となるため、お勧めしません。

関連情報