質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

1回答

419閲覧

認証メソッド設定がないsshクライアントへのサーバのコールバック設定方法

itouri

総合スコア18

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

0クリップ

投稿2018/02/04 15:09

編集2018/02/05 05:38

Goのsshサーバに関する質問です.
Goの標準ライブラリを使ってsshサーバを実装するさいに,クライアントから受け付ける認証方法を以下のようにサーバに設定すると思います.

ここで,質問なんですがクライアントからのconfigのAuthMethodに設定が無かったときのcallbackをサーバに設定できないでしょうか.pubkeyやpasswordの設定があった場合は通常どうりに各callbackを呼んでほしいです.サーバはユーザの情報によって振る舞いを変えます.

// クライアントのconfig config := &ssh.ClientConfig{ User: "user", Auth: []ssh.AuthMethod{ // 設定なし }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), }

上記のようなクライアントのconfigを作成したときにサーバでは NoAuthCallback() のようなものを設定したいです.

// サーバのconfig config := &ssh.ServerConfig{ // clientからのAuthが設定されていない場合に呼んでほしい NoAuthCallback(conn ssh.ConnMetadata) { authMethod := getAuthMethodsFromDB(conn.User()) // authMethodが認証なしでないなら通さない if authMethod != "none" { return NG } return OK }, PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) { // publickey認証時の処理 authMethod := getAuthMethodsFromDB(conn.User()) switch authMethod { case "none": // DB側がnoneなら通す return OK case "pubkey": return 公開鍵認証の結果 } } }, }

どなたかご教授お願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2018/02/05 02:40

どういったニーズでしょうか?クライアントから認証メソッドを未指定でこられた場合に通過させたいのでしょうか?それともエラーにするのでしょうか?
itouri

2018/02/05 05:15 編集

認証情報がなかっときはユーザによって条件を個別に設定したいです.特定のユーザーは認証情報でも通過させたり,鍵認証を使用しないとエラーにしたいです.ユーザーに対し認証サーバがどのように振る舞うかはサーバがDBに保存されている情報を参照し決定します.
mattn

2018/02/05 06:19

ユーザだけで通過するかどうか決まってしまっては危ないのではないでしょうか?
itouri

2018/02/05 07:05 編集

その点は大丈夫です.SSHサーバは認証なしでアクセスされても問題はないシステムになっています.
guest

回答1

0

ベストアンサー

SSHでの認証は、通常以下のような手順で行われます。

  1. クライアント: 認証方式"none"で認証要求を送信する。
  2. サーバ: "none" での認証が失敗した事を返答、使用可能な認証方式のリストを返す。
  3. クライアント: 2で返って来た認証方式と、自分が対応している認証方式を比べ、使用可能な方式で認証要求を送信する。
  4. サーバ: 3の認証要求を確認し、認証が成功したか失敗したかを返す。

クライアント側でAuthMethodを指定しなかった場合、3で使用可能な認証方式が無い事になります。
この時、SSHプロトコル上では使用可能な認証方式が無い事をサーバへ伝える手段が無い為、クライアントは通常はコネクションを切断します。その為、サーバ側での設定によりリカバリする事は不可能です。

それでは 2 の段階で認証結果を判断出来ないかという事になりますが、ソースを確認すると NoClientAuthという設定によって全ユーザを認証無しにする設定はありますが、細かい動作を設定する方法はなさそうです。
https://github.com/golang/crypto/blob/master/ssh/server.go#L369

投稿2018/02/05 08:38

編集2018/02/05 08:43
doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問