SSH鍵したい(ssh-keygen / ssh-add

// SSH鍵ペアの確認
$ ssh-keygen -l
Enter file in which the key is (~/.ssh/id_ed25519):

// SSH鍵ペアの生成
$ ssh-keygen

// SSH鍵ペアの登録
$ ssh-add
Enter passphrase for ~/.ssh/id_ed25519

ssh-keygenコマンドでSSH鍵(公開鍵と秘密鍵のペア)を生成できます。 この鍵は、パスワード入力を省略したSSH接続やGit操作など、SSH認証の自動化に利用できます。

注釈

GitHubなどのサービスでは、パスワード認証はすでに廃止されており、SSH鍵などによる公開鍵認証が前提となっています。 そのため、SSH鍵の作成・管理は、これらのサービスを利用するうえでほぼ必須の作業です。

各種サービスに登録するのは必ず公開鍵です。 秘密鍵は絶対に誰にも渡してはいけないデータです。 もし、秘密鍵が漏洩してしまった場合は、 外部サービスに登録している公開鍵を削除したり、 端末のSSH鍵を再作成したりする必要があります。

SSH鍵は頻繁に作成するものでもないため、 これまでにSSH鍵を作成したことがあるかどうか、 どの暗号アルゴリズムで鍵を生成したのか、 など忘れてしまっていることも多いと思います。 -lオプションで既存のSSH鍵のフィンガープリントなどを表示できるので、 作成したような記憶がある場合は、まず確認してみるとよいです。

注釈

SSH鍵はデフォルトで~/.ssh/に作成されます。 ディレクトリを直接確認してもよいですが、 ssh-keygen -lするほうがお手軽です。

参考

ssh-keygenはSSH接続のために鍵を生成するコマンドですが、「公開鍵暗号方式」そのものは、他の目的でも広く使われています。

代表的なツールとして、 メールなどの電子署名を作成するgpgや SSL/TLS証明書や鍵を扱うopensslが あります。

どれも公開鍵暗号方式を基盤としていますが、用途や鍵の形式、必要となる利用シーンが異なります。 そのため、同じ鍵やファイルに互換性はなく、別ツールでそのまま使い回すことはできません。

目的に応じてコマンドを使い分けてください。

SSH鍵ペアを作りたい(ssh-keygen

$ ssh-keygen -t ed25519 -C "コメント"
$ ssh-keygen -t ed25519 -C "ユーザー名_パソコンの名前_作成年"
$ ssh-keygen -t ed25519 -f {service}_ed25519 -C "$(whoami)_$(hostname)_$(date +'%Y')"

ssh-keygenコマンドでSSH鍵(公開鍵と秘密鍵のペア)を作成できます。 秘密鍵を保護するために、専用のパスフレーズを設定してください。

注釈

このパスフレーズは、生成した秘密鍵を使用する時に必要となる文字列です。

リモートサーバーにログインするパスワードや、その他のサービスのパスワードとは独立したものなので、同じにする必要はありません。 むしろ、まったく別の文字列を設定することを推奨します。

注意

秘密鍵のパスフレーズを忘れた場合、復元する方法はありません。 その場合は、新しいSSH鍵を作成し、各サービスに登録している古い公開鍵を削除した上で、新しい公開鍵を登録してください。

-tオプションで鍵の種類(アルゴリズム)を変更できます。 選択した鍵の種類に応じて ~/.ssh/以下に秘密鍵公開鍵のファイルが作成されます。 -fオプションで、鍵ファイルの保存先やファイル名を変更できます。

注釈

公開鍵と秘密鍵は必ずペアで作成されます。 ファイル名の末尾に.pubがついているのが公開鍵、 ついていないのが秘密鍵です。

ed25519鍵を作成した場合は、デフォルトで ~/.ssh/id_ed25519.pub(公開鍵)と ~/.ssh/id_ed25519(秘密鍵)が生成されます。

-Cオプションでコメントを指定できます。 このコメントは人間が識別するためのもので、SSHの鍵認証そのものには影響しません。

自由な文字列を設定できますが、 「誰が($(whoami))」 「どの端末で($(hostname))」 「いつごろ($(date +"%Y"))」 作ったかがわかるようにしておくとよいと思います。

注釈

コメントは公開鍵ファイルに保存されます。 公開鍵は、第三者に渡る可能性があるデータであるため、秘匿すべき情報はコメントとして入力しないように注意してください。

以前は「メールアドレス」を記載するのが慣習とされていましたが、 個人情報の露出を控えたい場合は、自分自身が識別できる情報に限定して問題ありません。

参考

公開鍵そのものは、第三者が取得しても暗号的に問題ありません。 これは公開鍵暗号の設計に基づきます。

ただし、公開鍵末尾のコメントに個人情報や内部情報が含まれている場合、その情報が偵察(OSINT)に利用され、フィッシングの下準備、アカウントの名寄せ、組織情報の推測といった悪用につながる可能性があります。

ヒント

職場と自宅で別々の端末を利用するなど、ひとりで複数の端末を所有している場合は多いと思います。 その場合、端末同士は別人と考えて、端末ごとにSSH鍵ペアを生成するのがよいです。 各種サービスにも、端末ごとに作成した公開鍵をそれぞれ登録します。

ある端末で作成したSSH鍵ペア(とくに秘密鍵)を、別の端末にコピーして使い回すのでは、 公開鍵暗号を利用する意味がありません。

鍵アルゴリズムを変更したい(ssh-keygen -t

// ed25519鍵(デフォルト)
$ ssh-keygen
id_ed25519
id_ed25519.pub

// ECDSA鍵
$ ssh-keygen -t ecdsa
id_ecdsa
id_ecdsa.pub

// RSA鍵
$ ssh-keygen -t rsa
id_rsa
id_rsa.pub

-tオプションで鍵アルゴリズムを変更できます。 現在のOpenSSH(v9)では、 ed25519 / rsa / ecdsaから選択できます。 デフォルトはed25519です。

また、物理セキュリティキー向けの ed25519-sk / ecdsa-skオプションもあります。

参考

2020年ころのOpenSSH(v8)では、 鍵アルゴリズムはrsa / dsa / ecdsa / ed25519 の4種類から選択でき、デフォルトはrsaとなっていました。

現在ではdsaは完全に非推奨となっています。 またrsaを使う場合は、鍵の長さを3072ビット以上に設定することが推奨されています。

鍵の長さを変更したい(ssh-keygen -b

// RSA鍵(3072ビット以上推奨)
$ ssh-keygen -t rsa -b 4096

// ECDSA鍵(256 / 384 / 521ビットから選択)
$ ssh-keygen -t ecdsa -b 521

-bオプションでrsa鍵の長さ(=ビット数)を変更できます。 ecdsa鍵では楕円曲線のサイズを256 | 384 | 521から選択できます。

注釈

ed25519鍵と*-sk鍵は鍵長が固定のため、-bオプションを指定しても無視されます。

サービスごとに鍵を作成したい(ssh-keygen -f

// GitHub用
$ ssh-keygen -f ~/.ssh/github_ed25519

// GitLab用
$ ssh-keygen -f ~/.ssh/gitlab_ed25519

-fオプションで、SSH鍵ぺアのファイル名を変更できます。 このようにしてサービスごとに鍵を切り替えることができます。

参考

SSHの設定ファイルIdentityFileに秘密鍵のパスを設定することで、サービスごとに自動切り替えできます。

ヒント

ある秘密鍵が漏洩してしまった場合、その鍵ペアを無効化する必要があります。 具体的には、関連するすべてのサービスから該当する公開鍵を削除し、必要に応じて新しい鍵ペアを作成・登録しなおす必要があります。

サービスごとに鍵を生成していた場合は、当該サービスに対応する鍵ペアのみを無効化して、再設定すればOKです。 ただし、サービス数が増えると鍵の管理は煩雑になります。 サービスごとに鍵を生成するかどうかは、ユーザー自身の利用形態に合わせて検討してみてください。

秘密鍵を登録したい(ssh-add

// 秘密鍵を登録する
$ ssh-add
Enter passphrase for ~/.ssh/id_ed25519: # 秘密鍵のパスフレーズを入力
Identity added: ~/.ssh/id_ed25519

// 登録を確認する
$ ssh-add -l
256 SHA256:鍵情報 (ED25519)

// macOSの場合: KeyChainに登録する
$ ssh-add --apple-use-keychain ~/.ssh/id_ed25519(秘密鍵)
Identity added: 鍵のパス

ssh-addは秘密鍵をssh-agentに登録するためのコマンドです。 登録された鍵は、SSH接続やGit操作の際に自動的に使用され、パスフレーズの再入力を省略できるようになります。

注釈

GitHubなどでは、リモートリポジトリに対する操作を行うたびに、秘密鍵のパスフレーズ入力が求められます。 作業開始時にssh-agentに秘密鍵を登録することでその入力を省略できます。

ssh-add -lで、現在のssh-agentに登録されている鍵の情報を確認できます。

注釈

ssh-agentは、秘密鍵の情報を専用メモリに保持して管理するSSH鍵の番人です。 ログアウトや再起動によって登録内容がリセットされるため、環境によっては作業開始時にssh-addを実行する必要があります。

参考

SSHの設定ファイルAddKeysToAgent yesを設定すると、 SSH接続時に自動でssh-addが実行されます。 初回の接続時のみ秘密鍵のパスフレーズ入力が必要ですが、以降のセッション(=ssh-agentが有効な間)ではパスフレーズ入力を省略できます。

// macOSの場合: KeyChainに登録する
$ ssh-add --apple-use-keychain ~/.ssh/id_ed25519(秘密鍵)
Identity added: 鍵のパス

macOSの場合は --apple-use-keychainすることで、 秘密鍵のパスフレーズをmacOSのKeychainに保存できます。 SSH接続するときには、OpenSSHがKeychainからパスフレーズを自動的に取得し、ssh-agentと連携してくれます。 再ログインしたあとでも、ユーザーがパスフレズを入力する必要がなくなります。

注釈

以前のmacOSではssh-add -Kオプションが使われていましたが、現在では--apple-use-keychainに置き換えられました。

公開鍵をリモートサーバに登録したい(ssh-copy-id

// 公開鍵をリモートサーバに登録する
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub アカウント名@リモートサーバ
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "~/.ssh/id_ed25519.pub"
...(省略)...
アカウント名@リモートサーバ's password:    ## リモートサーバのログインパスワードを入力

Number of key(s) added:        1
...(省略)...

ssh-copy-idコマンドを使って、SSHの公開鍵をリモートサーバに登録できます。 -iオプションで、登録したい公開鍵のパスを明示的に指定できます。

ひとつのリモートサーバに対して複数の公開鍵を登録できます。 たとえば、通常ユーザーと特権ユーザーで鍵を分けたり、職場と自宅で別々の端末を使っている場合に、端末ごとの公開鍵を登録できます。

// すでに登録されている公開鍵を、追加しようとした場合
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub アカウント名@リモートサーバ
...(省略)...
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)

登録した公開鍵は、リモートサーバーの~/.ssh/authorized_keysに追記されます。 公開鍵を追加しても、既存の公開鍵は削除されません。 すでに登録されている場合は、エラーを表示して教えてくれます。

注釈

公開鍵をはじめて登録する場合は、リモートサーバーに「パスワード認証」でログインできる必要があります。 サーバー側でパスワード認証が無効になっている場合は、サーバー管理者に公開鍵の設置を依頼する必要があります。

注意

ssh-copy-idは追加専用のコマンドで、削除オプションはありません。 登録した公開鍵を無効にする場合は、サーバー上にある~/.ssh/authorized_keysから該当する鍵を直接削除してください。

公開鍵を更新する場合は、必ず新しい公開鍵を登録し、その鍵でログインできることを確認してから、古い公開鍵を削除するようにしてください。 作業の順番を間違えると、サーバーにログインできなくなる可能性があります。

とくに、パスワード認証が無効になっているサーバーでは、完全にロックアウトされる危険があります。 注意して作業してください。

公開鍵を外部サービスに登録したい

// 公開鍵の内容をクリップボードにコピーする

// macOS
$ cat ~/.ssh/id_ed25519.pub | pbcopy

// 以下は未確認ですが、たぶんできるはず
// Linux (X11)
$ cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard

// Linux (Wayland)
$ cat ~/.ssh/id_ed25519.pub | wl-copy

// WSL2
$ cat ~/.ssh/id_ed25519.pub | clip.exe

// PowerShell
$ Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard

外部サービスには、SSH鍵ペアの公開鍵を登録してユーザー認証できるものがあります。 その際、手順のどこかで「公開鍵のコピー」が必要です。 ターミナルに表示して、マウスでドラグしてコピーしてもいいのですが、空白や改行などの余計な文字をまでうっかり含めてしまわないか心配です。

そのような場合は、(macOSの)pbcopyコマンドが便利です。 標準出力をそのままクリップボードにコピーできるため、余計な文字が混ざる心配がありません。

注釈

GitLabやGitHubなどのサービスでは、具体的な手順を記したページがあります。 それぞれのサービスのヘルプを参照してください。