FreeBSDのsendmailの息の根を止めるには。

自宅サーバsendmailは正直不要です。と思うことはしばしば。

てっとり早く結論を言えば、以下を/etc/rc.confに追記すればよい。なお、「sendmail_enable = "NONE"」はもう使われていないので注意。詳細は後述。

/etc/rc.confへの追記

  sendmail_enable="NO"
  sendmail_submit_enable="NO"
  sendmail_outbound_enable="NO"
  sendmail_msp_queue_enable="NO"

しかし、handbook 29.4.2 Disable sendmail に記載の通り、以下の懸念がある(2012/3/1)。

Warning: もしこの方法で sendmail のメール送信機能を無効にしたのなら、 完全に動作する代替メール配送システムと置き換えることが重要です。 さもなければ、periodic(8) などのシステム機能は、 それらの結果を通常想定しているようにメールで配送することができなくなるでしょう。
システムの多くの部分が sendmail 互換のシステムがあることを想定しているかもしれません。 もしそれらを無効にした後に、 アプリケーションがメールを送ろうとするために sendmail のバイナリを使用し続ければ、 メールは使われていない sendmail のキューに入り、そして決して配送されないでしょう。

つまりroot等に送られるreportがsendmailのキューにたまり続ける。
(なお、日本語版handbookはどうしても古くなりがちなので、原版も確認すること!)


FreeBSDのベースシステムが送るメールなら、periodicあたりを修正すればよいだろうが、portsなどからインストールするソフトウェアのことも考えるときりがない。
sendmailを動かしたくない目的にもよるが、現実的なところでは外部からのsmtp接続を無効にするだけでいいだろう。
こうした場合の別の懸念としては、意図せずに自サーバが外部へのsmtp接続を試みること、さらに言えば、おかしなメールをバラ撒こうとすることだ。
が、仮に外部へのsmtp接続を無効にしたくとも、rc.confの設定だけではできないようだ。これについては改めて考える。


外部からのsmtp接続を受け付けない場合には、/etc/rc.confに下記を追加すればよく、かつ少なくとも9.0、8.2ではデフォルト設定だ。

/etc/rc.confでの外部からのsmtp接続を受け付けない設定

以下のみを/etc/rc.confに追記

sendmail_enable="NO"

なお、上記はデフォルト

$ uname -v
FreeBSD 8.2-RELEASE-p3 #0: Tue Sep 27 18:07:27 UTC 2011     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
$ grep sendmail_enable /etc/defaults/rc.conf
sendmail_enable="NO"    # Run the sendmail inbound daemon (YES/NO).


【参考】以下はもう使われていないので注意。

sendmail_enable = "NONE"

man rc.sendmailより

sendmail_enable
(中略)
The ``NONE'' option is deprecated and should not be used.  It will be removed in a future release.


さらにkwsk

FreeBSDにおけるsendmail起動の設定は、以下の変数にYES/NOを代入することで行う。
使い方はrc.sendmail(8)に記載されている。

sendmail_enable=
sendmail_submit_enable=
sendmail_outbound_enable=
sendmail_msp_queue_enable=

これらは最初の3つと1つに分かれる。
最初の3つはセットになっており、一つ目がYESの場合は残り二つが参照されない。
一つ目がNOで、二つ目がYESの場合は最後の一つが参照されない。
したがって、3パターンの設定ができることになり、各パターンについて調べた結果は以下の通り。


・パターン1: デフォルト
外部からのsmtp接続を受け付けない。
内部からのsmtp接続は受け付け、外部への送信は可能。

sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="YES"

・パターン2:
外部、内部ともにsmtp接続を受け付けない。
つまりroot等に送られるreportも届かなくなる。
ただちょっと分からないのは、「"local mail queue management"を提供する」とmanには記載されているのだが、外部、内部ともにsmtp接続を受け付けない状態でのlocal mail queueとはいったいなんだろうか。一応、この状態ではroot権限でsendmailが「Queue runner」として起動する。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="YES"

パターン3:
この状態ではroot権限のsendmailは一切起動しない。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"

上記を別の形で表現すれば以下の通り。(rc.sendmail(8)より引用)

  # MTA
  if (${sendmail_enable} == NONE)
  # Do nothing
  else if (${sendmail_enable} == YES)
       start sendmail with ${sendmail_flags}
  else if (${sendmail_submit_enable} == YES)
       start sendmail with ${sendmail_submit_flags}
  else if (${sendmail_outbound_enable} == YES)
       start sendmail with ${sendmail_outbound_flags}
  endif

  # MSP Queue Runner
  if (${sendmail_enable} != NONE &&
      [ -r /etc/mail/submit.cf] &&
      ${sendmail_msp_queue_enable} == YES)
  start sendmail with ${sendmail_msp_queue_flags}
  endif


なお、sendmail_msp_queue_enableは、smmsp権限で動くQueue runnerの動作スイッチ。
NOを指定すれば起動しない。