見出し画像

FluentbitとTWSNMP FCの連携開発2日目:SSHの公開鍵を登録する機能を追加して安全に接続できるようにした

浦和レッズ 今季 初勝利!
昨日は、近くの温泉にもいってリフレッシュしたので、開発の調子が上がっています。今朝は5時から開発開始です。助手の猫さんは、寒いためか7時になっても起きていません。

昨日から始めたFluentbitと連携するためのSSHサーバーに公開鍵認証の処理を追加しました。
マップ設定の画面に

のようなアクセスを許可するホストのSSH公開鍵を登録するボタンをつけて、クリックすると

のような登録画面を表示するようにしました。公開鍵は、OpenSSHのフォーマットで登録できます。
公開鍵認証処理は

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())
}


func sshdPublicKeyHandler(ctx ssh.Context, keyCl ssh.PublicKey) bool {
	pubkeys := datastore.GetSshdPublicKeys()
	for _, pk := range strings.Split(pubkeys, "\n") {
		pk = strings.TrimSpace(pk)
		if keyReg, _, _, _, err := ssh.ParseAuthorizedKey([]byte(pk)); err == nil && ssh.KeysEqual(keyCl, keyReg) {
			return true
		}
	}
	return false
}

のようなプログラムになります。
これで、公開鍵を登録していないSSHクライアントからのアクセスはブロックされました。安全になりました。

Fluentbitへログを出力するための処理はできたので、Fluentbitからログを入力するための処理を考えています。新しいログの保存場所に保存しようかと思いましたが、検索画面などを別のするのも大変なので、syslogに保存することにしました。Fluentbitから受信したログをsyslogに割り当てる方法を考えているうちに時間切れです。

明日に続く

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