とーますメモ

Ruby on Rails / Goなどの学習メモ

【Lightsail × WordPress】メール配信サービスのAmazon SESを使ってみた

基本的には以下のサイトの通りに設定すればOKだが、所々わかりにくい箇所があるので、自分なりにまとめる。
Amazon Lightsail の WordPress で E メール を有効にする | Lightsail ドキュメント

ちなみにWordPressは既にインストール済みであることと、SMTP設定用プラグインは「WP Mail SMTP」を使用する。
(上記のリンクでもこのプラグインを使用している。他のプラグインでも良いだろうが...)

Amazon SESアカウントの作成

以下のサイトを参考に設定を行う。
Amazon Lightsail の WordPress で E メール を有効にする | Lightsail ドキュメント

[注意] アカウント作成時は「サンドボックス」という制限がついた環境設定になっているため
1対多のような任意の受信者にメールを送るためにはこの設定を解除する必要がある。
制限内容は以下。

・「送信元メールアドレス」及び「送信先メールアドレス」は、SESアカウント内で検証済みである必要がある。
・最大で24時間あたり200メッセージしか送信できない
・最大で1秒あたり1メッセージしか送信できない

Amazon SESを使うならサンドボックスの外にいくこと - Qiita
Amazon SES サンドボックスの外への移動 - Amazon Simple Email Service

指定されたメールアドレスにしかメールを送らない簡易なシステム通知ぐらいであればサンドボックス制限は外さないでも良いだろうが
マーケティング系の一斉メールを行いたい場合などは、このサンドボックス制限を外す必要がある。

以下が簡単な流れ。

1)SESコンソールにログイン
2)左側ナビメニューの「SMTP Settings」からSMTPの設定を行う。尚設定内容はメモっておくこと。
3)「送信元」メールのドメイン検証を行う。左側ナビメニューの「Domains」から行う。このときDKIM設定も行う。

DKIM設定をしていないと場合の例
AWS SESで送信ドメイン認証を設定する - Qiita

この設定を行うことで、設定したドメインのどのメールアドレスからでもメールを送信できる。
※MXレコードの設定で引っかかると思うので、上記リンク先のDNSレコードの設定例画像を参考にすること。

4)「送信先」のメールアドレスを認証する。左側ナビメニューの「Email Addresses」から行う。
※ただしサンドボックス制限下でなければ無視しても良い。

5)「WP Mail SMTP」の設定を行う。

From Emailには3)で設定したドメインのメールであれば、どのメールアドレスでも設定可能
SMTP Host、SMTP Username、SMTP Passwordには2)でメモしておいたものを設定する。
全て設定後、「WP Mail SMTP」の「Email Test」タブで、4)で設定した送信先メールアドレスを入力し、「Send Email」を押してメールが届けば設定がうまく行っている。

[参考]
AWS SES メール送信環境のセキュリティを解剖する (2020年版) - Qiita

サンドボックス制限を解除する

上記でも説明したように、この制限を解除することで、メール認証したメールアドレス以外のメールアドレスにもメール送信が可能になる。

以下のサイトさんの説明を参照
Amazon SES 制限解除申請(Amazon SES編 その3) - Laravel学習帳
Amazon SES でドメイン検証してメールを送信してみた - michimani.net
SES送信制限解除申請 (SES Sending Limits) | Developers.IO

バウンス(エラー)メールや苦情(スパム)メール対応

恐らくSESを使う中で、この設定が一番面倒。

詳細は以下のサイトさんを参照
AWS SESをちゃんと使うためにやるべきこと - Qiita
AWSのSESでバウンスメール(bouncemail)対策。3つの方法とメリット・デメリット | ブログ|ベトナムでのオフショア開発とスマートフォンアプリ開発のバイタリフィ
Amazon SESの掟 – サーバーワークスエンジニアブログ
Amazon SES経由のバウンスメールをWebアプリで受け取る - Qiita
Amazon SNS での Amazon SES 通知 - Amazon Simple Email Service

比較的Amazon SNSを使用して、メールを飛ばすやり方が簡単か・・・

バウンスレート管理していないと起こる問題について参考
[AWS] Amazon SESのアカウントが止められちゃった話 - Qiita

