AWS
zabbix
SingleSignOn

一時的なSSOサーバのログイン監視

一時的なSSOサーバのログイン監視

はじめに

AWSのEC2インスタンスにリバースプロキシ型のSSO(Single Sign On)をのせていて、
Zabbixでログイン監視をしていたのですが、
一旦、Zabbixを外すことにしたので、一時的にログイン監視を入れることになったお話です。
※ 説明ながい・・:unamused:

Zabbixってなんすか?

簡単に言いますと、
 サーバー動いてんの?
 ログイン出来ないよ・・
 アプリ死んでない?
 メモリ枯渇してるっぽい・・等、
統合的にまるっとサーバを監視するツールになります。
詳しくはWikiで。
https://ja.wikipedia.org/wiki/Zabbix

このZabbixを使ってログイン監視をしていたけれど、
今回、この便利なZabbixを停止して、
取り急ぎ、ログイン監視だけ組み込んでみました。
※メモリや容量辺りはAWSのCloudWatchでOK:thumbsup:

Jenkins使うかな

やっぱりここはCIツール界のエース Jenkins を活用して、
定期的な監視運用を進める事にしました。
※ cronは古すぎます・・・

ざっくりアーキテクト

Jenkinsで定期的にログイン監視を行い、
ログイン失敗したらSNSへ通知 ⇒ Lambdaへ依頼 ⇒ Twilioから電話 ⇒ がっかり・・
という流れにしました。
※ Lambda ⇒ Twilio連携は元から使っていたので

image.png

ログイン監視シェル

Jenkinsから叩くログイン監視シェルはこんな感じ。
ログインしてログアウトして問題無ければ終了ですね。
※ログアウトしとかないとセッション溜まるし。

SNSへの通知もシェルの中で実行しています:v_tone3:

#!/bin/sh

# Topic ARN指定 -> Lambdaへ依頼するためのTopic
snsname="arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:telephone-call"

# 第一パラメータ:証明書チェック有無(0:無、1:有)
# 第二パラメータ:SSOサーバURL
# 今回はgetoptも使わず直で指定
if [ $# -ne 2 ]; then
  exit 9
fi

# 第一パラメータが 0 なら証明書チェックをSKIP(-kオプション追加)
sslopt=""
if [ ${1} -eq 0 ]; then
  sslopt="-k"
fi
# 第二パラメータ格納
sso_url=${2}

# cookeファイルパス定義
cookie_file=$(cd $(dirname $0) && pwd)"/tmp/cookie.txt"

# sso login 実行
# ログイン後のページに "SSO TOP Page" が含まれていればログイン成功
# 諸事情によりステータスコードは見ていない
login=`curl -v ${sso_url} -d 'ACCOUNTUID=ADMIN' -d 'PASSWORD=ADMINPASSWD' ${sslopt} -c ${cookie_file} -L | grep "SSO TOP Page" | wc -l`

# login失敗したらSNS Topicへ通知
if [ ${login} != 1 ]; then
  # SNSへ通知 「SSOへのログインに失敗しました。」と電話で連絡
  aws sns publish --region ap-northeast-1 \
      --message "SSOへのログインに失敗しました。" \
      --topic-arn ${snsname}
  exit 9;
fi

# logout 実行
logout=`curl ${sso_url} -d 'LOGOUT=SSO_LOGOUT' -b ${cookie_file} ${sslopt} -o /dev/null -w '%{http_code}\n'`

# ステータスコードが200以外はエラー
# logout 失敗したらSNS Topicへ通知
if [ ${logout} != 200 ]; then
  # SNSへ通知 「SSOへのログアウトに失敗しました。」と電話で連絡
  aws sns publish --region ap-northeast-1 \
      --message "SSOへのログアウトに失敗しました。" \
      --topic-arn ${snsname}
  exit 9;
fi

exit 0;

おわり

Lambda ⇒ Twilio で電話するところは元々存在していたので、
説明は省きましたがざっとこんな感じです。
もっと色々方法あると思いますが、サクッと対応という感じであれば良い方法かなと。