repl.info

STNSと連携して公開鍵認証し、gRPCでサーバーに定義した処理を実行させるツールalpette

今年の4月頃にgRPCの独自認証周りを調べて、勉強がてらそれを使ってツールを作っていた。ものとしては、サーバー側でタスクを定義しておくとgRPC経由で実行させられるというもの。リポジトリは takaishi/alpette

挙動としては、まずサーバー側で以下のようにタスクを定義する。

[[tasks]]

name = "foo"

command = "echo this is foo"



[[tasks]]

name = "bar"

command = "echo this is bar"

そして、クライアント側からタスクを指定するとgRPCでサーバーと通信、サーバーはタスクを実行、実行結果を返すというもの。

$ alpette run --task foo

サーバーで何かするときにSSHすることが多いと思う。しかし、SSHだと実行者が持つ権限が結構大きい。適切に権限を設定すればよいのだけど、別のアプローチとして定義した処理しか実行できないようにするのはどうかと思い試しに実装した。また、gRPCの認証部分でSTNSと連携した公開鍵認証を実装している。標準で使えるSSL/TLSやGoogleを使ってもいいのだけど、STNSと連携することでユーザー管理をSTNSにまかせたり、将来的には監査などに活用できるのでは?と思いやってみた。

gRPCで独自の認証機構を利用する(SSH公開鍵認証編) という記事に書いているように、WithTransportCredentialを使うことで独自に認証機構を実装できる。基本的にはSSHと同じなのだが、サーバーはSTNSから公開鍵を取得するのでフローとしては以下の図のようになるはず(間違っている箇所があったら教えてくれるとうれしいです)。

なお、これだけだと認証通過後の通信は暗号化されない。そのため、パケットキャプチャすると処理結果が見えてしまう。例えばSSHのように共通鍵を用いて暗号化するという処理が必要である。