リモートからLinuxサーバーにアクセスする場合、「SSH」(Secure SHell)という通信を利用します。SSHによるログイン認証は、主に2種類あります。「パスワード認証」と、公開鍵と秘密鍵による「ホスト認証」です。ホスト認証は、公開鍵暗号方式を利用したとても堅牢性が高く、不正アクセスが難しいといえます。そこで、今回のシェルスクリプトではパスワード認証を対象とします。
パスワード認証でログインに成功した場合は、次のようなログが残ります。この例では「linux」がユーザー名、「192.168.1.12」と「62399」がSSHでアクセスしてきたマシンのIPアドレス、ポート番号です。
1 2 3 |
Nov 25 06:15:09 linux sshd[22327]: Accepted password for linux from 192.168.1.12 port 62399 ssh2 Nov 25 06:15:09 linux sshd[22327]: pam_unix(sshd:session): session opened for user linux by (uid=0) Nov 25 06:15:09 linux systemd-logind[870]: New session 19 of user linux. |
繰り返しアクセスして4回失敗すると、
1 2 3 4 5 |
Nov 25 06:21:56 linux sshd[22429]: message repeated 4 times: [ Failed password for root from 192.168.1.12 port 62407 ssh2] Nov 25 06:21:56 linux sshd[22429]: error: maximum authentication attempts exceeded for root from 192.168.1.12 port 62407 ssh2 [preauth] Nov 25 06:21:56 linux sshd[22429]: Disconnecting authenticating user root 192.168.1.12 port 62407: Too many authentication failures [preauth] Nov 25 06:21:56 linux sshd[22429]: PAM 4 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.12 user=root Nov 25 06:21:56 linux sshd[22429]: PAM service(sshd) ignoring max retries; 5 > 3 |
のようなログが残ります。今回のシェルスクリプトでは、このようなものを不正アクセスとみなします。
これらのログをうまく加工して通知を作成します。加工する際、IPアドレスからどこのドメイン付きホスト名や国名を調べて表示するようにします。
通知するSNSは「LINE」にします。第9回の「グローバルIPアドレスを通知する」で紹介したようにLINE Notifyの「アクセストークン」を発行してください。