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の運営にも貢献できるのでよろしくお願います。