バウンスレートを下げる方法もある。以下のサイトを参考
Amazon SESのバウンスレート上昇時の対策 - Qiita

開封率やクリック追跡

以下のサイトさんを参照
Amazon SESで開封やクリックのトラッキングが可能になりました。 | Developers.IO

ただしすごい面倒くさそう。
WordPressなら「WP Offload SES」というAmazon SESだけに特化したプラグインがある。
このプラグインを使えば、メール送信ログや開封率、クリック追跡もできる。

Send Your WordPress Emails via Amazon SES with WP Offload SES - Delicious Brains Inc
Top 3 SMTP Plugins for WordPress Compared (and How to Fix Emails Not Sending) - MailPoet

SESでメール受信

[注意] 特定リージョンでしか現在サポートされていない。

Amazon SES doesn't support email receiving in the following Regions: Asia Pacific (Mumbai), Asia Pacific (Sydney), Canada (Central), Europe (Frankfurt), Europe (London), South America (São Paulo), and AWS GovCloud (US).

詳細は以下
Amazon Simple Email Service endpoints and quotas - AWS General Reference
https://forums.aws.amazon.com/thread.jspa?threadID=314983

基本的に以下のサイトのとおりにやればOKっぽいが、Gmailで受信するような感じでメールを見れるわけではない
[新機能]Amazon SES でメール受信が出来るようになりました! | Developers.IO

所感

指定されたメールアドレス宛てに送る緊急性を要さないシステム通知など用途で使用するなら楽で良いが、大量のユーザに送るケースは、バウンスレートに注意する必要がありそのためにいろんな設定が必要だし、メールの開封率やクリック追跡などの分析が必要な場合は正直、かなり不便だと感じた。

コスパは断トツで良いが、機能面が他のメール配信サービスと比べてまだまだな印象なので、現在のところ本番環境での使用は考えない。

【Ubuntu】ユーザ管理の方法について、ちゃんと調べてみた

Linux上でユーザやグループを追加したり、権限を付与する方法については知っているが、プロダクション環境などのシビアな環境でのユーザ管理法についても学んで起きたいと思ったのでここに調べた内容を書き起こす。

ユーザ追加

ユーザ追加するコマンドは以下の2つが存在する。

1)useradd
2)adduser

上記のコマンドはLinuxのディストリビューション毎に違いある。
CentOSだとadduserはuseraddのシンボリックリンクだが、Ubuntuだとuseraddはバイナリファイルであり、adduserは裏でuseraddを利用するPerlスクリプトである。
またadduserは対話式でユーザを作成し、ホームディレクトリを自動作成し、パスワードも同時に設定可能だが、
useraddは-mオプションを付けない限り、ホームディレクトリを作成しないし、パスワードを設定するには別途でpasswdコマンドを使い必要がある。

なのでUbuntu上でユーザ作成する際は、必ず「adduser」を使うことにする。

[参考]
What is the difference between adduser and useradd? - Ask Ubuntu
adduserとuseraddの違い - DUNNO-CLEARブログ3.0

ユーザは複数のグループに所属できるが、まずは1つのグループに所属する必要があり、その必須なグループをプライマリグループと呼び、
それ以外のグループをセカンダリグループ(追加グループとか補助グループとも呼ばれる)と呼ぶ。

[参考]
[Linux] ユーザ管理と設定ファイル - Qiita

ユーザ削除

ユーザ追加と同じようにuserdelとdeluserがあるが、実行してみた感じだとdeluserを使用した場合、ログが表示されるが、userdelの場合は実行しても何も表示されない。
またUbuntuを使用する場合はdeluserを使うべきだと公式に書いてある。

userdel is a low level utility for removing users. On Debian, administrators should usually use deluser(8) instead.

Ubuntu Manpage: userdel - delete a user account and related files

なのでadduserと同じように、Ubuntu上でユーザ作成する際は、必ず「deluser」を使うことにする。

$ sudo deluser --remove-home username

--remove-homeオプションを付けると、ユーザのホームディレクトリも削除される

sudo権限の付与

sudo権限を付与するには、以下の3つのやり方がある

