whoami.filippo.ioはSSHサーバーとして、ユーザーの公開鍵から自動的に識別情報を取得する仕組みを備えたプロジェクトです。本記事では、このプロジェクトを拡張し、カスタム認証メカニズムと複数プラットフォームでの運用を実現する方法について解説します。
コア処理の理解
whoami.filippo.ioの主要な処理はserver.goファイルに集約されています。このファイルにはSSHサーバー設定と認証処理のロジックが含まれており、特に`Server`構造体と`Handle`メソッドが重要な役割を果たします。認証処理では`PublicKeyCallback`を通じて公開鍵を収集し、`findUser`メソッドでユーザーをマッチングします。
カスタム認証の実装手順
1. 認証情報源の拡張
現在はGitHubのみをサポートしていますが、以下のように複数の情報源を検索する処理を追加できます。
// server.goのfindUserメソッドを拡張
func (s *Server) lookupUser(keySet []ssh.PublicKey) (int64, error) {
// GitHubからの検索
userId, err := s.lookupGitHubUser(keySet)
if err == nil && userId != 0 {
return userId, nil
}
// カスタムデータソースからの検索
userId, err = s.lookupCustomSource(keySet)
if err == nil && userId != 0 {
return userId, nil
}
return 0, nil
}
2. 配置ファイルの導入
認証ルールのカスタマイズを可能にするために、YAML形式の設定ファイルを導入します。これにより、ユーザーが独自のデータソースやマッチング条件を指定できるようになります。
3. プラグイン式認証フロー
認証処理を拡張した例:
// server.goのauthHandlerメソッド
func (s *Server) authHandler(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
// 現有処理
// カスタム認証ロジックの適用
if s.config.EnableCustomAuth {
customID, err := s.customAuthProvider.Validate(key)
if err == nil && customID != "" {
return &ssh.Permissions{Extensions: map[string]string{"user": customID}}, nil
}
}
// 現有処理
}
マルチプラットフォーム対応戦略
1. 多様なコード管理サービスのサポート
GitLabやBitbucketなど他のサービスとの連携を実現:
// GitLabクライアントの導入
import (
"github.com/xanzy/go-gitlab"
)
// Server構造体にGitLabクライアントを追加
type Server struct {
// 既存フィールド...
gitLabClient *gitlab.Client
}
// GitLabユーザー検索メソッド
func (s *Server) lookupGitLabUser(keySet []ssh.PublicKey) (int64, error) {
// GitLab API操作ロジック...
}
2. デプロイ環境の最適化
Dockerfileの修正とKubernetes用デプロイメントファイルの追加:
- Dockerfileの変更
- deployment.yamlの作成
- go.modでのアーキテクチャサポートの追加
機能検証の手順
1. ローカルテスト
テストツールの使用例:
go run cmd/lookup/main.go
2. 統合テスト
テストケースの更新と新規テストスクリプトの作成。
3. デプロイテスト
Fly.ioやKubernetesでのデプロイによる動作確認。
拡張可能性と今後の展望
このプロジェクトはSSHプロトコルの柔軟性を活かした認証システムの実例です。今後可能な拡張方向:
- 企業内Gitサーバーとの統合
- OAuth2ベースの認証フローの実装
- 利用者アクティビティログの記録機能
プロジェクトのクローン:
git clone https://gitcode.com/gh_mirrors/wh/whoami.filippo.io