見出し画像

FluentbitとTWSNMP FCを連携するためにsshサーバー機能を作っています

今朝は5時に助手の猫さんが起こしてくれました。助手の猫さんは、夜かみさんが抱っこして連れてきて一緒に寝るようになってから朝起きるのが遅くなっているようです。

さて、昨日からTWSNMP FCとFluentbitを連携させるための開発を初めています。Fluentbitは

です。ログを扱うソフトです。昔Rubyで作られたFluentdは使ったことがあったのですが、Fluentbitも気になっていて調べていたら

のようにGO言語でプラグインを作れるという説明を見つけました。
GitHUBでは

です。これを見つけた瞬間にモチベーションアップです。
TWSNMPシリーズと連携するプラグインを作ってみようと思いました。
作るのは2つのプラグインです。

  • TWSNMP FCで集めたログをFluentbitへ送るinput plugin

  • FluentbitからTWSNMP FCへログを送るoutput plugin

です。
検討を始めた時にログの転送方法を、inputはWebサーバーのREST API、outputはsyslogと考えましたが、通信が暗号化されていないので安全じゃないのと、転送の効率が悪い気がしたので別の方法をいうろいろ考えていました。TLSは安全ですが双方向の証明書チェックするようにすると使うのが面倒になりそうです。そこで思いついたのがsshです。
ポーリング機能でsshは作ったことがあるので、少し資産があります。
そこで、昨日、かみさんのお供で外出している時の合間に、GO言語でsshサーバーを作る方法をいろいろ調べました。
ありました、GO言語には何でもあります。

です。

 package main

 import (
     "github.com/gliderlabs/ssh"
     "io"
     "log"
 )

 func main() {
     ssh.Handle(func(s ssh.Session) {
         io.WriteString(s, "Hello world\n")
     })  

     log.Fatal(ssh.ListenAndServe(":2222", nil))
 }

これだけでsshサーバーが作れます。簡単です。
でも、このままTWSNMP FCに組み込むと

  • サーバーを止められない

  • 誰でもアクセスできる

  • SSHの秘密鍵が毎回変わる

  • sshのクライアントが接続したままだとTWSNMP FCを停止できない

のような問題がありそうです。

func sshd(stopCh chan bool) {
	log.Printf("start sshd")
	signer, err := gossh.ParsePrivateKey([]byte(datastore.GetPrivateKey()))
	if err != nil {
		<-stopCh
		return
	}
	sv := ssh.Server{
		Addr:        fmt.Sprintf(":%d", SshdPort),
		Version:     "TWSNNMP FC v1.36.0",
		HostSigners: []ssh.Signer{signer},
		IdleTimeout: time.Second * 30,
		MaxTimeout:  time.Minute * 10,
		Handler:     sshdHandler,
		PublicKeyHandler: sshdPublicKeyHandler,
	}
	go sv.ListenAndServe()
	<-stopCh
	log.Printf("stop sshd")
	sv.Shutdown(context.Background())
}

のようにすれば、すべて解決できそうです。

とりあえず、syslogを取得する処理まで作れました。

ssh -p 2222 root@localhost get syslog 1707372533847437000 100

を実行するとsyslogが

1707401453855417000	{"client":"192.168.1.210:55520","content":"type=TLSFlow,cl=240d:2:6306:6700:7c0b:4aff:fef7:a947,sv=2404:6800:4004:822::2003,serv=HTTPS,count=26,handshake=2,alert=0,minver=TLS 1.2,maxver=TLS 1.3,cipher=TLS_AES_128_GCM_SHA256,ft=2024-02-08T22:48:36+09:00,lt=2024-02-08T22:48:36+09:00","facility":21,"hostname":"minipc","priority":174,"severity":6,"tag":"twpcap","timestamp":"2024-02-08T23:10:53+09:00","tls_peer":""}

のような感じで取得できました。
アクセスを許可するsshクライアントの公開鍵を登録する機能などはまだ作っていませんが、今朝は、ここまで
今週は、Fluentbit連携の開発で楽しめそうです。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。