1)デフォルトでsudo権限がついているグループにユーザを追加(Ubuntuならsudoグループ、CentOSならwheel)
2)/etc/sudoersファイルにsudo権限を付けたいユーザまたはグループを設定
3)/etc/sudoers.d/内にファイルを作り、このファイル内にsudo権限を付けたいユーザまたはグループを設定

一般的には1)が一番簡単。

$ gpasswd -a user_name sudo

1)を行うのにusermodを行う方法もある。gpasswdとusermodの違いは、gpasswdがグループ管理のみ目的としたコマンドに対して
usermodは他にもいろんな機能を提供していることっぽい。
Adding user to a group (usermod or gpasswd)

usermodを使う場合はオプションに「-aG」を付ける必要があるが、gpasswdは単純に「-a」だけなのでわかりやすいため、gpasswdを使うほうが良いだろう。

2)のやり方を選ぶ場合は、基本的にはvisudoコマンドを使用してファイルを編集する。
別にviでも良いが、visudoを使用した場合、保存時に文法に不備があるとエラー箇所を教えてくれるからだ。
visudoでコマンドを打って、設定を書き込んだら「ctrl + X」で終了すれば良い。※保存などのコマンドはない。
どうしてもviが良い場合は、編集終了時に「visudo -c」で書式チェックをしておくと良いだろう。

設定は以下の感じで設定する。書式は「ユーザ名 ホスト=(誰々として) コマンドパス」。ユーザ名の頭に%をつければグループ名として指定できる。
また通常、sudoコマンド実行時にはパスワード入力を求められるが、パスワード入力を要求しないようにするNOPASSWDを設定することもできる。

# rootユーザに対して全てのコマンド実行を許可
root ALL=(ALL) ALL

# adminグループに対して全てのコマンド実行を許可
%admin ALL=(ALL) ALL

# adminグループに対して全てのコマンド実行を許可し、パスワードを要求しない
%admin ALL=(ALL) NOPASSWD:ALL

[参考]
一般ユーザでもroot権限が必要なコマンドを実行できるようにする方法 - Qiita


3)のやり方は/etc/sudoersをいじらなくてもsudo実行ができるようになるため、細かくコマンド毎に許可設定を行いたい場合などに
メンテナンス性が向上するのでよい。ファイル名は何でもよく、ファイル内の書式は2)と同じ。
編集終了時に「visudo -c」で書式チェックをしておくと良いだろう。

[参考]
sudoを/etc/sudoers.d/fileで許可する - Qiita
sudoの権限を設定するvisudoコマンド【Linuxコマンド集】


上記の3つのやり方を見てみた中で、しっかりユーザ管理したい場合は、3)の方法がよいと思う。
NOPASSWDの設定は1)の方法では使えないし、多数のユーザを管理する必要が出てきた場合に、
毎回/etc/sudoersの設定をいじるのは、メンテナンス性が良くない。
3)のやり方ならばユーザ毎にファイルを作れば管理も楽だし、ユーザを削除する場合も単純にファイルを消すだけで良い。

なので自分は3)のやり方を使用する。

ユーザ一覧の確認

$ cat /etc/passwd
もしくは
$ getent passwd

グループおよびグループの所属ユーザの確認

$ cat /etc/group
もしくは
$ getent group

ユーザが所属するグループの確認 (※usernameは任意の名前)

$ groups username

[参考]
Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ | WWWクリエイターズ

【PHP】エラーログが出たら、Slackに通知を送る設定

SwatchやLogwatchなんかを使うのが定番っぽいが
Swatchは監視対象が複数ある場合は、複数のプロセスが常時立ち上がるのと
長い間更新されていないのが不安だったので断念。
Logwatchの場合は、別にこれでも良かったが、Postfixがデフォルトでインストールされるのが嫌だったので、自作のシェルスクリプトをcronで回すことにした。

WEBHOOK_URLとPHP_LOG_PATHは、任意のものを指定し、CHANNELやICONなんかも必要に応じて変更する。

#!/bin/bash

# 件名
RE_LOG_LEVEL="WARNING|ERROR|ALERT"
MAIL_SUBJECT="[Notification] Found PHP Error! ($RE_LOG_LEVEL)"

