Skip to content

SSH ログインされたらメール通知する

SSH でログインされたらメールするように設定してみます。今回は CentOS7 に設定し、メール送信には Gmail アドレスを使いました。

パッケージのインストール

以下、2 つのパッケージが必要になります。

パッケージ名 役割
mailx メール送信時に使う mail コマンドを含む
ssmtp リレー機能等を除外した、最低限の MTA として動作する

MTA には Postfix や Sendmail を使っても良いのですが、リレー機能等は今回の要件に不要です。そこで、最小限の MTA 機能を提供する ssmtp をインストールします。ssmtp は標準リポジトリにありません。EPEL リポジトリにあるので、先に EPEL リポジトリを追加しておきます。

1
2
yum install epel-release
yum --enablerepo=epel -y install mailx ssmtp

デフォルトの設定ファイル

/etc/ssmtp/ssmtp.conf

ssmtp の設定ファイルは /etc/ssmtp/ssmtp.conf にあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@sig9 ssmtp]# cat /etc/ssmtp/ssmtp.conf
#
# /etc/ssmtp.conf -- a config file for sSMTP sendmail.
#
# See the ssmtp.conf(5) man page for a more verbose explanation of the
# available options.
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and your mailhub is so named.
mailhub=mail

# Example for SMTP port number 2525
# mailhub=mail.your.domain:2525
# Example for SMTP port number 25 (Standard/RFC)
# mailhub=mail.your.domain
# Example for SSL encrypted connection
# mailhub=mail.your.domain:465

# Where will the mail seem to come from?
#RewriteDomain=

# The full hostname
#Hostname=

# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
#FromLineOverride=YES

# Use SSL/TLS to send secure messages to server.
#UseTLS=YES
#IMPORTANT: The following line is mandatory for TLS authentication
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

# Use SSL/TLS certificate to authenticate against smtp host.
#UseTLSCert=YES

# Use this RSA certificate.
#TLSCert=/etc/pki/tls/private/ssmtp.pem

# Get enhanced (*really* enhanced) debugging information in the logs
# If you want to have debugging of the config file parsing, move this option
# to the top of the config file and uncomment
#Debug=YES

/etc/ssmtp/ssmtp.conf(コメント除外版)

コメントを除外すると以下のようになります。

1
2
3
4
# grep -v -e '^\s*#' -e '^\s*$' /etc/ssmtp/ssmtp.conf
root=postmaster
mailhub=mail
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

ssmtp の設定

Gmail を使ってメール送信するには ssmtp を以下のように設定します。上述の通り、設定ファイルは /etc/ssmtp/ssmtp.conf にあります。Google の二要素認証を利用している場合は AuthPass にアプリケーション用に割り当てたパスワードを指定します。

1
2
3
4
5
Mailhub=smtp.gmail.com:587
AuthUser=[送信元メールアドレス]
AuthPass=[パスワード]
UserTLS=Yes
UseSTARTTLS=Yes

SSH ログイン時にメールするスクリプト

(ユーザを限定せずに)SSH ユーザログインが発生した場合、/etc/ssh/sshrc の内容が実行されます。今回は /etc/ssh/sshrc を以下の内容で新規作成しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh

MAIL_TO=[通知先メールアドレス]

TIME=`/bin/date "+%Y/%m/%d/ %H:%M:%S"`

FROM_ADDR=`echo $SSH_CONNECTION | cut -d' ' -f1`
FROM_PORT=`echo $SSH_CONNECTION | cut -d' ' -f2`
FROM_ADDR_PORT=${FROM_ADDR}:${FROM_PORT}

TO_ADDR=`echo $SSH_CONNECTION | cut -d' ' -f3`
TO_PORT=`echo $SSH_CONNECTION | cut -d' ' -f4`
TO_ADDR_PORT=${TO_ADDR}:${TO_PORT}

echo -e "Time\t${TIME}\nHost\t${HOSTNAME}\nUser\t${USER}\nFrom\t${FROM_ADDR_PORT}\nTo\t${TO_ADDR_PORT}" | /bin/mail -s "[SSH]${HOSTNAME}/${USER} (${TIME})" ${MAIL_TO}

通知メールのサンプル

今回作成したスクリプトでは、サーバに対して SSH ログインが実行される度に以下のようなメールが送られてきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
差出人: [送信元メールアドレス]
件名: [SSH][HOSTNAME]/[USERNAME] (2016/09/22/ 13:42:30)
日付: 2016年9月22日 13:42:30 JST
宛先: [通知先メールアドレス]

Time  2016/09/22/ 13:42:30
Host  [HOSTNAME]
User  [USERNAME]
From  [アクセス元アドレス]:[ポート]
To    [アクセス先アドレス]:[ポート]