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連携の開発で楽しめそうです。
明日に続く