Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10808] ファイルの概要

このコミットは、Go言語の実験的なSSHパッケージ (exp/ssh) における、公開鍵認証に関連するヘルパー関数およびコールバック関数の名称変更を主目的としています。具体的には、クライアント認証ヘルパー ClientAuthPublickeyClientAuthKeyring に、サーバー設定のコールバック関数 PubKeyCallbackPublicKeyCallback にそれぞれリネームされています。これは、APIの命名規則をより明確にし、その機能が単一の公開鍵だけでなく、鍵の集合(キーリング)を扱うことを示唆するため、および一貫性を保つための変更です。

コミット

commit fc6df2fdd81f2837033ffa73141b6079d04855ff
Author: Dave Cheney <dave@cheney.net>
Date:   Thu Dec 15 11:06:10 2011 -0500

    exp/ssh: rename ClientAuthPublicKey helper ClientAuthKeyring
    
    Also, rename ServerConfig.PubKeyCallback to PublicKeyCallback.
    
    R=rsc, agl
    CC=golang-dev
    https://golang.org/cl/5477059

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/fc6df2fdd81f2837033ffa73141b6079d04855ff

元コミット内容

元のコミットメッセージは以下の通りです。

exp/ssh: rename ClientAuthPublicKey helper ClientAuthKeyring

Also, rename ServerConfig.PubKeyCallback to PublicKeyCallback.

これは、実験的なSSHパッケージ (exp/ssh) 内の2つの主要な名称変更を簡潔に示しています。一つはクライアント認証ヘルパー関数の ClientAuthPublicKey から ClientAuthKeyring への変更、もう一つはサーバー設定内の公開鍵コールバックフィールドの PubKeyCallback から PublicKeyCallback への変更です。

変更の背景

この変更の背景には、APIの命名の一貫性と明確性の向上が挙げられます。

  1. ClientAuthPublicKey から ClientAuthKeyring への変更:

    • 元の ClientAuthPublicKey という名前は、単一の公開鍵を扱うかのような印象を与える可能性があります。しかし、実際にはこのヘルパー関数は ClientKeyring インターフェースを引数として受け取ります。ClientKeyring は複数の鍵を管理し、認証時に適切な鍵を選択して提供する役割を担います。
    • ClientAuthKeyring という新しい名前は、この関数が単一の鍵ではなく、鍵の集合(キーリング)を介した認証メカニズムを提供することをより正確に表現しています。これにより、APIの意図がより明確になり、開発者が誤解する可能性が低減されます。
  2. ServerConfig.PubKeyCallback から ServerConfig.PublicKeyCallback への変更:

    • PubKeyCallbackPublicKeyCallback の短縮形であり、Go言語の標準ライブラリや一般的なコーディング規約では、略語を避けて完全な単語を使用することが推奨される傾向があります。
    • PublicKeyCallback という完全な名前を使用することで、APIの可読性が向上し、その機能(公開鍵認証のコールバック)がより明確に伝わります。これは、API全体の一貫性を保つ上でも重要な変更です。

これらの変更は、GoのSSHパッケージがまだ実験段階 (exp) であった時期に行われたものであり、API設計の洗練と安定化に向けた初期の取り組みの一環と考えられます。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  1. SSH (Secure Shell):

    • SSHは、ネットワークを介して安全にコンピュータを操作するためのプロトコルです。主にリモートログインやファイル転送(SCP, SFTP)に使用されます。
    • SSHは、クライアントとサーバー間で暗号化された通信チャネルを確立し、データの盗聴や改ざんを防ぎます。
    • 認証メカニズムとして、パスワード認証、公開鍵認証、ホストベース認証などがあります。
  2. 公開鍵認証 (Public Key Authentication):

    • SSHで最も安全かつ一般的に使用される認証方法の一つです。
    • ユーザーは秘密鍵と公開鍵のペアを生成します。秘密鍵はユーザーのローカルマシンに厳重に保管され、公開鍵はアクセスしたいリモートサーバーに配置されます。
    • 認証プロセスでは、クライアントが秘密鍵を使用して署名を行い、サーバーがその署名をクライアントの公開鍵で検証します。これにより、パスワードをネットワーク経由で送信する必要がなくなり、セキュリティが向上します。
    • キーリング (Keyring): 複数の公開鍵や秘密鍵を管理するための概念です。SSHクライアントは、認証を試みる際に、キーリング内の利用可能な鍵を順に試行することがあります。
  3. Go言語の exp パッケージ:

    • Go言語の標準ライブラリには、exp (experimental) というプレフィックスを持つパッケージが存在することがあります。これらは、まだ安定版ではないが、将来的に標準ライブラリに組み込まれる可能性のある実験的なAPIや機能を提供します。
    • exp/ssh は、Go言語でSSHクライアントおよびサーバーを実装するための実験的なパッケージでした。実験段階であるため、APIの名称や構造が変更される可能性があります。
  4. コールバック関数 (Callback Function):

    • プログラミングにおいて、あるイベントが発生したときや特定の処理が完了したときに呼び出される関数です。
    • SSHサーバーの実装では、クライアントからの認証要求(例:パスワード認証、公開鍵認証)があった際に、サーバー側でその認証情報を検証するためのロジックを記述するコールバック関数が提供されます。このコミットで変更された PublicKeyCallback は、まさに公開鍵認証の検証ロジックをサーバー側で定義するためのコールバックです。