# 本文に使用する一時ファイルを指定する
MESSAGEFILE=$(mktemp -t webhooks.XXXX)

# 終了時に一時ファイルを削除
trap "
rm ${MESSAGEFILE}
" 0

# 本文を生成
PHP_LOG_PATH='/var/log/php7.2-fpm.log'
sudo tail $PHP_LOG_PATH >> $MESSAGEFILE

INFO='good'
WARN='warning'
ERROR='danger'

CHANNEL="#general"
ICON=":rotating_light:"

TS=`date "+%s"`
TODAY=`date "+%d-%b-%Y"`
RE_TODAY=`echo ${TODAY//\-/\\\-}`
MESSAGE=`cat ${MESSAGEFILE} | grep -E "^\[$RE_TODAY.*?\] ($RE_LOG_LEVEL)"`

WARNING_COUNT=`cat ${MESSAGEFILE} | grep -c "WARNING"`
ERROR_COUNT=`cat ${MESSAGEFILE} | grep -c "ERROR"`
ALERT_COUNT=`cat ${MESSAGEFILE} | grep -c "ALERT"`

WEBHOOK_URL="https://hooks.slack.com/services/XXXXX....."

if [ -n "$MESSAGE" ]; then
  data=`cat << EOF
    payload={
      "text": "$MAIL_SUBJECT",
      "channel": "$CHANNEL",
      "username": "$HOSTNAME",
      "icon_emoji": "$ICON",
      "link_names": 1 ,
      "attachments": [{
        "fallback": "[Notification]",
        "title": "[WARNING]: $WARNING_COUNT    [ERROR]: $ERROR_COUNT    [ALERT]: $ALERT_COUNT",
        "pretext": "\\\`AUTO MESSAGE\\\`",
        "text": "$MESSAGE",
        "color": "$ERROR",
        "mrkdwn_in": ["text", "pretext"],
        "footer": "created at",
        "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png",
        "ts": $TS
      }]
    }
EOF`

  # メッセージ送信
  curl -X POST --data-urlencode "$data" $WEBHOOK_URL
fi

exit 0;

あとはこのスクリプトをcron設定すればOK
thoames.hatenadiary.jp

【PHP-FPM】適切なプロセス設定について

色んなサイトを見て知ったことは、適切な設定を行うためにはまず以下のことを知る必要があるということ。

・使用可能なメモリ量
・PHPプロセスが確保している平均メモリ量

上記の内容を把握したのち、その内容をベースに以下の値を適切な値に設定する。

・pm.max_children
・pm.start_servers
・pm.min_spare_server
・pm.max_spare_server

ちなみに試した環境は2Gメモリ、1coreのUbuntu環境。
またphp-fpmのバージョンは7.2を利用。

1)使用可能なメモリ量の把握

単純に以下のコマンドを打ち

free -h

表示される「available」の箇所を見ればよい。
自分の場合、1.5Gと表示されていた。
※ free(239M) + buff/cache(1.4G) = 約1.5G

[参考]
Linuxのfreeコマンドの見方 – 日々、コレ勉強

使用可能メモリ量は1.5Gから、念の為10%(150MB)のバッファーを取って約1.35GBになったが
更に切りを良くするために最終的に1.3GBにする。

将来的に他のミドルウェアなどでメモリを消費する可能性がある場合は、予め大きなバッファを引いておく。

2)PHPプロセスが確保している平均メモリ量の把握

全てのfpmプロセスが確保したメモリ量は以下のコマンドで確認できる

$ ps -ylC php-fpm7.2 --sort:rss
||>

