Featured image of post CentOS 7でSSHのログをpostfix + Gmailで送るまで

CentOS 7でSSHのログをpostfix + Gmailで送るまで

CentOS 7で、ログを解析してメールを任意のアドレスに送ります。ここでは仮にSSHの接続成功・失敗回数を、postfix + gmailを使って送信します。

環境

ConoHaのVPSで、CentOS 7です。EPEL有効。postfixは最初から入っていました。

`$ which postfix
 /usr/sbin/postfix
 `

ない場合は、yumでインストールできると思います。

SMTPサーバーとして、Gmailを使わせてもらいます。メールサーバーはたいへんなので、あまり自分で色々と頑張りたくないためです。二段階認証をしないと「安全性の低いアプリ」だと怒られると思います(IMAP を使用して他のメール クライアントで Gmail のメールを読む - Gmail ヘルプ)。

ただ、個人アカウントでは特に何も言われなかったのですが、会社アカウントで行った時、二段階認証でもGoogleからは「安全性の低いアプリ」として警告を受けてしまい、使用をやめました。うーん、法人のほうが厳しかったりするんだろうか……。

ログ解析の一例として、ここではSSHの接続成功・失敗回数を送るようにしてみます。

ログのどこをどう見るか、完全に我流なんですけれど、一般的なテンプレート的なものってあるんでしょうかね…。

手順

postfixの設定からメール送信まで。

postfixの設定

「Macでコマンドラインやプログラムからmailを送る - Qiita」を参考にさせていただきました。/etc/postfix/main.cfに以下を追記します。

`# add: yyyy-mm-dd
 # Posifix Configuratoins
 relayhost = smtp.gmail.com:587
 
 # SASL
 smtp_sasl_auth_enable = yes
 smtp_sasl_password_maps = hash:/etc/postfix/gmail_passwd
 smtp_sasl_security_options = noanonymous
 smtp_sasl_mechanism_filter = plain
 
 # TLS Settings
 smtp_use_tls = yes
 smtp_tls_security_level = encrypt
 tls_random_source = dev:/dev/urandom
 `

暗号化にちなむ設定です。SASLについては後述します。ひとまずここで重要なことは、パスワードに関するファイルを/etc/postfix/gmail_passwdとしていることです。

/etc/postfix/gmail_passwdを、以下の書式で作成します。

`smtp.gmail.com:587 メールアドレス:パスワード`

二段階認証をしていることを前提に、Googleより、アプリパスワードを作成して、それをパスワードとします。アプリパスワードについては「アプリ パスワードでログイン - Google アカウント ヘルプ」。

作成後、gmail_passwd.dbを作成します。

`# cd /etc/postfix
 # postmap gmail_passwd
 `

gmail_passwd.dbが出来ていることを確認後、gmail_passwdを削除します。

うまくいったら、テストメールを送信して動作確認。

`date | mail -s "test" メールアドレス`

-sオプションが件名です。この場合、件名testで送信されます。うまくいかなかったら、/var/log/maillogを見てエラー内容を確認します。

SASLについて

SASL(サスルと読むらしい)については「SASL認証を使ってみる - いますぐ実践! Linuxシステム管理 / Vol.210」の記事がわかりやすかったです。アプリケーションから認証に関するところを切り離して実装するための仕組みのようです。 SASLの実装には色々あるようですが、postfixではCylus SASLを使うとのことです(参考「PostfixのSMTP認証で利用するCyrus SASLライブラリについて | OXY NOTES」)。これに関するインストールと起動には、以下が必要なはずですが……。

`$ sudo yum install cyrus-sasl
 $ sudo systemctl start saslauthd.service
 $ sudo systemctl enable saslauthd.service
 `

しかし、特にこれを用いずとも、メール送信できました。うーん?

ログを送信する

ごくごく簡単ですが、以下のようなシェルスクリプトを作成し、実行することでメールを送るようにてみます。管理者権限で実行します。

`#!/bin/bash
 
 set -eu
 res_file=$(mktemp)
 
 function grep_log() {
     local _log_file
     _log_file="$1"
     local _grep_cont
     _grep_cont="$2"
 
     echo -n "${_log_file}, ${_grep_cont}, " >> ${res_file}
     grep -ic "${_grep_cont}" "${_log_file}" >> ${res_file}
 }
 
 
 # SSH
 
 ssh_log="/var/log/secure"
 
 grep_log ${ssh_log} accepted
 grep_log ${ssh_log} failed
 grep_log ${ssh_log} invalid
 
 
 
 # mail
 
 to_address="メールアドレス"
 cat ${res_file} | mail -s "Server Log $(date +%Y%m%d-%H%M%S)" ${to_address}
 `

mktempで一時ファイルを作成し、その中にログの中身をどんどこ追記していきます。今回は、SSHのログファイルである/var/log/secureからaccepted、failed、invalidでgrepによるカウントを行い、その回数を記録しています(参考記事「sshdのログファイルの確認方法」)。最後に出来上がった内容を、日付・時刻を件名に入れて送信して完了です。送信先は、to_addressを適宜変更します。

実行権限を与えて、実行すると、宛先のメールアドレスに結果が送付されます。

以上。

最終更新 2026年9月13日日曜日
或る阿呆の記.
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。