Monitor lock status with Mackerel

Monitor lock status with Mackerel

Sesame というスマート鍵を購入し、より快適な生活が手に入りました。

また、 Sesame の API を試してみました。

次の段階として、鍵の状態を Mackerel で監視してみます。

※念のため補足すると、公式アプリでも鍵の施錠/開錠を検知したら push 通知することができるので、必要最低限の監視はできていると言えます。

なぜ監視するのか

ちょっと話が横道に逸れますが、スマート鍵の導入に興味がありつつためらう理由の一つに、セキュリティが挙げられるんじゃないかな、と思っています。特に「不具合や誤作動で知らないうちに解錠される可能性があるんじゃないか」「クラッキングされて解錠されてしまうことはないのか」という点が不安に思われるんじゃないかな、と思います。

個人的には不具合で解錠されてしまう可能性より、うっかり鍵を閉め忘れて外出してしまう可能性の方がずっと高いと思います (実際私は年に数回ほど、鍵を閉め忘れていました…)。

また、 Sesame のシステムをクラッキングするよりピッキングで物理鍵を不正に開錠する方がはるかに簡単だと思います。 Sesame は物理鍵も引き続き使えるので、ぶっちゃけピッキングされたら Sesame 使っていようがいまいが同じことなのですが、 Sesame の場合は開錠/施錠の履歴が残る分、まだマシ、だと思っています (不正に開錠されたことに気付けるので)。

ということで Sesame を (適切に) 使うことでセキュリティのリスクが上がることは無いんじゃないかと思っていますが、とは言え何か問題が起きたらいち早く知りたいものです。

また、セキュリティの話ではないですが忘れがちな要素として電池があると思います。

Sesame は電池で動いているので、そのうち電池が切れて使えなくなります。もし、外出中に電池が切れ、かつ物理鍵も持っていなかった場合、開錠することができなくなります。

したがって、電池の残量を監視し、閾値によってアラートを発行することは必須だと思います (Sesame アプリからも電池残量が減ったら通知してくれたと思いますが、監視サービスと連携すれば通知先や閾値を柔軟に設計できるというメリットがあります)。

家の鍵という極めて重要なモノを運用する以上、適切に監視を行うことは非常に大事なことだと思いませんか?

Sesame のステータスをメトリックとして投稿する

とまあ色々言いましたが正直面白そうだからやってみるというのがモチベーションの9割を占めています。細けえこたぁいいんだよ!

今回、サクッと試したかったので慣れているホストのカスタムメトリックを使いました。

ちゃんとやるなら、 SmartHome みたいなサービスを作ってサービスのカスタムメトリックとして投稿するのが良いんじゃないかなと思います。

ホストのカスタムメトリックはとりあえず {metric name}\t{metric value}\t{epoch seconds} の出力をするスクリプトを書いて Mackerel の config に書き足せばいいのでめっちゃ楽。

以下のようなテキトウなスクリプトを作成します。

#!/bin/bash

SESAME_API_KEY=<API キー>
DEVICE_ID=<デバイス ID>
ENDPOINT=https://api.candyhouse.co/public

LOCKED=$(curl -s -H "Authorization: $SESAME_API_KEY" $ENDPOINT/sesame/$DEVICE_ID | jq ".locked")
BATTERY=$(curl -s -H "Authorization: $SESAME_API_KEY" $ENDPOINT/sesame/$DEVICE_ID | jq ".battery")
EPOCH_TIME=$(date +%s)

if [ $LOCKED = "true" ]; then
  LOCKED_STATUS=1
else
  LOCKED_STATUS=0
fi

echo '# mackerel-agent-plugin'
echo '{"graphs": {"sesame": {"label": "lorentzca", "unit": "integer", "metrics": [{"name": "locked", "label": "true"}, {"name": "battery", "label": "percentage"}]}}}'
echo "lorentzca.locked"$'\t'"$LOCKED_STATUS"$'\t'"$EPOCH_TIME"
echo "lorentzca.battery"$'\t'"$BATTERY"$'\t'"$EPOCH_TIME"

色々雑いですが雑くてもうまくいってしまうところが Mackerel の良いところです。