結果は以下
>||
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0 16801     1  0  80   0 28804 115104 -     ?        00:00:00 php-fpm7.2
S    33 20281 16801  0  80   0 39456 117998 -     ?        00:00:00 php-fpm7.2
S    33 20284 16801  0  80   0 39548 117999 -     ?        00:00:00 php-fpm7.2
S    33 20285 16801  0  80   0 39568 117998 -     ?        00:00:00 php-fpm7.2
S    33 20242 16801  0  80   0 39620 118034 -     ?        00:00:01 php-fpm7.2
S    33 20277 16801  0  80   0 39632 117998 -     ?        00:00:00 php-fpm7.2
S    33 20141 16801  0  80   0 39720 118064 -     ?        00:00:01 php-fpm7.2
S    33 20139 16801  0  80   0 39728 118064 -     ?        00:00:01 php-fpm7.2
S    33 20120 16801  0  80   0 39908 118097 -     ?        00:00:02 php-fpm7.2
S    33 20117 16801  0  80   0 39936 118097 -     ?        00:00:02 php-fpm7.2
S    33 20114 16801  0  80   0 39952 118097 -     ?        00:00:02 php-fpm7.2
S    33 20118 16801  0  80   0 40032 118097 -     ?        00:00:02 php-fpm7.2
S    33 20278 16801  0  80   0 42800 118071 -     ?        00:00:00 php-fpm7.2
S    33 20140 16801  0  80   0 43020 118138 -     ?        00:00:01 php-fpm7.2

この平均を以下のコマンドで計算する

$ ps --no-headers -o "rss,cmd" -C php-fpm7.2 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

その結果プロセスの平均メモリ使用量が38MBとわかった。

[参考]
Adjusting child processes for PHP-FPM (Nginx) · GitHub

※ ちなみにPHPのmemory_limitを元に計算する方法もありかも。
これなら最大値で計算できる。
[参考]
[PHP] PHP-FPMのチューニングをするときに考えたことと行ったこと - Qiita

3)適切な設定値を計算

pm.max_childrenの値は上記で出した値を用いて、以下のように計算する。

pm.max_children = 使用可能メモリ量 / プロセスの平均メモリ使用量

pm.max_children = 1300MB / 38MB = 34.210526316 = 34

その他の項目は以下のサイトさんの指標に従うと・・・
Finding the correct pm.max_children settings for PHP-FPM - Chris Moore

pm.start_servers = [25% of max_children]
pm.min_spare_servers = [25% of max_children]
pm.max_spare_servers = [75% of max_children]

pm.start_servers = 34 × 0.25 = 8.5 = 8
pm.min_spare_servers = 34 × 0.25 = 8.5 = 8
pm.max_spare_servers = 34 × 0.75 = 25.5 = 25

結果以下の設定を行うに至った。
/etc/php/7.2/fpm/pool.d/www.conf

pm.max_children = 34
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 25

※ちなみに以下の計算機も便利。
PHP-FPM Process Caluculator

4)ApacheBenchでどれぐらいまでのアクセスが許容可能かは把握

Macにはデフォルトで「ab」コマンドが入っているので試してみた。
thoames.hatenadiary.jp

例)100ユーザが同時に1リクエストを(合計100リクエスト)を行う負荷テスト

ab -n 100 -c 100 [テストするページのURL]

現在の環境に場合120以上のユーザが同時に1リクエストずつアクセスするとログにエラーが表示されたので、この辺がこのサーバのパフォーマンスということなのだろうか。

アクセスが増えてくるようならサーバ増強を行う必要があるだろう。

[その他参考]
nginxに変更したらメモリ不足なったので、php-fpmを設定を見直し | ex1-lab
[PHP] PHP-FPMのチューニングをするときに考えたことと行ったこと - Qiita

【ApacheBench】使い方メモ

テスト対象のサーバにもインストールできるが、
テスト時はテスト対象とは別のホストから負荷テストを行う。

abはApacheに同梱されてはいますが、性能テストを実行する際には、測定対象のサーバの外部にあるホストからリモートで実行します。ローカルから実行すると、ApacheBench自体の動作が、測定対象マシンのCPUやメモリの使用に影響するためです。

また、テスト対象のシステムに応じて、インターネット環境やLAN環境などを経由したリクエストを生成することで、より本番に近い形態でのネットワーク接続をシミュレートすることができるでしょう。

by 【初心者向け】ApacheBench入門 | Developers.IO

Ubuntuへのインストール

$ sudo apt-get install apache2-utils

基本的な使い方

nオプション: 生成するリクエスト数を指定します
cオプション: 並列実行する数(コネクション数)を指定します

