一時的なSSOサーバのログイン監視
はじめに
AWSのEC2インスタンスにリバースプロキシ型のSSO(Single Sign On)をのせていて、
Zabbixでログイン監視をしていたのですが、
一旦、Zabbixを外すことにしたので、一時的にログイン監視を入れることになったお話です。
※ 説明ながい・・
Zabbixってなんすか?
簡単に言いますと、
サーバー動いてんの?
ログイン出来ないよ・・
アプリ死んでない?
メモリ枯渇してるっぽい・・等、
統合的にまるっとサーバを監視するツールになります。
詳しくはWikiで。
https://ja.wikipedia.org/wiki/Zabbix
このZabbixを使ってログイン監視をしていたけれど、
今回、この便利なZabbixを停止して、
取り急ぎ、ログイン監視だけ組み込んでみました。
※メモリや容量辺りはAWSのCloudWatchでOK
Jenkins使うかな
やっぱりここはCIツール界のエース Jenkins を活用して、
定期的な監視運用を進める事にしました。
※ cronは古すぎます・・・
ざっくりアーキテクト
Jenkinsで定期的にログイン監視を行い、
ログイン失敗したらSNSへ通知 ⇒ Lambdaへ依頼 ⇒ Twilioから電話 ⇒ がっかり・・
という流れにしました。
※ Lambda ⇒ Twilio連携は元から使っていたので
ログイン監視シェル
Jenkinsから叩くログイン監視シェルはこんな感じ。
ログインしてログアウトして問題無ければ終了ですね。
※ログアウトしとかないとセッション溜まるし。
SNSへの通知もシェルの中で実行しています
#!/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 で電話するところは元々存在していたので、
説明は省きましたがざっとこんな感じです。
もっと色々方法あると思いますが、サクッと対応という感じであれば良い方法かなと。