Oracle CloudのOracle Linux 8で標準選択されているesmtpでメールを送信する

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.
2#
3#       Jose Fonseca
4 
5# Set SMTP host and service (port)
6#
7hostname = localhost:25
8 
9# Set the user name
10#
11username = "USERNAME"
12 
13# Set the password
14password = "PASSWORD"
15 
16# Use the Starttls
17#
18#starttls = disabled
19#
20# It can be one of "enabled", "disabled" or "required". It defaults to
21# disabled.
22 
23# Set the certificate passphrase
24#
25#certificate_passphrase = "CERTIFICATE_PASSPHRASE"
26 
27# Command to run before contacting the SMTP server
28#
29#preconnect = "ssh -f -L 2025:mail.isp.com:25 user@shell.isp.com 'sleep 5'"
30 
31 
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.
34#
35identity = myself@somewhere.com
36        hostname = smtp.somewhere.com:25
37        username = "myself"
38        password = "secret"
39        #starttls = disabled
40#
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.
44 
45 
46# Set the Mail Delivery Agent (MDA)
47#
48mda = "/usr/bin/procmail -d %T"
49#
50# Some possible MDAs are "/usr/bin/procmail -d %T", "/usr/bin/deliver" or
51# "/usr/lib/mail.local %T".

これを使ってもいいのですが、必要なものだけを書いた方が簡単ですね。

外部のSMTPサーバを使って送信する設定例

Net@ddressというかれこれ20年以上使っているメールサービスのアカウントを使用してメール送信する設定です。

1hostname=smtp.postoffice.net:25
2username="ユーザ名@usa.net"
3password="パスワード"
4 
5mda "/usr/bin/procmail -d %T"

これを /etc/esmtprc に書いたサーバから mailコマンドを使って送信したメールは全て「ユーザ名@usa.net」が発信元となって送られることになります。

また、「mda “/usr/bin/procmail -d %T”」という設定を入れているので、ローカルユーザ宛のメールであれば /var/spool/mail/ に配送されるようにしています。

SMTP送信時にstarttlsが必要な場合は「starttls=enabled」を追加すればいいようなのですが、下記の手順でやったのですが、送信されませんでした。

1$ mkdir ~/.authenticate
2$ chmod 0700 ~/.authenticate
4$ mv cacert.pem ~/.authenticate/ca.pem
5$ chmod 0600 ~/.authenticate/ca.pem
6$ mailx メール送り先@ドメイン名
7Subject: test mail 5
8test mail 5
9.
10EOT
11$ 0 (null)
12メール送り先@ドメイン名: 0 (null)
130 (null)
14メール送り先@ドメイン名: 0 (null)
15メール送り先@ドメイン名: 0 (null)
16procmail: Unknown user "-r"
170 (null)
18メール送り先@ドメイン名: 0 (null)
19メール送り先@ドメイン名: 0 (null)
20procmail: Unknown user "-r"

とりあえずstarttls対応は保留ですね。

なお、 /etc/esmtprcでは、下記の様な書式を使うこともできます。

1identity ユーザ名@usa.net
2        hostname smtp.postoffice.net:25
3        username "ユーザ名@usa.net"
4        password "パスワード"
5        default
6 
7mda "/usr/bin/procmail -d %T"

ユーザによってアカウントを変える場合はこれを使うようです。


2021/07/02追記

さて、Oracle Linux 7環境でesmtpを設定してみたところ、cronで送られてくるメールが送信できていないようだ。

1/etc/cron.daily/0logwatch:
2 
3You have old files in your logwatch tmpdir (/var/cache/logwatch):
4        logwatch.idrC25J0
5        logwatch.Hb7DUNNO
6The directories listed above were most likely created by a
7logwatch run that failed to complete successfully.  If so, you
8may delete these directories.
9 
10/bin/mktemp: failed to create directory via template '/root/.esmtp_queue/XXXXXXX
11X': Permission denied
12unable 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
2type=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
3#

/root/.esmtp_queue のSELinuxコンテキストを確認すると、mail_home_rw_tとなっている。要求はlogwatch

1# ls -ldZ /root/.esmtp_queue
2drwxr-xr-x. root root unconfined_u:object_r:mail_home_rw_t:s0 /root/.esmtp_queue
3#

