シェルスクリプトマガジン

最終回 不正アクセスを通知する

実際のプログラム例

 では、シェルスクリプトを作成してみましょう。今回のシェルスクリプト(sshlogin_notify.sh)は、次のようになります。「アクセストークン」の部分は、 自分のLINE Notifyのアクセストークンに書き換えてください。

#!/bin/bash

LOGFILE_NAME="/tmp/shellscript_auth.log"
ACCESS_TOKEN="アクセストークン"

##発生日取得関数
date_time(){
  YEAR=$(echo $1 | cut -f 1 -d "T" | cut -f 1 -d "-")
  MONTH=$(echo $1 | cut -f 1 -d "T" | cut -f 2 -d "-")
  DATE=$(echo $1 | cut -f 1 -d "T" | cut -f 3 -d "-")
  HOUR=$(echo $1 | cut -f 2 -d "T" | cut -f 1 -d ":")
  MINUTE=$(echo $1 | cut -f 2 -d "T" | cut -f 2 -d ":")
  SECOND=$(echo $1 | cut -f 2 -d "T" | cut -f 3 -d ":" | cut -f 1 -d ".")
  TIME="${YEAR}年${MONTH}月${DATE}日${HOUR}時${MINUTE}分${SECOND}"
}

##ログインメッセージ送信関数
login_message(){
  MESSAGE="${1}(${2})から${3}ユーザーでログインがありました。発生日時:${4}"
  curl -s -X POST -H "Authorization: Bearer ${ACCESS_TOKEN}" -F "message=${MESSAGE}" https://notify-api.line.me/api/notify > /dev/null
}

##不正アクセスメッセージ送信関数
nologin_message(){
  MESSAGE="${1}(${2})から${3}ユーザーで不正アクセスがありました。発生日時:${4}"
  curl -s -X POST -H "Authorization: Bearer ${ACCESS_TOKEN}" -F "message=${MESSAGE}" https://notify-api.line.me/api/notify > /dev/null
}

##メインの処理
if [ -f ${LOGFILE_NAME} ]; then

##ログ抽出
  mv ${LOGFILE_NAME} /tmp/tmp_auth.log
  service rsyslog restart

##ログイン通知
  cat /tmp/tmp_auth.log | grep "Accepted" > /tmp/tmp_login.log
  cat /tmp/tmp_login.log | while read line
  do
    IP=$(echo $line | cut -f 9 -d " ")
    COUNTRY=$(whois ${IP} | grep "country:" | uniq | sed -e 's/  */ /g' | cut -f 2 -d " ")
    if [ -n $COUNTRY ]; then
      COUNTRY="不明"
    fi
    USER=$(echo $line | cut -f 7 -d " ")
    date_time $line
    login_message $IP $COUNTRY $USER $TIME
  done

##不正アクセス通知
  cat /tmp/tmp_auth.log | grep "error: maximum authentication" | sed -e "s/invalid user\s/登録なし:/g"> /tmp/tmp_nologin.log
  cat /tmp/tmp_nologin.log | while read line
  do
    IP=$(echo $line | cut -f 12 -d " ")
    COUNTRY=$(whois ${IP} | grep "country:" | uniq | sed -e 's/  */ /g' | cut -f 2 -d " ")
    if [ -n $COUNTRY ]; then
      COUNTRY="不明"
    fi
    USER=$(echo $line | cut -f 10 -d " ")
    date_time $line
    nologin_message $IP $COUNTRY $USER $TIME
  done
  rm /tmp/tmp_auth.log /tmp/tmp_login.log /tmp/tmp_nologin.log
fi