ある日、業務開始前のいつもの朝、Thunderbird を開いて、管理用メールのチェックをしてみると・・
なんじゃこりゃー
・・というわけで・・、
あけましておめでとうございます、というのにはもう遅すぎる気もしますが、今年の初投稿となります。
昨年は、動画を初めたりしてブログ投稿のインターバルが長くなってしまいがちになりましたが、果たして今年はどうなることやら・・
Postfix SMTP server: errors from localhost
そしてその肝心のメールの内容は以下の通り。
Transcript of session follows.
Out: 220 mail.mydomain.com ESMTP
In: ehlo myhost.mydomain.com
Out: 250-mail.mydomain.com
Out: 250-PIPELINING
Out: 250-SIZE 20971530
Out: 250-ETRN
Out: 250-STARTTLS
Out: 250-AUTH PLAIN LOGIN
Out: 250-ENHANCEDSTATUSCODES
Out: 250-8BITMIME
Out: 250 DSN
In: mail FROM:<nobody@localhost> size=286
Out: 250 2.1.0 Ok
In: rcpt TO:<root@localhost>
Out: 550 5.1.1 <root@localhost>: Recipient address rejected: User unknown in
local recipient table
In: rset
Out: 250 2.0.0 Ok
In: quit
Out: 221 2.0.0 Bye
For other details, see the local mail logfile
この mail.mydomain.com
と myhost.mydomain.com
は同一のホストになっており、この例の場合は、nobody@localhost
から root@localhost
宛のメールが、
Recipient address rejected: user unknown in local recipient table
ということで、root@localhost
がローカル受信者テーブルに無いからメール配送を拒否しているみたいです1。
また、送信側の myhost.mydomain.com
と mail.mydomain.com
は同一ホスト (mail.mydomain.com
は myhost.mydomain.com
の MX レコード) なので、少なくとも外部からの攻撃というわけでもなさそう。
また、/etc/crontab
にも root@localhost
宛に送るような CRON を登録していないので、CRON の仕業でもないということもわかっています。
エイリアスマップにパターンを追加してみる
このメールサーバーは、このブログの過去記事に嗅いてある方法にほぼ準じて設定しています。
設定は次のようになっており、メール配送には「仮想アカウントを利用した配信エージェント」を利用しています。
:
:
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_maps = /etc/postfix/virtual_maps
:
:
ある受信者の宛先を別の宛先に書き換えるためにエイリアスマップというものを使います。Postfix 標準の「ローカル配送エージェント」を使用するときは、エイリアスマップは /etc/aliases
を利用するのですが、仮想アカウントを利用した配信エージェント では、virtual_alias_maps
で指定されているエイリアスマップを利用するようになるので、/etc/aliases
にエイリアスを設定しても反映されません。
ちなみに、私の仮想エイリアスマップには、下のように定義していて、root@mydomain.com
や postadmin@mydomain.com
宛に来たメッセージは、管理者である hoge@mydomain.com
に送信されるようにしています。
root@mydomain.com hoge@mydomain.com
postadmin@mydomain.com hoge@mydomain.com
おそらく、root@localhost
に対するエイリアスがないから、エラーを吐いているんでしょうね。
なにぶんこのままだと、何のプログラムによって大量にメールが送信されているのかわからないので、/etc/postfix/virtual
を編集してエイリアスを追加してみたいと思います。
root hoge@mydomain.com
root@mydomain.com hoge@mydomain.com
postadmin@mydomain.com hoge@mydomain.com
virtual
を保存したら、postmap
を実行してデータベースを更新します。
sudo postmap /etc/postfix/virtual
その後、postfix を再起動します。
sudo systemctl restart postfix
念の為、エイリアスが有効になっているか確認するには、次のコマンドで確認します。
sudo echo "hello world" | swaks -4 --server localhost --from hogehoge@onotherdomain.com -to root@localhost -h-subject "Test Message" --body -
次のような応答があれば、成功です。
=== Trying localhost:25...
=== Connected to localhost.
<- 220 mail.mydomain.com ESMTP
-> EHLO myhost.mydomain.com
<- 250-mail.mydomain.com
<- 250-PIPELINING
<- 250-SIZE 10485760
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH CRAM-MD5 PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 SMTPUTF8
-> MAIL FROM:<hogehoge@onotherdomain.com>
<- 250 2.1.0 Ok
-> RCPT TO:<root@localhost>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Fri, 29 Jan 2021 19:24:35 +0900
-> To: root@localhost
-> From: hogehoge@onotherdomain.com
-> Subject: test Fri, 29 Jan 2021 19:24:35 +0900
-> Message-Id: <20210129192435.023880@myhost.mydomain.com>
-> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
-> subject: Test Message
->
-> hello world
->
->
-> .
<- 250 2.0.0 Ok: queued as A438C186C09
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
ちなみに、エイリアスを追加する前か、あるいは設定を間違えている場合は、こんな感じの応答になります。途中 RCPT_TO
の後で 550 User unknown
を返して受信したメッセージを拒否 (Reject
) しているのがわかりますね。
=== Trying localhost:25...
=== Connected to localhost.
<- 220 mail.mydomain.com ESMTP
-> EHLO myhost.mydomain.com
<- 250-mail.mydomain.com
<- 250-PIPELINING
<- 250-SIZE 10485760
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH CRAM-MD5 PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 SMTPUTF8
-> MAIL FROM:<hogehoge@onotherdomain.com>
<- 250 2.1.0 Ok
-> RCPT TO:<root@localhost>
<** 550 5.1.1 <root@localhost>: Recipient address rejected: User unknown in virtual mailbox table
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
実は、先のエイリアスマップはもっとシンプルにすることができます。
root hoge@mydomain.com
postadmin@mydomain.com hoge@mydomain.com
なにが違うのかというと、2行目にあった、
root@mydomain.com hoge@mydomain.com
の行を削除しました。
詳細は man 5 virtual
を参照してほしいですが、
user address, address, ...
の場合は、user の後ろにつくアドレスの部分が main.cf の $myorigin
に一致するか、あるいは $mydestination
、$inet_interfaces
や $proxy_interfaces
に一致した場合に、アドレスの書き換えが実行されます。
私の環境の場合、root
の後ろが localhost
であれば $mydestination
にリストアップされたサイトに一致し、mydomain.com
の場合は、$myorigin
に一致するので、どちらも hoge@mydomain.com にアドレスが書き換わるということなんです。
犯人は DenyHosts
仮想エイリアスマップを変更して Postfix を再起動すると、来るわ来るわ、大量のメールが・・
内容は以下の通り。
From: nobody@localhost
Subject: DnyHosts Report
To: root@localhost
Message:
Added the following hosts to /etc/hosts.deny
XXX.XXX.XXX.XXX (unknown)
こんな感じで特定の IP アドレスを /etc/hosts.deny
に追加したという旨のメールが大量にやってきていたのでした。要するに、インターネット上から私のサーバーに対して SSH ログインを試みて失敗したためにブロックしたということですね。
/var/log/auth.log
にも、このメール(とエラー通知のメール)と呼応するかのように、SSH のエラーログが大量に・・
もうあえて IPアドレス晒しちゃいますよ。
これでようやく、大量のエラーメールの原因がわかったのですが、そもそも SSH のポートは標準のポート (22番)から変更していたのですが、割れてしまったのかもしれませんね。
今日未明頃から急に大量の DenyHosts のメールが・・
もしかして SSH ポート番号が割れた? pic.twitter.com/6wXUBb15oz— 雑廉堂 (@rough_and_cheap) January 28, 2021
DenyHosts の動作に関しては、/etc/denyhosts.conf
をイジることで変更することが可能です。
主な設定は下の通り。
- DENY_THRESHLD_INVALID
- ログイン試行に失敗した回数がこの値を超えた後、ホストをブロックします。この値は、存在しないユーザーに対するログイン試行に対して適用されます。
- DENY_THRESHOLD_VALID
- システムに存在しているユーザーが、この回数を超えてログイン試行に失敗すると、ホストをブロックします。
- ADMIN_EMAIL
- 管理者へのメールアドレス。メールを受信したくない場合は、ここをブランクにすると良いみたい。
なるほど、ADMIN_EMAIL
に root@localhost
となっており適切な値に設定していなかったんで、大量の Postfix のエラー通知メールが送信されてたわけですね。
まとめ
メールサーバーの設定を変更して、正しく DenyHosts のメールを受信できるようにしたのですが、その後も1時間あたり十数件の DenyHosts メールがやってきます。
あまりにしつこいようなら、ポート番号を変更するか、メールを送信しないようにするかしないといけないですね。
当分、様子を見たいと思います。
-
折しも、その前日に Postfix の設定をイジっていたのもあって、その設定ミスと思い色々調べてみたんですが、どうやらそういうわけではなさそう。 ↩
0件のコメント