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を適宜変更します。
実行権限を与えて、実行すると、宛先のメールアドレスに結果が送付されます。
以上。
コメント