📩

Ubuntuでのログ監視(logwatch) Postfix+SendGridでメールを送信する

2022/10/29に公開

はじめに

この記事は、以下の環境にてログ監視結果をメールで送信する設定についてまとめています。

環境

  • Ubuntu20.04
  • logwatchでサーバーのログ監視を行う
  • postfixで結果をメールで送る
  • メールはSMTP経由で転送する SendGridを利用

※この環境に至るまでの、Ubuntuサーバーを立ててlogwatchをインストールするまでの流れは以下記事にまとめています。

https://zenn.dev/tau_dev/articles/e5e0a6d6df9724

この記事の作業の流れ

  1. logwatchをインストール
  2. postfixをインストール
  3. SMTP経由でメールを転送する(SendGridの無料プランを利用)

というわけでレッツトライ。

1)ログ監視ソフトlogwatchをインストール

まず、logwatchについて。

というわけで、logwatchをインストール。

% sudo apt install logwatch

# 以下で動作確認できます
# outputに続くstdoutで、結果を画面表示
% sudo logwatch --output stdout

インストールされたら設定ファイルを編集します。
ここでややこしいのが「設定ファイルは複数あり、保存場所によって優先度が変わる」ということ。今回はログ結果を送信するだけの環境なので難しいことは考えず、以下を理解しておけば大丈夫。

  • /usr/share/logwatch/default.conf  ‥デフォルト設定
  • /etc/logwatch/conf/logwatch.conf  ‥上記ファイルをコピーして作成・編集する

というわけで、デフォルトの設定ファイルをコピーします。

% sudo cp -p /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf

続いて、コピーした設定ファイルを編集。viエディタでオープン。

% sudo vi /etc/logwatch/conf/logwatch.conf

ファイルの中から以下項目を探して変更します。
変更後はファイルの保存も忘れずに。

/etc/logwatch/conf/logwatch.conf
# メールの送信先
# rootアカウントに送信するようになっているので送信したいアドレスに変更
#MailTo = root
MailTo = xxx@xxxxx.com

# ログ解析の詳細度
# Low/Med/Highの3種類あります
Detail = High

# ログの出力先
# stdout/mail/fileが選べます(stdoutは画面に表示)
Output = mail

# 出力フォーマット
# html/textが選べます(シンプルで良いのでtextに)
Format = text

# ログレポートの範囲
# All/Today/Yesterdayが選べます
Range = yesterday

設定できたら、以下の作業用ディレクトリを確認し、無ければ作っておきます。

# /etc/cache/logwatch がなければ以下で作成
% sudo mkdir /etc/cache/logwatch

# 作成したディレクトリの権限を変更
% sudo chmod 700 /etc/cache/logwatch

logwatchの設定周りはこんな感じで終了。

2)メールソフトpostfixをインストール

続いて、メールソフトであるpostfixをインストール。

postfixは前述のlogwatchと共にインストールされるはず。
一応以下で確認。

# 以下でpostfixのバージョンを確認できる
% postconf | grep mail_version
mail_version = 3.4.13
milter_macro_v = $mail_name $mail_version

上記でエラーが表示される場合は、以下でインストール。

# 関連パッケージ一覧を更新しておく
% sudo apt update

# postfixをインストール
% sudo apt install postfix

# あわせて、mailコマンドが使えるように以下もインストールしておく
% sudo apt install mailutils

インストールできたら設定ファイルを編集。
基本はデフォルト設定とし、以下項目を探して記述を変更、または追記する。

/etc/postfix/main.cf
# メールを受け取ることができるアドレスを指定
# デフォルトでは all となっており「どこからでも受け取れる」設定のため、
# 自分自身だけ可能となるよう設定する(今回は送信専用にしたい)
#inet_interfaces = all
inet_interfaces = 127.0.0.1

# 上記と併せて、メールを受け取る際の通信プロトコル(ルール)を指定
# こちらも all となっているので、IPv4のみに設定
#inet_protocols = all
inet_protocols = ipv4

# ホスト名関連
# 私は一旦仮設定として以下を指定(今後利用する中で変更予定です)
myhostname = xxx-xxx-xxx-xxx  ‥当方の環境ではIPアドレスだったのでそのまま利用
mydomain = xxxxx.com
myorigin = $mydomain

# メールをSMTP経由で送るための設定を追記
# SASL認証徹底有効化
smtp_sasl_auth_enable = yes
# 匿名ログインを許可しない
smtp_sasl_security_options = noanonymous
# セキュリティレベル
smtp_tls_security_level = may
# リレー先ホストを指定
# 今回、SendGridを使うので以下を指定(利用するサービスによって異なります)
relayhost = [smtp.sendgrid.net]:587
# リレー先へのSMTP認証情報
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

設定を変更できたら、以下コマンドで設定ファイルの内容チェックが可能です。
このコマンドでエラー等のメッセージが表示されなければOK。

