Solaris で sendmail バージョンアップ
はじめに
このページでは、Oracle Solaris 11.4 で sendmail を 8.18.2(2025年12月公開)に入れ替える手順を説明する。 sendmail の更新にはセキュリティ修正が含まれるため、新しい版を使う。
Oracle Solaris 11.4 の sendmail は IPS パッケージ(service/network/smtp/sendmail)で提供され、
SMF サービス svc:/network/smtp:sendmail として動作する。
Oracle のパッケージを使う場合の更新方法は pkg update である。
下に示すソースからのビルドは、IPS パッケージより新しい版が必要な場合の手順である。
ソースからビルドした sendmail は IPS で管理されないため、以後の pkg update でファイルが上書きされる場合がある。
設定を変更したら、メールの送受信テストを行う。
【関連する外部ページ】
- sendmail の Web ページ: https://www.sendmail.org/
- 配布ファイルと GPG 署名: https://ftp.sendmail.org/
- Oracle Solaris 11.4 での sendmail の管理: https://docs.oracle.com/cd/E37838_01/html/E61008/
sendmail-8.18.2 インストール手順
- インストールされている sendmail のバージョンの確認
次のコマンドを実行する。バージョンとコンパイル時の設定が表示される。
/usr/lib/sendmail -d0.1 -bv root
SMF サービスの状態は、次のコマンドで確認する。
svcs -p svc:/network/smtp:sendmail
SMTP の応答を確認するときは、次のコマンドを実行し、表示を見終わったら「QUIT」と入れる。
nc localhost 25 [情報が表示される] QUIT
- ソースの入手
- https://ftp.sendmail.org/
- sendmail.8.18.2.tar.gz と署名ファイル sendmail.8.18.2.tar.gz.sig をダウンロード
- 同じサイトの PGPKEYS で公開鍵を取得し、
gpg --verify sendmail.8.18.2.tar.gz.sig sendmail.8.18.2.tar.gzで署名を検証
- 展開とビルド
Solaris の /tmp はスワップ上のファイルシステムのため、作業には /var/tmp を使う。
cd /var/tmp rm -rf /var/tmp/sendmail-8.18.2 gzip -d < sendmail.8.18.2.tar.gz | tar -xvf - cd /var/tmp/sendmail-8.18.2 CC=gcc sh Build
- sendmail の停止
svcadm disable -t svc:/network/smtp:sendmail svcs -p svc:/network/smtp:sendmail
- 設定ファイルのバックアップ
次のファイルを /var/tmp にコピーする。存在しないファイルはコピーしなくてよい。
cp /etc/mail/sendmail.cf /etc/mail/submit.cf /var/tmp cp /etc/mail/aliases /etc/mail/trusted-users /etc/mail/local-host-names /var/tmp
- インストール
インストールの前に、ユーザ smmsp とグループ smmsp があることを確認する。
getent passwd smmsp getent group smmsp
確認できたら、キュー用ディレクトリの所有者を設定し、インストールする。
chown smmsp:smmsp /var/spool/clientmqueue cd /var/tmp/sendmail-8.18.2 CC=gcc sh Build install
- 設定ファイル(sendmail.cf, submit.cf)の作成
generic-solaris.mc をもとに sendmail.mc を作り、編集する。 編集内容は、このページの「sendmail.mc の見本」に示している。
cd /var/tmp/sendmail-8.18.2/cf/cf cp generic-solaris.mc sendmail.mc
sendmail.mc の編集後、sendmail.cf と submit.cf を作り、インストールする。
cd /var/tmp/sendmail-8.18.2/cf/cf sh Build sendmail.cf sh Build submit.cf cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.BACKUP cp /etc/mail/submit.cf /etc/mail/submit.cf.BACKUP sh Build install-cf sh Build install-submit-cf
- ディレクトリとファイルのパーミッションの設定
sendmail は、設定ファイルを含むディレクトリが他のユーザから書き込み可能なとき、 設定を信用せずに動作を拒否する。
chown root:root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue chmod go-w / /etc /etc/mail /usr /var /var/spool chmod 0750 /var/spool/mqueue chmod 0644 /etc/mail/sendmail.cf /etc/mail/submit.cf chmod 0640 /etc/mail/aliases /etc/mail/aliases.db chmod 0640 /etc/mail/statistics
- /etc/mail/trusted-users の設定
このファイルには、差出人アドレスの書き換えを許可するユーザ名を 1 行に 1 つ書く。 ドメイン名は付けない。必要がなければ空のままでよい。
username
- /etc/mail/aliases の設定と aliases データベースの作成
/etc/mail/aliases には、メールの転送先を「別名: 実際の宛先」の形式で書く。 root 宛のメールを管理者が読むアドレスに転送する例は次の通りである。
root: username@example.jp
編集したら、データベースを作り直す。
newaliases
- 起動
svcadm enable svc:/network/smtp:sendmail svcs -p svc:/network/smtp:sendmail
- 動作確認
次のコマンドを実行し、SMTP の応答が表示されることを確認する。表示を見終わったら「QUIT」と入れる。
nc localhost 25 [情報が表示される] QUIT
メールを 1 通送り、ログ(/var/log/syslog のメール関連の記録)で配送結果を確認する。
echo test | /usr/lib/sendmail -v username@example.jp mailq
sendmail.mc の見本
手元のマシンで、メールの中継も受信も行わず、 すべてのメールを特定のメールサーバ(SMART_HOST の行に書いたマシン)に送信だけする設定である。 メールの受信は sendmail ではなく、IMAP や POP で行うものとしている。
- MASQUERADE_AS の行には、マシンが属するドメイン名を書く。
- SMART_HOST の行には、メールサーバの名前を書く。
下の見本の example.jp と smtp.example.jp は、書き換えずに使うと動作しない。
divert(0)dnl OSTYPE(solaris2)dnl DOMAIN(generic)dnl FEATURE(`masquerade_envelope')dnl FEATURE(`use_ct_file')dnl MASQUERADE_AS(`example.jp')dnl MASQUERADE_DOMAIN(`localhost')dnl EXPOSED_USER(`root')dnl define(`confPRIVACY_FLAGS', `goaway')dnl define(`SMART_HOST', `smtp.example.jp')dnl define(`ALIAS_FILE', `/etc/mail/aliases')dnl MAILER(local)dnl MAILER(smtp)dnl
SMF による sendmail サービスの管理
Oracle Solaris 11.4 の sendmail は SMF サービス svc:/network/smtp:sendmail として動作する。
svcs -p svc:/network/smtp:sendmail svcadm enable svc:/network/smtp:sendmail svcadm disable -t svc:/network/smtp:sendmail svcadm refresh svc:/network/smtp:sendmail svcadm restart svc:/network/smtp:sendmail
既定では ローカル専用モード(local-only mode)で動作し、 ローカルホスト以外からのメールは受け付けない。 他のマシンからのメールを受け付けるときは、次のように設定する。 外部からの接続を受け付けることになるため、中継の制限とあわせて設定する。
svccfg -s svc:/network/smtp:sendmail setprop config/local_only = false svcadm refresh svc:/network/smtp:sendmail svcadm restart svc:/network/smtp:sendmail
起動時のオプション(MODE, QUEUEINTERVAL, OPTIONS)は /etc/default/sendmail に書く。 このファイルの内容は、システムの更新で失われない。
中継(リレー)を許可するホストの制限
sendmail は、既定では自分宛て以外のメールを中継しない。 特定のネットワークやドメインからの中継を許可するときは、 access データベースを使う。 制限せずに中継を許可すると、迷惑メールの中継に悪用される。
sendmail.mc に次の行を追加し、sendmail.cf を作り直す。
FEATURE(`access_db')dnl
/etc/mail/access に、許可する接続元と宛先を書く。 下の例では、192.0.2.0/24 からの接続と example.jp 宛ての中継を許可し、それ以外の中継を拒否する。
Connect:192.0.2 RELAY To:example.jp RELAY
編集したら、データベースを作り直し、サービスを再読み込みする。
makemap hash /etc/mail/access < /etc/mail/access svcadm refresh svc:/network/smtp:sendmail svcadm restart svc:/network/smtp:sendmail
設定後は、外部のマシンから自分のサーバ経由で第三者宛てのメールが送れないことを確認する。