技術的詳細

このコミットは、Go言語の exp/ssh パッケージ内のAPIの命名規則を改善するものです。

  1. ClientAuthPublickey から ClientAuthKeyring へのリネーム:

    • ClientAuthPublickey は、クライアントが公開鍵認証を行うための ClientAuth インターフェースを実装するヘルパー関数でした。
    • この関数は ClientKeyring というインターフェースを引数に取ります。ClientKeyring は、認証時に使用する秘密鍵を提供する役割を担います。このインターフェースは、単一の鍵だけでなく、複数の鍵を管理する「キーリング」の概念を内包しています。
    • したがって、ClientAuthKeyring という新しい名前は、このヘルパー関数が単一の公開鍵ではなく、ClientKeyring が提供する鍵の集合(キーリング)を利用して認証を行うという、より正確な意味合いを伝えます。これにより、APIの意図がより明確になります。
  2. ServerConfig.PubKeyCallback から ServerConfig.PublicKeyCallback へのリネーム:

    • ServerConfig はSSHサーバーの設定を保持する構造体です。
    • PubKeyCallback フィールドは、クライアントが公開鍵認証を試みた際にサーバー側で呼び出されるコールバック関数を定義していました。このコールバックは、提供されたユーザー名、アルゴリズム、公開鍵バイト列が有効であるかを検証し、true または false を返します。
    • PubKeyCallbackPublicKeyCallback の短縮形です。Goの標準ライブラリでは、一般的に略語を避け、完全な単語を使用することが推奨されます。このリネームは、この推奨事項に従い、APIの可読性と一貫性を向上させるためのものです。
    • この変更に伴い、ServerConn 構造体の testPubKey メソッドや、認証ループ内の publickey 認証処理、認証失敗メッセージの生成箇所など、PubKeyCallback を参照していたすべての箇所が PublicKeyCallback に更新されています。

これらの変更は、機能的な振る舞いを変更するものではなく、純粋にAPIの命名を改善し、コードの意図をより明確にすることを目的としています。

コアとなるコードの変更箇所