# postfixの設定をチェック
% sudo postfix check

上記に関する参考記事はこちら。
https://www.softel.co.jp/blogs/tech/archives/5651

エラーが出なければ以下でpostfixを再起動します。

# postfixを再起動
% sudo systemctl restart postfix

# postfixの稼働状況を確認
% sudo systemctl status postfix

こんな感じで表示されれば正常に動作しています。

● postfix.service - Postfix Mail Transport Agent
     Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2022-10-26 16:08:48 JST; 2 days ago
   Main PID: 149317 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 1066)
     Memory: 0B
     CGroup: /system.slice/postfix.service

Oct 26 16:08:48 xxx-xxx-xxx-xxx systemd[1]: Starting Postfix Mail Transport Agent...
Oct 26 16:08:48 xxx-xxx-xxx-xxx systemd[1]: Finished Postfix Mail Transport Agent.

以上でpostfix周りの設定はOKです。

ここまでで、一応logwatchから監視結果をメール送信できるようになりますが、サーバーにログインしたときだけメールを確認できます。(つまりサーバーにログインしなければ、メールが見られない)

さすがにこれでは不便なので、サーバー外にもメールできるようにSMTP経由でメールを転送するという設定を行います。

3)SMTP経由でメールを転送する SendGridの無料プランを利用

最後にSMTP経由でメールを転送する方法です。
私の環境では、SendGridを利用することにしました。

https://sendgrid.kke.co.jp/

(参考) gmailは使えない?

「postfix SMTP経由」などで検索すると、GmailのSMTPサーバーを使う方法が紹介されているのですが、私の環境では同じようにできませんでした‥。

以下画像のとおり、どうやらGoogleの仕様が変わったので設定ができなくなったっぽい?印象です。(この辺、もし詳しい方いましたら、コメントにて教えていただければ嬉しいです。)
Googleヘルプセンターより

そんなわけで、SMTPとして利用できそうなSendGridに行きつきました。

①まずは、SendGridを無料枠で登録します。
これは公式サイトの「無料ではじめる」ボタンから普通に行けると思います。

②メールアドレス等を入力して個人情報の入力へ進みます。

ここで注意点が2つ。

③無事にアカウント発行がされたら、SendGrid公式サイトからログインして、SMTP転送の設定を行います。(SendGrid側ではアクセスキー(APIキー)を作成します)

④管理画面から、Email API > Integration Guide を選択して、Choose a setup method で「SMTP Relay」をクリック。

⑤続く画面で以下を設定します。

  • Create an API key に作成するキーの名称を入力して[Create Key]をクリック。これで、キーが作成されます。
  • キーを作成すると、Configure your application にパスワード等が出てくるので、設定をメモして画面下部のチェックボックスをオンにして、Nextボタンをクリック。

⑥最後に設定をチェックして終了です。

⑦SendGridで、APIキーを作成できたら、続いてサーバー側の設定です。

postfixの設定で行った編集内容を確認。

/etc/postfix/main.cf
# メールをSMTP経由で送るための設定を追記
# SASL認証徹底有効化
smtp_sasl_auth_enable = yes
# 匿名ログインを許可しない
smtp_sasl_security_options = noanonymous
# セキュリティレベル
smtp_tls_security_level = may
# リレー先ホストを指定
# 今回、SendGridを使うので以下を指定(利用するサービスによって異なります)
relayhost = [smtp.sendgrid.net]:587
# リレー先へのSMTP認証情報
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

特に、relayhostの指定は、SendGridの内容になっているかを確認します。

⑧最後に、APIキーを利用したパスワードファイルを設定します。

# postfixのパスワードファイルを作成
% sudo vi /etc/postfix/sasl_passwd

パスワードファイルの中身は以下のように記述します。

[smtp.sendgrid.net]:587 username:password

usernameは、apikey
passwordに、SendGridで表示されたAPIキーを指定します。

保存できたら、作成したパスワードファイルを以下で暗号化します。

# パスワードファイルをハッシュ化(暗号化)
% sudo postmap hash:/etc/postfix/sasl_passwd

これで、SMTP経由でメールを送信する設定は終了です。

logwatchをメールで出力できるか確認。

% sudo logwatch --output mail

これで、postfixに設定していたメールアドレスにメールが届いていればOKです。

もし、しばらく待っても届かない場合は設定ミスが起こっている可能性があります。
SendGridの管理画面でも、「Activity」から、メールを受け取れたかどうかの確認ができるので、このあたりも見ながら確認してみてください。

さいごに

私自身、一連の作業を始めてからPCのメールソフトで受信できるまでかなりの時間を要しました💦もっと簡単にできると思っていましたが、なかなか参考サイトどおりには進まず難航してしまったので、自分なりの作業メモをまとめてみました。

もし、私と似たような環境を実現しようとしてうまくいかない方がいれば、何かの参考になれば嬉しい限りです。

参考サイト

Discussion