SSH関連の概念的まとめ

過去記事:

  1. SSHの事情と理屈と設定 - (新) 檜山正幸のキマイラ飼育記 メモ編
  2. SSHコマンドとconfig - (新) 檜山正幸のキマイラ飼育記 メモ編
  3. wt(Windows Terminal) + SSH - (新) 檜山正幸のキマイラ飼育記 メモ編

これらの内容を概念的にまとめる。

内容:

情報リソース

まず、関連する情報リソース(ロケーションを持つデジタルデータ)に概念的名前を付ける。

概念的名前 実際のパス 名称
SSHDir ~/.ssh/ SSHディレクトリ
PrivateKey 自由 秘密鍵{ファイル}?
PpublicKey 自由 公開鍵{ファイル}?
KeyPair 自由 鍵ペア
Config ~/.ssh/config 設定{ファイル}?
AuthorizedKeys ~/.ssh/authorized_keys アクセス許可公開鍵リスト
KnownHosts ~/.ssh/known_hosts ホスト公開鍵リスト

※AuthorizedKeysは、用語的には AuthenticatedKeys 。認証〈AutheN | オーセ〉と認可〈AuthoriZ | オーソ{リ | ライ}〉は違う。

上記の情報リソースはファイルシステムのファイルとして存在するが、注意事項は:

  1. 秘密鍵と公開鍵の置き場所は自由だが、鍵ペアは同じディレクトリに置く。SSHDirに置く必要性はない。
  2. とはいえ、鍵ペアをSSHディレクトリに置くのが管理が楽(関連ファイル達がファイルシステム内で散らばらない)。
  3. 秘密鍵があれば、公開鍵は計算できる。が、同時に生成してペアとして扱う。
  4. コンベンションとして、秘密鍵ファイル名と公開鍵ファイル名に共通の文字列を持たせて、それを鍵名〈鍵タイトル〉として使う。鍵名は、エージェント(行動環境における行動主体)の名称とみなせる。
  5. 「デフォルトの鍵名」が使えるかもしれないが、デフォルトは諸悪の根源、使わないこと!
  6. 公開鍵のデータ本体は、1行のBase64エンコード文字列である。パディングにイコール文字が使われる。前後に短いメタデータが付くかも知れない。
  7. 公開鍵リストは、1つの公開鍵を1行とする単なるテキストファイルである。

行動主体と行動環境

今まで「エージェント」と呼んできたが、「SSHエージェント」「ユーザーエージェント」などと混同するから、行動主体にする。行動主体は、現実世界の実体ではなくて、抽象化された概念的な存在物。行動主体は、やはり概念的な行動環境内で主体的に行動する。

行動主体と行動環境を表すデータを代理データと呼ぶ。

  • 行動主体の代理データ
  • 行動環境の代理データ

代理データは次の構成素からなる。

  • 識別子: ある名前スコープ内において、個体を一意識別する。
  • クレデンシャル: 身分証明書みたいなデータ

ある状況(多くの状況)においては、行動主体をユーザー、行動環境をホストと呼ぶ。

アカウント概念

アカウントは、ユーザー〈行動主体〉とホスト〈行動環境〉の結びつき/関連性のことだが、複合データとしての構成素は:

  1. ユーザー識別子: 文字列
  2. ユーザークレデンシャル: 文字列(巨大整数の表現)
  3. ホスト識別子: 文字列(番号の文字列含む)
  4. ホストクレデンシャル: 文字列(巨大整数の表現)
  5. アカウント識別子: 文字列(名前)

アカウントは、単純有向二部グラフ(多重辺を持たない二部グラフ)のラベル付き有向辺として表現される。

二部グラフのノードは:

  • (ユーザー識別子, ユーザークレデンシャル) のノード=ユーザーノード
  • (ホスト識別子, ホストクレデンシャル) のノード=ホストノード

有向辺の方向はどっちでもいいが、ユーザー → ホスト の方向と約束する

アカウントの記述

SSHコマンドとconfig - (新) 檜山正幸のキマイラ飼育記 メモ編 で出した、SSH config エントリーはまさにアカウントの記述になっている。

Host daphnia-chimaira
  HostName 160.251.23.194
  User chimaira
  IdentityFile C:\Users\m-hiyama\.ssh\daphnia-chimaira_ed25519_key
  1. ユーザー識別子: "chimaira"
  2. ユーザークレデンシャル: ファイル C:\Users\m-hiyama\.ssh\daphnia-chimaira_ed25519_key の内容
  3. ホスト識別子: "160.251.23.194"
  4. ホストクレデンシャル: "160.251.23.194" をキーとして known_hosts を引いた結果
  5. アカウント識別子: "daphnia-chimaira"

ここで文字列データの記述方法は:

  1. インライン: 160.251.23.194(ホスト識別子) と chimaira(ユーザー識別子) と daphnia-chimaira(アカウント識別子)
  2. ファイルの内容を参照: C:\Users\m-hiyama\.ssh\daphnia-chimaira_ed25519_key(ユーザークレデンシャル)
  3. キーバリュー・ストアのキー: 160.251.23.194 はキーにもなっている。(ホストクレデンシャル)

この場合のキーバリュー・ストアとは ~/.ssh/known_hosts ファイルで、行の先頭文字列がキーで、公開鍵データの文字列がバリュー。

クレデンシャルの本体は秘密鍵だが、秘密鍵を秘匿したままで公開鍵がクレデンシャル(身分証明書、本人確認署名)として使えるところが公開鍵方式のミソ。

接続とその記述

アカウントは、ユーザー〈行動主体〉とホスト〈行動環境〉のあいだの“確立された関係性”である。

より具体的で一回性のイベントとして接続がある。アカウントの記述は接続の(一般的)記述とみてもよいが、次の Windows Terminal の設定がより接続っぽい。

{
    "backgroundImage": 〈null | "イメージファイル名"〉,
    "colorScheme": "Solarized Light",
    "commandline": "ssh コマンドライン",
    "guid": "{d2c4024c-bdae-5a30-81ff-877fed55010a}",
    "icon": "C:\\Users\\m-hiyama\\Pictures\\2021-08\\ConoHa-Co.jpg",
    "name": "ConoHa"
},

このなかで、UIに関わるプロパティ〈フィールド〉は:

  • backgroundImage
  • colorScheme
  • icon

guid〈一意識別子〉 と name〈タイトル〉 によって接続を識別している。commandlineは接続の実現方法の記述で、背後にアカウント(具体的には SSH configエントリー)がある。