背景
- 自宅のRaspberry Piから、Google Cloud PlatformのAPI使ってる
- Google Cloud Platformは課金上限の設定が出来ないので、APIキーの漏洩が怖い
- APIキーが漏洩しても大丈夫なように、Google Cloud Platform側でIPアドレスの制限かけよう
- 自宅は固定IPじゃ無いので、グローバルIPアドレスが変わるたびに、手作業でGoogle Cloud Platformのホワイトリストにプロバイダのネットワークアドレスを追加する
- とりあえず、グローバルIPアドレスの変更通知はMackerelで対応しよう
ということで、Raspberry Pi上で動かしているmackerel-agentから、グローバルIPアドレスの変更をアラートとしてあげる設定を行いました。
なお、以下Raspberry Piを前提として記述していますが、スクリプト自体はLinux汎用です。
MacherelでRaspberry Piを監視する
参考:Raspberry Pi を Mackerel で監視する
グローバルIPアドレスの変更検知スクリプトを作る
http://globalip.me でグローバルIPアドレスを取得し、変更が検知されたらエラーを返すスクリプト、checkglobalip.shを作る。Raspberry Piで動作させます。
/home/pi/bin/checkglobalip.sh
#!/bin/sh
IPFILE='/tmp/globalip'
PREVIP=`cat $IPFILE` 2>/dev/null
IP=`curl globalip.me` 2>/dev/null
if [ "$IP" != "" ]; then
echo "Global IP address: $IP"
if [ "$PREVIP" != "$IP" ]; then
echo $IP > $IPFILE
if [ "$PREVIP" != "" ]; then
echo "Global IP address changed from $PREVIP"
echo
whois -h whois.nic.ad.jp $IP | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.\S*' | tr '\n' ' '
exit 1
fi
fi
else
echo "Can't get IP address"
exit 1
fi
return 0
Macherelのチェック項目として追加
グローバルIPアドレスが変わると、Google CLoud Platformに登録しているIPアドレスの範囲外となり、APIが403を返して使えなくなります。趣味の利用で即時対応は必要ないので、検知は一時間おきにします(Macherelで設定可能な最大値)。あまり頻繁に http://globalip.me にアクセスするのも気が引けますし。
なお、AM4:00頃にglobalip.meが毎度503を返すようなので、max_check_attempts = 2 にします。
/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.globalip]
command = "/home/pi/bin/checkglobalip.sh"
max_check_attempts = 2
check_interval = 60
memo = "This check monitors change of global IP address."
Mackerel再起動
sudo systemctl start mackerel-agent
MackerelからLINE Notifyでアラート通知
こんな感じで通知が着ます。通知がきたらCMAN見て割り当てIPネットワークアドレスを調べ、Google Cloud Consoleの「APIとサービス」-「認証情報」のサーバーIPアドレスリストに追加。とりあえず自分が使っているプロバイダからのアクセスなら許可ということにします。
正直もうちょっといい方法ないのかなと思わないでもないですが、はたしてどのくらい追加を続けたら、プロバイダのネットワークアドレスを網羅できるのやら。
追記
CMANでネットワークアドレス調べるより、whoisコマンドのほうが良いかも。チェックスクリプトにも仕込みました。
pi@raspberrypi:~ $ whois -h whois.nic.ad.jp 122.26.128.XXX
Network Information:
a. [Network Number] 122.26.128.0/17
b. [Network Name] OCN
g. [Organization] Open Computer Network
(略)
Less Specific Info.
----------
NTT COMMUNICATIONS CORPORATION
[Allocation] 122.16.0.0/12
よくわからないけど、アドレスの範囲がOCN(122.26.128.0/17)よりも、Less Specific InfoででてるNTT COM(122.16.0.0/12)のほうが広い。Google Cloud Platformにはこっちを設定したほうが楽。
関係ないけど、OCNがOpen Computer Networkの略だというのは始めて知りました。