Oracle Cloud上のOralce Linux 8インスタンスでは、postfixやsendmailではなく、esmtpがインストールされている。
esmtpはRHEL8やCentOS8でも用意されているが、実際に使用している情報があまりない。
esmtp公式ページを見ると「THIS PROJECT IS NO LONGER BEING MAINTAINED. IF IT DOESN’T WORK FOR YOU SEE THESE LINKS.」と書いてあり、本来は利用推奨ではないようだ。
ざっと見たところ日本語情報としてまとまっているのは2010年に書かれた 本を読む の「軽量MTA「esmtp」を試してみた」だった。
esmtpはデーモンではなく、ポート25での待受もせず、/usr/lib/sendmailや/usr/bin/mail を実行する形でのメール送信が実行できるようにするためのソフトウェアです。
ローカルのUNIXユーザ宛にメールを届けたい場合は別途 procmailパッケージをインストールする必要があります。
他のサーバ宛にメールを送りたい場合は、外部のSMTPサーバのアカウント情報を登録し、SMTP AUTHを利用したメール送信が可能です。
難点は、メール送信に関するログがどこにも保存されない、ということ。
設定に失敗してメールが送信できなかった場合でもどう調べればいいのか分からない、という問題点も・・・
また、SMTP AUTHに使うパスワードを平文で設定ファイルに書く必要があるというのも、なかなかな問題点です。
とはいえ、期待通りに動けば簡単に外部SMTPを使用してメール送信ができるし、各サーバに同じ設定を入れておくとシステム系メールの送信元メールアドレスを全て同じにする、ということも容易な感じです。
設定
esmtpの設定は、システム全体に適用される /etc/esmtprc と、各UNIXユーザごとの~/.esmtprc で行います。
とりあえずシステム系メールを送りたいだけであれば /etc/esmtprc を設定しておけばいい感じです。
/etc/esmtprc は用意されていないので /usr/share/doc/esmtp/sample.esmtprc にあるサンプルをコピーして使うか、必要なものだけを書きます。
sample.esmtprcの内容
1 | # Sample configuration file for ESMTP. |
5 | # Set SMTP host and service (port) |
20 | # It can be one of "enabled", "disabled" or "required". It defaults to |
23 | # Set the certificate passphrase |
25 | #certificate_passphrase = "CERTIFICATE_PASSPHRASE" |
27 | # Command to run before contacting the SMTP server |
29 | #preconnect = "ssh -f -L 2025:mail.isp.com:25 user@shell.isp.com 'sleep 5'" |
32 | # Same as above but for a different identity which can be selected with the |
33 | # '-f' flag. You can have as many you like. |
35 | identity = myself@somewhere.com |
36 | hostname = smtp.somewhere.com:25 |
41 | # NOTE: the default indentity settings aren't shared by the other identities. |
42 | # Everything (username, password, etc.) must be specified for every identity |
43 | # even if they don't differ from the default identity. |
46 | # Set the Mail Delivery Agent (MDA) |
48 | mda = "/usr/bin/procmail -d %T" |
50 | # Some possible MDAs are "/usr/bin/procmail -d %T", "/usr/bin/deliver" or |
51 | # "/usr/lib/mail.local %T". |
これを使ってもいいのですが、必要なものだけを書いた方が簡単ですね。
外部のSMTPサーバを使って送信する設定例
Net@ddressというかれこれ20年以上使っているメールサービスのアカウントを使用してメール送信する設定です。
1 | hostname=smtp.postoffice.net:25 |
5 | mda "/usr/bin/procmail -d %T" |
これを /etc/esmtprc に書いたサーバから mailコマンドを使って送信したメールは全て「ユーザ名@usa.net」が発信元となって送られることになります。
また、「mda “/usr/bin/procmail -d %T”」という設定を入れているので、ローカルユーザ宛のメールであれば /var/spool/mail/ に配送されるようにしています。
SMTP送信時にstarttlsが必要な場合は「starttls=enabled」を追加すればいいようなのですが、下記の手順でやったのですが、送信されませんでした。
2 | $ chmod 0700 ~/.authenticate |
4 | $ mv cacert.pem ~/.authenticate/ca.pem |
5 | $ chmod 0600 ~/.authenticate/ca.pem |
16 | procmail: Unknown user "-r" |
20 | procmail: Unknown user "-r" |
とりあえずstarttls対応は保留ですね。
なお、 /etc/esmtprcでは、下記の様な書式を使うこともできます。
2 | hostname smtp.postoffice.net:25 |
3 | username "ユーザ名@usa.net" |
7 | mda "/usr/bin/procmail -d %T" |
ユーザによってアカウントを変える場合はこれを使うようです。
2021/07/02追記
さて、Oracle Linux 7環境でesmtpを設定してみたところ、cronで送られてくるメールが送信できていないようだ。
1 | /etc/cron.daily/0logwatch: |
3 | You have old files in your logwatch tmpdir (/var/cache/logwatch): |
6 | The directories listed above were most likely created by a |
7 | logwatch run that failed to complete successfully. If so, you |
8 | may delete these directories. |
10 | /bin/mktemp: failed to create directory via template '/root/.esmtp_queue/XXXXXXX |
12 | unable to create tempdir inside /root/.esmtp_queue |
13 | /etc/cron.daily/0yum-daily.cron: |
root宛に上記のような一時ファイルが作れないというエラーメールが届いていた。
/var/log/audit/audit.log 内を esmtp で検索してみると、下記の様にSELinuxの権限問題で書き込みが阻止されていた。
1 | # grep esmt /var/log/audit/audit.log |
2 | type=AVC msg=audit(1623953887.619:18168): avc: denied { write } for pid=23636 comm="mktemp" name=".esmtp_queue" dev="sda3" ino=2567447 scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0 |
/root/.esmtp_queue のSELinuxコンテキストを確認すると、mail_home_rw_tとなっている。要求はlogwatch
1 | # ls -ldZ /root/.esmtp_queue |
2 | drwxr-xr-x. root root unconfined_u:object_r:mail_home_rw_t:s0 /root/.esmtp_queue |
関係しそうな事例を発見
「Bug 1366173 – /root/.esmtp_queue has bad context when created from a cron job」
「Bug 1592083 – SELinux is preventing touch from ‘create’ accesses on the archivo mail.」
「Bug 1295923 – SELinux is preventing sendmail from ‘read’ accesses on the directory .esmtp_queue.」
「Bug 1303305 – errors from esmtp in /var/log/messages every time my cron job runs」
「Bug 1149164 – SELinux is preventing esmtp from ‘read’ accesses on the file /.esmtp_queue/4PVJsKZY/mail.」
ただ、上記は調査方法や解決方法に関して直接の記載がない。
また、Bug 1303305 には、esmtpはローカル配送にのみ使え、なんて書かれている。
Fedora MaillingList「Trying to use mailx for logwatch」に確認してくヒントがあった。
まず、「logwatch_t」で設定されている内容の確認してみる
1 | # sesearch -T -s logwatch_t |
2 | Found 12 semantic te rules: |
3 | type_transition logwatch_t postfix_postdrop_t : process logwatch_mail_t; |
4 | type_transition logwatch_t abrt_helper_exec_t : process abrt_helper_t; |
5 | type_transition logwatch_t ntpd_exec_t : process ntpd_t; |
6 | type_transition logwatch_t postfix_postqueue_exec_t : process postfix_postqueue_t; |
7 | type_transition logwatch_t sendmail_exec_t : process logwatch_mail_t; |
8 | type_transition logwatch_t var_lock_t : file logwatch_lock_t; |
9 | type_transition logwatch_t courier_exec_t : process logwatch_mail_t; |
10 | type_transition logwatch_t mdadm_exec_t : process mdadm_t; |
11 | type_transition logwatch_t tmp_t : dir logwatch_tmp_t; |
12 | type_transition logwatch_t tmp_t : file logwatch_tmp_t; |
13 | type_transition logwatch_t exim_exec_t : process logwatch_mail_t; |
14 | type_transition logwatch_t var_run_t : file logwatch_var_run_t; |
ターゲット側が mail_home_rw_t なものを調べて見ると
1 | # sesearch -T | grep mail_home_rw_t |
2 | type_transition cups_pdf_t user_home_dir_t : dir mail_home_rw_t "Maildir"; |
3 | type_transition cinder_backup_t user_home_dir_t : dir mail_home_rw_t "Maildir"; |
4 | type_transition conman_unconfined_script_t admin_home_t : file mail_home_rw_t ".esmtp_queue"; |
6 | type_transition samba_unconfined_script_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue"; |
7 | type_transition vmtools_unconfined_t admin_home_t : dir mail_home_rw_t ".maildir"; |
8 | # sesearch -T |grep mail_home_rw_t |wc |
886個設定されているようだ。
「logwatch」が関連しているものに限定してみると
1 | # sesearch -T |grep mail_home_rw_t |grep logwatch |
2 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue"; |
3 | type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue"; |
4 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir"; |
5 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir"; |
6 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir"; |
7 | type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue"; |
8 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue"; |
9 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir"; |
ソースターゲットが logwatch_mail_t でいろいろ設定されているようなので、「logwatch_mail_t」で調べて見る
1 | # sesearch -T -s logwatch_mail_t |
2 | Found 15 semantic te rules: |
3 | type_transition logwatch_mail_t postfix_etc_t : file etc_aliases_t; |
4 | type_transition logwatch_mail_t postfix_postqueue_exec_t : process postfix_postqueue_t; |
5 | type_transition logwatch_mail_t abrt_helper_exec_t : process abrt_helper_t; |
6 | type_transition logwatch_mail_t tmp_t : file logwatch_mail_tmp_t; |
7 | type_transition logwatch_mail_t postfix_etc_t : lnk_file etc_aliases_t; |
8 | type_transition logwatch_mail_t tmp_t : dir logwatch_mail_tmp_t; |
9 | type_transition logwatch_mail_t var_log_t : file sendmail_log_t; |
10 | type_transition logwatch_mail_t postfix_showq_exec_t : process postfix_showq_t; |
11 | type_transition logwatch_mail_t postfix_etc_t : sock_file etc_aliases_t; |
12 | type_transition logwatch_mail_t qmail_inject_exec_t : process qmail_inject_t; |
13 | type_transition logwatch_mail_t exim_exec_t : process exim_t; |
14 | type_transition logwatch_mail_t postfix_postdrop_exec_t : process postfix_postdrop_t; |
15 | type_transition logwatch_mail_t postfix_etc_t : dir etc_aliases_t; |
16 | type_transition logwatch_mail_t qmail_queue_exec_t : process qmail_queue_t; |
17 | type_transition logwatch_mail_t postfix_etc_t : fifo_file etc_aliases_t; |
19 | Found 14 named file transition filename_trans: |
20 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue"; |
21 | type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue"; |
22 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir"; |
23 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir"; |
24 | type_transition logwatch_mail_t user_home_dir_t : file mail_home_t "dead.letter"; |
25 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir"; |
26 | type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".mailrc"; |
27 | type_transition logwatch_mail_t admin_home_t : file mail_home_t "dead.letter"; |
28 | type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue"; |
29 | type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue"; |
30 | type_transition logwatch_mail_t admin_home_t : file mail_home_t ".forward"; |
31 | type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir"; |
32 | type_transition logwatch_mail_t admin_home_t : file mail_home_t ".mailrc"; |
33 | type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".forward"; |
最初に実行した sesearch -T -s logwatch_t の結果内にいくつか logwatch_mail_t への定義が描かれているがcronからのメール送信には適用されていない?
仕方がないので /var/log/audit/audit.log* の出力結果から書き込みなどの操作エラーの発生対象である mail_home_rw_t について抜き出す
1 | # grep deni /var/log/audit/audit.log*|grep mail_home_rw_t |
3 | /var/log/audit/audit.log.4:type=AVC msg=audit(1623953887.619:18168): avc: denied { write } for pid=23636 comm="mktemp" name=".esmtp_queue" dev="sda3" ino=2567447 scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0 |
4 | /var/log/audit/audit.log.4:type=AVC msg=audit(1624041848.311:27261): avc: denied { add_name } for pid=5082 comm="mktemp" name="PcKUa8QZ" scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0 |
5 | /var/log/audit/audit.log.4:type=AVC msg=audit(1624126686.899:34916): avc: denied { add_name } for pid=15196 comm="mktemp" name="jiIjNaug" scontext=system_u:system_r:logwatch_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mail_home_rw_t:s0 tclass=dir permissive=0 |
これをaudit2allowコマンドでSELinuxのモジュール化して、読み込む。
1 | # grep deni /var/log/audit/audit.log*|grep mail_home_rw_t |
3 | #============= logwatch_t ============== |
5 | #!!!! This avc is allowed in the current policy |
6 | allow logwatch_t mail_home_rw_t:dir create; |
7 | allow logwatch_t mail_home_rw_t:file create; |
8 | # grep deni /var/log/audit/audit.log*|grep mail_home_rw_t | audit2allow -M mktemp |
10 | ******************** IMPORTANT *********************** |
11 | To make this policy package active, execute: |
15 | # semodule -i mktemp.pp |
ただ、1回だけではだめで、何回か追加を繰り替えすことになった。
最終的に作成された mktemp.te ファイルは下記となった。
6 | class file { create link open read setattr unlink write }; |
7 | class dir { add_name create read remove_name rmdir write }; |
10 | #============= logwatch_t ============== |
12 | #!!!! This avc is allowed in the current policy |
13 | allow logwatch_t mail_home_rw_t:dir { add_name create read remove_name rmdir write }; |
15 | #!!!! This avc is allowed in the current policy |
16 | allow logwatch_t mail_home_rw_t:file { create link open read setattr unlink write }; |
こうやって作成したテキストのteファイルを modファイル経由で pp形式に出力
1 | # checkmodule -M -m -o mktemp.mod mktemp.te |
2 | checkmodule: loading policy configuration from mktemp.te |
3 | checkmodule: policy configuration loaded |
4 | checkmodule: writing binary representation (version 19) to mktemp.mod |
5 | # semodule_package -o mktemp.pp -m mktemp.mod |
現在のモジュール状況を確認して、読み込み
1 | # semodule -l | grep mktemp |
4 | # semodule -l | grep mktemp |
モジュールのバージョンが変更されたことを確認。
なお、不要になったモジュールは「semodule -r モジュール名」で削除できる。