Summary ¶
2026年も始まりました。
年末は仕事に追われ、年越し後からようやくおやすみになりました。。
はじめに ¶
OpenSSH, Win32-OpenSSH があるが Version で進化してきた。簡単ではあるがまとめる。
OpenSSH 機能対応バージョン
| 機能 | 対応バージョン | リリース日 |
|---|---|---|
| ed25519 | 6.5 | 2014-01 |
| ProxyJump (-J) | 7.3 | 2016-08-01 |
| ControlPath %C | 6.7 | 2014-10 |
| Include (ssh_config) | 7.3 | 2016-08-01 |
| Include (sshd_config) | 8.2 | 2020-02-14 |
| IdentityFile .pub指定 | 不明 (古くから対応) | - |
機能対応マトリクス
| OS | OpenSSH version | ed25519 | ProxyJump | %C | Include |
|---|---|---|---|---|---|
| Ubuntu 14.04 | 6.6 | X | X | X | |
| Ubuntu 16.04 | 7.2 | X | X | ||
| Ubuntu 18.04 | 7.6 | ||||
| Ubuntu 20.04 | 8.2 | ||||
| Ubuntu 22.04 | 8.9 | ||||
| Ubuntu 24.04 | 9.6 | ||||
| CentOS/RHEL 5 | 4.3 | X | X | X | X |
| CentOS/RHEL 6 | 5.3 | X | X | X | X |
| CentOS/RHEL 7 | 7.4 | ||||
| RHEL 8 | 8.0 | ||||
| RHEL 9 | 8.7 | ||||
| Windows 11 22H2 | 8.6 | ||||
| Windows 11 23H2 | 9.4 | ||||
| Windows 11 24H2 | 9.5 | ||||
| Windows 11 25H2 | 9.8 |
OS とデフォルトバージョンのリストを見ると、現在主要な OS は ed25519 鍵に対応しているし、 OpenSSH 7.3 (Ubuntu 18.04, CentOS 7, Windows 11 22H2)以上であれば、今回紹介する方法は実現できる。のでどれか一つでも試してみましょう。
ファイル構造 ¶
複数の端末を使う場合、 dotfiles にして Git で管理することになる。
この場合管理対象が増えてくると構造化して案件やプロジェクトが終了したら ~/.ssh/conf.d/nodes/ の設定ファイルで Include をやめるか conf.old のように名前を変えれば接続先には出ず、不用意にアクセスすることを防止するが設定は保管しておくことができる。(結構、廃止したプロジェクトでも過去のアクセス情報を探すのに ssh/config を確認するケースは多い)
| |
envs ¶
~/.ssh/conf.d/envs/ は各環境ごとの実際の Host 設定を格納する。
これを分けておくことで、ファイル内では Host * するなど共通の設定を末尾にまとめて書くことが出来、見通しがよくなり、大量の書く場合も User user1 のように普段と違うユーザーにしている箇所などがわかりやすくなる。
| |
この例では、
- Host は
<org>.<envs>.<hostname>の命名を採用する。- こうすることでファイル末尾に
Host org.dev.*汎用設定をまとめることが可能記述自体がスッキリする。
- こうすることでファイル末尾に
ProxyJumpを利用することで、ProxyCommandを覚えてなくても bastion 経由のアクセスを定義できるし TOKEN を覚える必要がないので認知負荷も少ない。
nodes ¶
| |
_commons.conf はどの接続にも設定した汎用的なデフォルト設定をすべて記載するファイル。
これをしておくことで envs 配下に複数に同じ設定を書かずに済む。
| |
linux.localhost.conf は Include のみの記載に済ませることをおすすめする。ssh/config の仕様として ~/.ssh からの相対パスのため conf.d/ から始まるのは覚えておこう
linux.localhost.conf は私の terminal では複数環境で環境固有の設定を読み込む場合に下記のコマンド結果を shell 変数として保持しており、つなげた名前のファイルを動的に読み込むことで行っているのでその名残である。自身がわかる名前であれば良いと思う。
| |
keys ¶
言わずのがなだろうが、簡単に。
SSH 秘密鍵はできれば Yubikey や Windows Hello などの ed25519-sk を使うのが一番良いと個人的には思うが実態としてまだまだ ssh-agent の利用は普及してないため、、鍵の保管場所を定めて使いやすくするのが目的である。
| |
トピックとして ssh-agent を利用している場合でも agent に登録されている鍵が5個以上になると世の中の sshd では認証失敗になるケースがある。そもそも ssh 時には鍵を順番に送付してしまうためセキュリティ的にも良くない。
IdentitiesOnly yes と IdentityFile である。IdentitiesOnly を設定することで IdentityFile に合致する鍵のみで認証するようになる。IdentityFile は普段は秘密鍵を設定するが、前述の通り公開鍵を指定することでも動作する、これを使うと ssh-agent に 10個とか鍵があっても適切な鍵のみを Target に送信するためセキュアで認証失敗になることもない。~/.ssh/config ¶
今までの設定が済んでいれば、 nodes 配下にある該当の conf を Include に1行書けば設定が終わる
| |
ドキュメント ¶
AddKeysToAgent ¶
AddKeysToAgent は IdentityFile で指定した鍵を指定時間だけ ssh-agent に登録できる。パスフレーズを設定している鍵は登録されることで入力が省略され利便が上がる。が、秘密鍵を適切に管理していればすでに ssh-agent やパスワード管理ツールで保管して ssh-agent で利用しているだろうから効能は薄い。 30m のよう指定すると30分後に ssh-agent から削除される
| |
Control* ¶
ControlMaster, ControlPersist, ControlPath シリーズ。
ControlMaster- SSH 接続を多重化して認証を簡略化したり高速化する
no(defualt): 通常の独立した接続として動作auto: マスター接続を使おうとするが、存在しない場合は新規作成
ControlPath- 接続共有に使用するコントロールソケットのパスを指定
ControlPersist- 最初のクライアント接続終了後もマスター接続を維持する期間を指定
no(default): 最初のクライアント接続が閉じると即座にマスター接続も閉じる- 秒数 または時間形式: 指定した時間アイドル状態が続いた後に自動終了
利便よく使いたい場合は下記がおすすめ、 ControlPath の設定がミソで OpenSSH6.7 から %C を使うことで %l%h%p%r%j のハッシュを取るこれを取ることで従来の mux-%r@%h:%p.sock のような呪文を書かずに済む。また踏み台ホストが増えて path が長くなって使えなくなる事象も発生しないので無難に利用するべき。
%l: ドメイン名を含むローカルホスト名%h: リモートホスト名%p: リモートポート番号%r: リモートユーザー名%j: ProxyJumpオプションの内容(未設定なら空文字列)
| |