目的
SSHでサーバーのターミナルを開いたり、Gitに接続したりしてますが、必要になる度に毎回調べなおしている気がするので備忘のために基本的なところをまとめておきます。
概要
- 何かのサービスを提供するサーバーにクライアントのアカウントを登録する際に、クライアントで作成した公開鍵をサーバーに登録しておきます。
- 以降、クライアントがサーバーに接続する度に登録された公開鍵を使った認証が行われます。(公開鍵認証)
- 公開鍵認証の手順ではサーバーがクライアントから接続要求を受けた時に、クライアントの公開鍵を使って暗号化した認証データをクライアントに送信し、クライアントが自分の秘密鍵を使ってこれを復号しサーバーに応答を返す事で認証が成立します。
- 公開鍵認証方式ではパスワードの入力を必要としません。
(代わりにパスフレーズの入力を求められたりしますが、これについては後述)
インストール
各環境用の ssh インストール方法はググれば簡単に見つかるので説明を割愛します。
鍵ペアの作成
# 鍵ペア生成の例 $ssh-keygen -t ed25519 -f ~/.ssh/<秘密鍵ファイル名> -N "パスフレーズ"
暗号化方式
- 作成するカギの暗号化方式は OpenSSH_9.3p1 では dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa から選べます。
- dsa は古い方式なので使うなら ecdsa にすべき rsa はよく使われるが安全性を確保するには長い鍵長が必要。
- 拘りがなければed25519を使うのが現在の最善。
- 末尾に -sk がついているのは物理デバイスを併用する暗号方式。
パスフレーズ
- 鍵ペアを作るときにパスフレーズを聞かれるが、これは秘密鍵自体を暗号化してそれを復号化する際のキーとなるもの。
- パスフレーズを付けることで、万一秘密鍵が人手に渡ってしまっても悪用を防げる。
- ただし、設定すると秘密鍵を使う度にパスフレーズの入力が必要になり面倒。
- ssh-agent に秘密鍵を登録すれば、エージェント起動後に一度だけパスフレーズを入力すれば済むようになる。
ssh接続の設定
Host <Hostのエイリアス名> HostName <HostのURLまたはIPアドレス> IdenfityFile <秘密鍵ファイルへのパス> <その他のオプション> <オプションの値>
- その他のオプションには次のものが指定できます。
- Port <接続に使用するポート番号(Default 22)>
- User <接続に使用するアカウント名>
- ProxyCommand <プロキシ経由で接続するためのコマンド>
- ForwardAgent <エージェント転送(後述)を有効にするか>
- PreferredAuthentications <サーバー接続時、認証方法の優先順位を指定>
publickey | password | keyboard-interactive | gssapi-with-mic
秘密鍵の利用
ssh-agent 起動
- ssh-agent を自動起動するにはサービスとしてシステム起動時に起動するか、シェル(bash等)の初期化スクリプトで起動する方法の2通りの方法があります。
- また、Windows,Linux,MacOSなどシステムごとに実行方法が異なるので、それぞれの環境に適した起動方法を採用してください。
# Windows の GitBash で ssh-agent を起動する例を示します。 $ tail ~/.bashrc # Start the SSH agent automatically if [ -z "$SSH_AUTH_SOCK" ]; then eval $(ssh-agent -s) fi
秘密鍵登録
秘密鍵転送
- 秘密鍵転送の目的は、HostA で作成した鍵ペアの情報を使って HostC にアクセスする時、別のホスト HostB を経由しなければならないときに秘密鍵を HostB にコピーせずに済むようにすること。
- サーバーに ssh 接続するには公開鍵をサーバーに登録しておく事と、クライアントが秘密鍵を保持している事が必要だが、秘密鍵転送を使うと、途中経過のHostB に秘密鍵自体をコピーしなくても ssh-agent 同士が秘密鍵の情報を転送することができ、秘密鍵流出のリスクを減らすことができる。
- 秘密鍵転送を使うには .ssh/config の経由先ホストの記述に ForwardAgent yes と記述しておく
# ~/.ssh/config Host HostB HostName HostB.home.local ForwardAgent yes