今回は施錠されていたら 1 、解錠状態だったら 0 をメトリックとして投稿します。また、電池残量も投稿します (施錠のステータスは true か false なのでチェック監視の方が向いてそうですが)。

以下の部分でメトリックの名前や単位を指定していますが、あまり考えて作っていないので変な動きになっちゃってるかも。

echo '# mackerel-agent-plugin'
echo '{"graphs": {"sesame": {"label": "lorentzca", "unit": "integer", "metrics": [{"name": "locked", "label": "true"}, {"name": "battery", "label": "percentage"}]}}}'

スクリプトを実行すると以下のような結果になります。とりあえずフォーマットとしては良さそうですね。

$ /usr/local/bin/sesame-status.sh
# mackerel-agent-plugin
{"graphs": {"sesame": {"label": "lorentzca", "unit": "integer", "metrics": [{"name": "locked", "label": "true"}, {"name": "battery", "label": "percentage"}]}}}
lorentzca.locked        1       1557933923
lorentzca.battery       100     1557933923

このスクリプトを mackerel-agent から呼び出します。設定ファイルは /etc/mackerel-agent/conf.d/metrics_sesame.conf に置いときます。

[plugin.metrics.sesame]
command = [ "/usr/local/bin/sesame-status.sh" ]
timeout_seconds = 10

あとは mackerel-agent を reload して適用し、結果を待つだけです。

結果

無事投稿されました。 🐟

Screen-Shot-0031-05-15-at-23.10.26

1 か 0 かの locked メトリックと数値の大きいバッテリー残量メトリックを一緒のグラフに表示してしまっているので、 locked のメトリックが非常にわかりにくいですね! (知ってた。)

投稿したメトリックを元に監視を行う

グラフは見辛いですがこれで監視はできるようになったので、やってみます。

現在、私は解錠してから15秒後に自動で施錠するように設定をしています。 mackerel-agent は1分に1回メトリックの投稿を行なっているので、たまたま開錠後15秒の間 (厳密には Sesame API 側のデータ更新までタイムラグがあると思いますが) に解錠を検知してアラートを発行されてしまうことは稀に有りえそうです。

というわけでアラート発生までの試行回数を2回にしてみます。これならたまたま解錠したタイミングが拾われてしまうことをかなり防げそうです。

Screen-Shot-0031-05-16-at-0.44.01

この状態で解錠を行い、また自動施錠機能もオフにしてみます。

アラートの通知

無事通知が行われました!

alert

私は生活関連の通知を LINE グループに集約していて、パートナーもそのグループに入ってもらっています。なのでもしアラートが発行されることがあれば危機感を共有できるでしょう。

ちゃんと2回目の解錠検知のタイミングで通知されました。

Screen-Shot-0031-05-15-at-23.25.03

通知の画像でチラ見えていますが、施錠後無事復旧しています。

Screen-Shot-0031-05-15-at-23.32.03

バッテリー残量も同じ要領で設定。

今後の展望

とりあえずシェルスクリプトでやってみましたが、 Go で書き直して、汎用性もできるだけ持たせたいなと思っています。

あと電池残量は施錠状態のメトリックと分けようw グラフ分ければ電池残量の単位は percentage にしたいですね。

今は心当たりのない解錠を検知するに留まっていますが、解錠の検知をトリガーに Web カメラの録画を開始する、といった連携ができればよりホームセキュリティレベルをあげられそうですね。

メトリックの監視ではなく、チェック監視で施錠状態を監視し、トリガーすることで Mackerel で完結させられそう。

夢が広がる。

感想

楽しい。

helck

Helck 1 (1) (裏少年サンデーコミックス) | 七尾 ナナキ |本 | 通販 | Amazon

最近 IoT の台頭の影響か、手軽に使えるスマート家電がどんどん出てきていますね。

手軽に使えることは非常に嬉しいことですが、運用については見落とされがちなのかもしれません。正常に動いているのか、問題は無いのかについてもちゃんと管理していきたいですね。

また、何台もあるスマート家電を一元的に俯瞰することも重要になってくるかもしれません。そうするともうサーバの運用と変わらなくなってきますねw

どこまで自分で管理するかの話は置いておいて、手軽に導入できて本格的に使える Mackerel はスマート家電の Hub としての可能性も感じました。 🐟