関係しそうな事例を発見
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
2Found 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;
15 
16#

ターゲット側が mail_home_rw_t なものを調べて見ると

1# sesearch -T | grep mail_home_rw_t
2type_transition cups_pdf_t user_home_dir_t : dir mail_home_rw_t "Maildir";
3type_transition cinder_backup_t user_home_dir_t : dir mail_home_rw_t "Maildir";
4type_transition conman_unconfined_script_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
5<略>
6type_transition samba_unconfined_script_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
7type_transition vmtools_unconfined_t admin_home_t : dir mail_home_rw_t ".maildir";
8# sesearch -T |grep mail_home_rw_t |wc
9    886    6202   72157
10#

886個設定されているようだ。

「logwatch」が関連しているものに限定してみると

1# sesearch -T |grep mail_home_rw_t |grep logwatch
2type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue";
3type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue";
4type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir";
5type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir";
6type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir";
7type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
8type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
9type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir";
10#

ソースターゲットが logwatch_mail_t でいろいろ設定されているようなので、「logwatch_mail_t」で調べて見る

1# sesearch -T -s logwatch_mail_t
2Found 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;
18 
19Found 14 named file transition filename_trans:
20type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".esmtp_queue";
21type_transition logwatch_mail_t user_home_dir_t : file mail_home_rw_t ".esmtp_queue";
22type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".maildir";
23type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t ".maildir";
24type_transition logwatch_mail_t user_home_dir_t : file mail_home_t "dead.letter";
25type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t "Maildir";
26type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".mailrc";
27type_transition logwatch_mail_t admin_home_t : file mail_home_t "dead.letter";
28type_transition logwatch_mail_t admin_home_t : file mail_home_rw_t ".esmtp_queue";
29type_transition logwatch_mail_t user_home_dir_t : dir mail_home_rw_t ".esmtp_queue";
30type_transition logwatch_mail_t admin_home_t : file mail_home_t ".forward";
31type_transition logwatch_mail_t admin_home_t : dir mail_home_rw_t "Maildir";
32type_transition logwatch_mail_t admin_home_t : file mail_home_t ".mailrc";
33type_transition logwatch_mail_t user_home_dir_t : file mail_home_t ".forward";
34#

最初に実行した 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
2<略>
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
6#

これをaudit2allowコマンドでSELinuxのモジュール化して、読み込む。

1# grep deni /var/log/audit/audit.log*|grep mail_home_rw_t
2 
3#============= logwatch_t ==============
4 
5#!!!! This avc is allowed in the current policy
6allow logwatch_t mail_home_rw_t:dir create;
7allow logwatch_t mail_home_rw_t:file create;
8# grep deni /var/log/audit/audit.log*|grep mail_home_rw_t | audit2allow -M mktemp
9 
10******************** IMPORTANT ***********************
11To make this policy package active, execute:
12 
13semodule -i mktemp.pp
14 
15# semodule -i mktemp.pp
16# semodule -l | mktemp
17mktemp  1.0
18#

ただ、1回だけではだめで、何回か追加を繰り替えすことになった。

最終的に作成された mktemp.te ファイルは下記となった。

1module mktemp 1.0.8;
2 
3require {
4        type logwatch_t;
5        type mail_home_rw_t;
6        class file { create link open read setattr unlink write };
7        class dir { add_name create read remove_name rmdir write };
8}
9 
10#============= logwatch_t ==============
11 
12#!!!! This avc is allowed in the current policy
13allow logwatch_t mail_home_rw_t:dir { add_name create read remove_name rmdir write };
14 
15#!!!! This avc is allowed in the current policy
16allow 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
2checkmodule:  loading policy configuration from mktemp.te
3checkmodule:  policy configuration loaded
4checkmodule:  writing binary representation (version 19) to mktemp.mod
5# semodule_package -o mktemp.pp -m mktemp.mod
6#

現在のモジュール状況を確認して、読み込み

1# semodule -l | grep mktemp
2mktemp  1.0.7
3# semodule -i mktemp.pp
4# semodule -l | grep mktemp
5mktemp  1.0.8
6#

モジュールのバージョンが変更されたことを確認。

なお、不要になったモジュールは「semodule -r モジュール名」で削除できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

StatCounter - Free Web Tracker and Counter