例)10ユーザがそれぞれ10回リクエストした場合

$ ab -n 100 -c 10 http://example.com/

[結果の重要な項目]
Complete requests、Failed requests・・・完了したリクエストと失敗したリクエストの数
Requests per second・・・1秒間に処理したリクエスト数の平均値(ミリ秒)


[参考]
【初心者向け】ApacheBench入門 | Developers.IO
Apache Benchでサクッと性能テスト - Qiita

【Netdata】Ubuntu 18.04上にインストールした時のメモ

Netdata = リアルタイムリソース監視ツール

何が良いかって、リアルタイムの状況がわかるっていうことと
閾値や頻度を適宜設定できるアラート機能が便利。

Netdataの画面を開くとたくさんのセクションがあるが
大事なことはこのセクション毎の説明をしっかり読むこと。結構大事なことが書いてある。

インストール

お決まりのapt installでインストールできるようだったので
以下のページを参考に、インストールしたが、

https://www.howtoforge.com/tutorial/how-to-install-netdata-monitoring-tool-on-ubuntu/

プラグインファイルを編集するedit-configスクリプトが無く、web_logやfail2banなどのコレクター(?)が読み込まれていないようで
想定していた挙動と違う箇所が見受けられることから、最終的に公式と同じようにキックスタートでインストールする方法を使った。
Installation guide | Learn

$ bash <(curl -Ss https://my-netdata.io/kickstart.sh)

これだけで、netdataが起動し、「http://IPアドレス:19999」するだけで良い。

またデフォルトでいろんなコレクターなどの設定がされている。
元設定ファイルがある場所は「/usr/lib/netdata/conf.d」だが、このディレクトリ内のファイルは編集せずに、
「/etc/netdata」内に上書き用の同名ファイルを新規作成し、そこに上書きする。

例1)リソース状態が逼迫したときの通知を設定: health_alarm_notify.conf
cp /usr/lib/netdata/conf.d/health_alarm_notify.conf /etc/netdata/

例2)Fail2banの設定: fail2ban.conf
cp /usr/lib/netdata/conf.d/python.d/fail2ban.conf /etc/netdata/python.d/

※キックスタートスクリプト経由でインストールするとインストールパスが指定できないとのこと。
CentOS7 に netdata をインストールしてリアルタイムでリソース監視する - らくがきちょう

ちなみにアンインストールの方法は以下。
Uninstall Netdata | Learn

$ /usr/libexec/netdata/netdata-uninstaller.sh --yes

Webサーバが既に動作しているサーバにインストールする場合

また自分の場合、Webサービスが動作しているサーバにNetdataを設定したかったため、
そのためのvhost設定を以下のサイトを参考に設定した。
netdata/Running-behind-nginx.md at master · netdata/netdata · GitHub
mastodonが動いているサーバーにnetdataを相乗りさせた際のnginxの設定 - Qiita

ベーシック認証も。
Step 10. Set up a proxy | Learn


通知設定

デフォルトで以下のようなメール通知の設定がされている。

/usr/lib/netdata/conf.d/health_alarm_notify.conf

EMAIL_SENDER=""

# enable/disable sending emails
SEND_EMAIL="YES"

# if a role recipient is not configured, an email will be send to:
DEFAULT_RECIPIENT_EMAIL="root"

メールサーバが入っている場合は、root宛にメールが送られる。
自分の場合はメールサーバを運用せずに、Slackメッセージが送られれば十分のため
メール通知をOFFにし、SlackメッセージをONにする設定を行う。

Slackのincoming WebhookでURLを取得後、SLACK_WEBHOOK_URLにそのURLを設定し、
DEFAULT_RECIPIENT_SLACKにチャンネル名(#は省く)を設定すれば、そのチャンネル宛に通知が届くようになる。

例) netdataチャンネル宛に通知を行う設定
/etc/netdata/health_alarm_notify.conf

# [Email]
SEND_EMAIL='NO'

# [Slack]
SEND_SLACK='YES'
SLACK_WEBHOOK_URL='https://hooks.slack.com/services/xxxx......'
DEFAULT_RECIPIENT_SLACK='netdata'