このコミットで変更された主要なコード箇所は以下の通りです。

  1. src/pkg/exp/ssh/client_auth.go:

    • ClientAuthPublickey 関数の定義が ClientAuthKeyring に変更されました。
    --- a/src/pkg/exp/ssh/client_auth.go
    +++ b/src/pkg/exp/ssh/client_auth.go
    @@ -283,8 +283,8 @@ func (p *publickeyAuth) method() string {
     	return "publickey"
     }
     
    -// ClientAuthPublickey returns a ClientAuth using public key authentication.
    -func ClientAuthPublickey(impl ClientKeyring) ClientAuth {
    +// ClientAuthKeyring returns a ClientAuth using public key authentication.
    +func ClientAuthKeyring(impl ClientKeyring) ClientAuth {
     	return &publickeyAuth{impl}
     }
    
  2. src/pkg/exp/ssh/server.go:

    • ServerConfig 構造体内の PubKeyCallback フィールドが PublicKeyCallback に変更されました。
    • ServerConn 構造体の testPubKey メソッド内で s.config.PubKeyCallback の参照が s.config.PublicKeyCallback に変更されました。
    • 認証ループ (userAuthLoop) 内で s.config.PubKeyCallback の参照が s.config.PublicKeyCallback に変更されました。
    • 認証失敗メッセージ (failureMsg) の生成箇所で s.config.PubKeyCallback の参照が s.config.PublicKeyCallback に変更されました。
    --- a/src/pkg/exp/ssh/server.go
    +++ b/src/pkg/exp/ssh/server.go
    @@ -36,10 +36,10 @@ type ServerConfig struct {
     	// several goroutines.
     	PasswordCallback func(user, password string) bool
     
    -// PubKeyCallback, if non-nil, is called when a client attempts public
    +// PublicKeyCallback, if non-nil, is called when a client attempts public
     	// key authentication. It must return true iff the given public key is
     	// valid for the given user.
    -	PubKeyCallback func(user, algo string, pubkey []byte) bool
    +	PublicKeyCallback func(user, algo string, pubkey []byte) bool
     
     	// Cryptographic-related configuration.
     	Crypto CryptoConfig
    @@ -359,7 +359,7 @@ func isAcceptableAlgo(algo string) bool {
     
     // testPubKey returns true if the given public key is acceptable for the user.
     func (s *ServerConn) testPubKey(user, algo string, pubKey []byte) bool {
    -	if s.config.PubKeyCallback == nil || !isAcceptableAlgo(algo) {
    +	if s.config.PublicKeyCallback == nil || !isAcceptableAlgo(algo) {
     		return false
     	}
     
    @@ -369,7 +369,7 @@ func (s *ServerConn) testPubKey(user, algo string, pubKey []byte) bool {
     		}
     	}
     
    -	result := s.config.PubKeyCallback(user, algo, pubKey)
    +	result := s.config.PublicKeyCallback(user, algo, pubKey)
     	if len(s.cachedPubKeys) < maxCachedPubKeys {
     		c := cachedPubKey{
     			user:   user,
    @@ -425,7 +425,7 @@ userAuthLoop:\
     			\t\tbreak userAuthLoop
     			\t}
     			case "publickey":
    -			\t\tif s.config.PubKeyCallback == nil {
    +			\t\tif s.config.PublicKeyCallback == nil {
     				\t\tbreak
     			\t\t}
     			\t\tpayload := userAuthReq.Payload
    @@ -499,7 +499,7 @@ userAuthLoop:\
     		if s.config.PasswordCallback != nil {
     			failureMsg.Methods = append(failureMsg.Methods, "password")
     		}
    -		if s.config.PubKeyCallback != nil {
    +		if s.config.PublicKeyCallback != nil {
     			failureMsg.Methods = append(failureMsg.Methods, "publickey")
     		}
    
  3. テストファイル (client_auth_test.go, client_func_test.go, session_test.go):

    • 上記の名称変更に伴い、テストコード内の ClientAuthPublickey および PubKeyCallback のすべての参照が、それぞれ新しい名前に更新されています。これにより、テストが引き続き正しく機能することが保証されます。

これらの変更は、コードベース全体で一貫性を保つために、関連するすべての参照を更新しています。

コアとなるコードの解説

このコミットのコアとなる変更は、GoのSSHパッケージにおける公開鍵認証のAPIの命名規則の改善です。

  1. ClientAuthKeyring (旧 ClientAuthPublickey):

    • この関数は、SSHクライアントが公開鍵認証を行うための認証メカニズムを構築します。
    • 引数として ClientKeyring インターフェースを受け取ります。このインターフェースは、クライアントが認証時に使用する秘密鍵(またはその派生情報)を提供する責任を持ちます。
    • ClientKeyring は、単一の秘密鍵だけでなく、複数の鍵を管理する「キーリング」の概念を抽象化しています。例えば、ユーザーの ~/.ssh ディレクトリにある複数の秘密鍵を扱うことができます。
    • 新しい名前 ClientAuthKeyring は、この関数が単一の公開鍵ではなく、ClientKeyring が提供する鍵の集合を利用して認証を行うという、より正確な意味合いを伝えます。これにより、開発者はこの関数がより柔軟な鍵管理をサポートしていることを直感的に理解できます。
  2. ServerConfig.PublicKeyCallback (旧 ServerConfig.PubKeyCallback):

    • これは、SSHサーバーがクライアントからの公開鍵認証要求を処理する際に呼び出すコールバック関数です。
    • サーバーは、クライアントが提示した公開鍵が、指定されたユーザーに対して有効であるかどうかをこのコールバック関数に問い合わせます。
    • コールバック関数は、ユーザー名、鍵のアルゴリズム(例: ssh-rsa, ssh-dss)、および公開鍵のバイト列を受け取ります。
    • このコールバックの実装者は、データベースやファイルシステムなどからユーザーの登録済み公開鍵を取得し、クライアントが提示した鍵と照合するロジックを記述します。
    • true を返すと認証成功、false を返すと認証失敗となります。
    • PubKeyCallback から PublicKeyCallback への変更は、Goのコーディング規約に従い、略語を避けて完全な単語を使用することで、APIの可読性と一貫性を向上させるためのものです。機能的な変更は一切ありません。

これらの変更は、GoのSSHパッケージがより成熟し、そのAPIがより直感的でGoらしいものになるための重要なステップでした。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (GitHub): https://github.com/golang/go
  • Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/
    • このコミットのGerritチェンジリスト: https://golang.org/cl/5477059 (現在はGitHubにリダイレクトされる可能性があります)
  • SSH公開鍵認証に関する一般的な情報源 (例: Wikipedia, 各種技術ブログ)
  • Go言語の命名規則に関する情報源 (例: Effective Go, Go Code Review Comments)