サーバーへのログインをリアルタイムでSlackに通知する

罰金担当あらため、募金担当の高橋です。Linuxサーバーへのログインの履歴を確認するには、サーバーにログインしてからログファイルを確認する必要があります。また、都度サーバーに特権ユーザーでのログインが必要となり、リアルタイムでの監視は難しいです。そこで、誰がいつサーバーにログインしたかをpush通知で通知してくれる仕組みを作成してみました。通知の受け取りには弊社で使用しているコミュニケーションツールのSlackを使用しました。弊社のSlackの使い方はこの記事で紹介されています。tech.sanwasystem.com

動作環境

本番環境で動作させることを考えると、新規にミドルウエアを追加せずに動作するようにしたかったので、シェルスクリプトで作成しました。

連携の準備

Slack連携の準備

Slack連携の設定を行います。SlackのIntegrationsからIncoming WebHooksを選択します。選択すると以下の画面が出てくるので、通知を行うチャネルを設定します。 f:id:takahashih1234:20150724132512p:plain 次の画面で表示されるWebhook URLを使用します。 f:id:takahashih1234:20150725123719p:plain

連携用のスクリプトの作成と設定

ログイン時にシェルを呼び出す処理と、Slackに通知をするシェルを作成します。

ログイン時にシェルを呼び出す処理

/etc/ssh/にsshrcファイルを作成します。ファイルに以下の内容を記載します。今回はログイン名、クライアントのIPアドレス、ログイン先のホスト名を表示させます。

/PATH_TO_SH/sshlogin.sh "$USER" "$SSH_CLIENT" "$HOSTNAME"

適当なフォルダにSlack通知をするシェルスクリプトを作成します。ファイルには以下の内容を記載します。また、パーミッションはすべてのユーザーが実行できるようにします。

#!/bin/sh
#WebHookUrl
WEBHOOKURL="https://hooks.slack.com/services/XXXXXXXXXX/XXXXXXXXXXXXXX/"
#Slack送信チャンネル
CHANNEL=${CHANNEL:-"#送信するチャネル"}
#Slack送信名
BOTNAME=${BOTNAME:-"MRSO試験環境ログイン"}
#Slackアイコン
FACEICON=${FACEICON:-":ghost:"}
#Slackメッセージ
MESSAGE=${MESSAGE:-"$1$2から$3にログインしました"}

curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null

設定後にLinuxにログインを行うとSlackに以下の内容が通知されます。 f:id:takahashih1234:20150725125815p:plain

まとめ

今回の設定を行うと、だれがどの時間にどのサーバーにログインをしたのかリアルタイムで確認することができ、またSlackのログを残すことができます。また、今回の仕組みでSSHのログイン以外にもSFTPのログインも同様に検知できるようになります。