設定を行った後は再起動。

$ sudo service netdata restart

また以下のコマンドを叩けばテスト通知も行える。

$ sudo su -s /bin/bash netdata
$ /usr/libexec/netdata/plugins.d/alarm-notify.sh test

これでテスト通知が届けば、設定が正しく行われている。

Slack | Learn
Setting up Netdata monitoring with Slack alarms – Arnold Galovics
Email notifications · Issue #3031 · netdata/netdata · GitHub

MySQLのリソース監視

まず、MySQLの監視設定については公式の以下のページを参考にした。
MySQL monitoring with Netdata | Learn

この監視設定を行うには、mysql上でnetdata用のユーザ作成が必須項目として挙げられている。
上記のリンクではパスワードなしのユーザを作成しているが、そもそもしっかりとセキュアな設定をしているMySQLでは
空のパスワードでのユーザ作成は許容されない。

なので以下のリンクやり方に従い、しっかりとしたパスワードでユーザを作成した後、
/etc/netdata/python.d/mysql.confに作成したユーザを設定する。
※ちなみにこのやり方は公式ドキュメントには書いてない!!!(#^ω^)
Integrate netdata monitor (on Linux server)

sql> GRANT USAGE ON *.* TO netdata@localhost IDENTIFIED BY '<password>';
sql> FLUSH PRIVILEGES;

/etc/netdata/python.d/mysql.conf

<任意の名前>:
    user: 'netdata'
    pass: '<password>'

設定後、netdataを再起動すれば「MySQL <任意の名前>」のセクションが表示される。

備考

・保存できるデータはデフォルトだと約2日分まで。

On a system that's collecting 2,000 metrics every second, the database engine's default configuration will store about two day's worth of metrics in RAM and on disk.

・Fail2banで読み込まれているfilterがsshdだけしか表示されないという現象が発生。
以下を参考にし、パーミッション関係かと思ったがそうではなかった。
Centos7 netdata only showing ssh bans and not other 13 filters. · Issue #6184 · netdata/netdata · GitHub

Fail2banプラグインをデバックモードで動かしてみると、jail.localのパースが失敗していた。

$ sudo /usr/libexec/netdata/plugins.d/python.d.plugin fail2ban debug trace

...
2020-04-30 13:03:20: python.d DEBUG: fail2ban[fail2ban] : /etc/fail2ban/jail.local parse failed
...

このプラグインのJailを読み取る正規表現を見てみると(true|false)とあり小文字のみの対応であったが、
自分はTrueまたはFalseと書いていた。それが原因だった。これをtrueとfalseにし、netdataを再起動したところ正常に他のJailsも読み込まれた。

RE_JAILS = re.compile(r'\[([a-zA-Z0-9_-]+)\][^\[\]]+?enabled\s+= (true|false)')

netdata/fail2ban.chart.py at master · netdata/netdata · GitHub

【fail2ban】WordPress用の独自フィルタ作成

以下のログに対応したものを作成する。

・wp-login.phpに対してPOSTをリクエストを送っているもの

※ 管理者のみがwp-login.phpするものなら良いが、不特定多数(woocommerceなど)が利用する場合は
wpのフィルター機能と連携して作成するのが良いと思う。
fail2banでWordPressを守る 2019年1月 - がとらぼ

フィルターの作成

$ vi /etc/fail2ban/filter.d/wordpress.local

failregexに、正規表現で検知したいログを記載します。 はIPアドレスに値します。

wordpress.local

[Definition]

# wp-login.phpの認証時に200番を返す場合は認証失敗を意味し、301番を返す場合は成功を意味する。
failregex = ^<HOST>.* "POST .*/wp-login.php([/\?#\\].*)? HTTP/.*" 200

ignoreregex =

フィルターの動作確認

以下のコマンドで対象ログの行が出ていれば成功

$ # fail2ban-regex access.logのパス /etc/fail2ban/filter.d/wplogin.local  --print-all-matched

監視設定

vi /etc/fail2ban/jail.conf に追記

[wordpress]
enabled = true
port = http,https
logpath = access.logのパス
maxretry = 5

再起動

$ systemctl restart fail2ban.service