logwatchの送信元アドレスを変更する方法です。
標準の設定項目では実現できなかったため、メール送信は標準機能に頼らず、sendmailコマンドに頼りました。
環境:RHEL7.5、logwatch-7.4.0-35.20130522svn140.el7_5.noarch
以下、私がトライした順に記載します。
logwatchの送信元アドレス設定
/etc/logwatch/conf/logwatch.conf に、MailFrom = メールアドレス といった形式で記載するようです。
なお、@は特別な意味に解釈されてしまうようですので、@のようにエスケープが必要です。
※どのファイルに設定するべきかは多くの方が記事を書かれているので割愛。
私の環境では自サーバ内のPostfixを経由してメール送信しているのですが、MailFromの設定をおこなっても、Postfixのログ上はずっとFromがrootのままで、意図した変更にはなりませんでした。
logwatchのメール送信部分を読み解く
どうもlogwatchは、メール本文中にあるFromにセットしているようで(1154行目)、EnveropeFromは何も指定していない。このため、Postfixで見るとFromは実行ユーザであるrootになってしまうのだと思いました。
# cat -n /usr/share/logwatch/scripts/logwatch.pl
(中略)
1143 #fixme mailto
1144 if (($Config{'hostformat'} eq "splitmail") || ($emailopen eq "")) {
1145 #Use mailer = in logwatch.conf to set options. Default should be "sendmail -t"
1146 #In theory this should be able to handle many different mailers. I might need to add
1147 #some filter code on $Config{'mailer'} to make it more robust. -mgt
1148 open(OUTFILE,"|$Config{'mailer'}") or die "Can't execute $Config{'mailer'}: $!\n";
1149 my $mailto = $Config{"mailto_$Config{'hostname'}"};
1150 $mailto = $Config{'mailto'} unless $mailto;
1151 for my $to (split(/ /, $mailto)) {
1152 print OUTFILE "To: $to\n";
1153 }
1154 print OUTFILE "From: $Config{'mailfrom'}\n";
1155 #If $Config{'subject'} exists lets use it.
1156 #This does not allow for variable expansion as the default below does -mgt
1157 if ($Config{'subject'}) {
1158 print OUTFILE "Subject: $Config{'subject'}\n";
1159 } else {
1160 print OUTFILE "Subject: Logwatch for $Config{'hostname'} (${OStitle})\n";
1161 }
対処方法
方法は下記3つが思いつきましたが、簡単な案2にしました。
- logwatch改造する
- メール送信をlogwatchに任せず自作する
- Postfixでメール送信時にEnvelopeFromを書き換える
以下、案2の具体的な実現方法について。
logwatchをインストールすると、何も設定せずとも、毎日メール通知してくれるようになっています。
これは、/etc/cron.daily/0logwatch スクリプトによって実行されています。
このスクリプトでは、メール通知を行うオプションを指定してlogwatchを実行しています。
logwatchはオプションを指定しないと、標準出力にそのまま出力してきます。ですので、この内容をひろってメールすればよいだけです。
0logwatchスクリプトの中身を下記のように書き換えます。これでEnvelopeFromが書き換わります。
#!/bin/sh
echo -e "To: root\nSubject: Logwatch for [${HOSTNAME}] (Linux)\n\n`logwatch`" | sendmail -i -t -f 送信元メールアドレス
exit 0
背景
なぜEnvelopeFromを変更しないといけなくなったか、ですが、
メール中継サーバが、プライベートドメインのメールアドレスだと拒否するためです。
logwatchの標準だと、Fromアドレスが root@locahost.localdomain のようになってしまいます。