新しい環境やインフラを触り始めると早い段階で簡単にsshできるツールを作っています。 大体どんなインフラでもやることは一緒で
- ホストをリストアップする
- リストをpecoで絞り込む
- 選択されたホストに応じて適切な引数でsshする
という一連の操作をコマンド1発でできるようにします。
これを作っておくと
- ホストを探す必要がなくなる
- ホストごとにログインユーザーがバラバラだったとしてもスクリプトで吸収できる
などの便利さがあり、そのインフラに慣れている人でも慣れていない人でも便利に使うことができます。
このスクリプトの自宅環境用を作りました。
以前は業務で1000台以上のホストを管理していたということもあり必須でしたが、自宅は7台程度なので必要とは思っていませんでした。。 しかしログインしようとするたびに探すのが面倒になってきたのと実装方法を思いついたので作りました。
UniFi Controllerにアクセスする
自宅のネットワークにはUniFiを使っており、全ての機器がUniFiです。 またUniFi Controllerもk8sの上で常に動いています。
つまりUniFi Controllerは全ホストを知っているのでここからホストの情報を取りたいです。 しかしUniFi ControllerにはAPIはありません。
UniFi ControllerのUIは内部APIを呼び出して操作するようになっているのでこれを利用します。 各エンドポイント・操作についてはコミュニティで Wikiにまとめられています。
stat/sta
と stat/device
を呼び出せば全クライアントが取得できそうですが、問題は認証です。
Cookieでセッション管理をしていて、APIトークンといったものは発行されないのでスクリプトに認証情報を持たせるのは現実的ではありません。
セッションをInjectするプロキシを作った
なのでセッションをInjectするプロキシを作りました。 このプロキシはメモリ上にCookieを持っていて、リクエストが来たらそのCookieを差し込みさらにプロキシします。 つまりプロキシにアクセスできればAPIには認証情報を持っていなくても透過的にアクセスできます。
プロキシのアクセス制限をするプロキシ
自宅クラスタには自作のプロキシが動作していてこのプロキシでアクセス制限ができます。 これを使い結果的にAPIへアクセスできるユーザーを制限しています。(といっても自分しかいませんが)
アクセスフロー
クライアント ---> グローバルプロキシ ---> unifi-proxy ---> UniFi Controller
プロキシするたびに認証情報が変換されています。
ここまで出来れば後は簡単なシェルスクリプトを書くだけです。
最後に
今回作ったのは unissh と unifi-proxy の2つです。 これらのソースコードを自分のモノレポに上げて公開しておきますのでご自由にご利用ください。 ライセンスはMITです。