Linuxのユーザー管理基盤ミドルウェアのSTNSで公開鍵認証を実装できるライブラリを公開しました
STNSとは
ざっくりSTNSを利用するとこれまでLDAPなどで管理されてきたLinuxのユーザーをTOMLフォーマットの設定ファイルやDynamoDB、S3で管理できるようになります。またSSHログインの公開鍵認証などをかんたんに実現できるのがSTNSの優位性でした。
libstns-go
今回そのSTNSを利用して、下記のライブラリを活用するとあらゆるWEBサービスやCLIツールで公開鍵認証が可能になります。
サンプルコードとしては下記のようなものになります。
package main
import (
"fmt"
"github.com/STNS/libstns-go/libstns"
"github.com/k0kubun/pp"
)
func main() {
stns, err := libstns.NewSTNS("https://stns.lolipop.io/v1/", nil)
if err != nil {
panic(err)
}
user, err := stns.GetUserByName("pyama")
if err != nil {
panic(err)
}
pp.Println(user)
// id_rsaキーで署名する
signature, err := stns.Sign([]byte("secret test"))
if err != nil {
panic(err)
}
// pyamaの公開鍵で署名検証できた
fmt.Println(stns.VerifyWithUser("pyama", []byte("secret test"), signature))
// 文字列が異なるので署名検証できない
fmt.Println(stns.VerifyWithUser("pyama", []byte("make error"), signature))
}
実装としては任意の値を ~/.ssh/id_rsa
などの秘密鍵で署名し、その署名をSTNSで公開されている公開鍵で検証し、検証成功すればそれはSTNSに登録されたユーザーであると認証することができます。
勘の良い方は気づいたかと思いますが、SSHのログイン時に利用されている公開鍵認証相当のことをあらゆるシステムで可能にしたというのが今回の実装です。
ユースケース
まず公開鍵認証を利用することで一般的なID/Password認証よりも比較的暗号強度が高い認証を行うことができます。さらには多要素認証の一つとして活用いただくのも良いと思います。
あとは社内で利用するツールを開発するときに、OAuth認証は容易に利用できるので僕も重宝しているのですが、CLIツールから利用するとなると非常に手間がかかります。そういった場合に、この仕組を利用するとCLIで完結するかつ、強力な認証を利用できます。
最後に
今回実装してみて思ったのですが世の中意外とそんなに公開鍵認証って実装されてるものって少ないなぁと思ったりもしました。今回の実装の追加でSTNSを利用したおもしろ隙間ソフトウェアとかもできるようになると思うので、是非活用いただいて、ブログなど書いていただけると大変に嬉しく思います。
ちょっとかんたんに試してみたいのだけど!という方がいらっしゃいましたら、STNS as a Serviceもあるのでお試しください。