SSH 鍵認証・接続設定 | SSH
SSH鍵認証
SSHでは秘密鍵は手元だけに保管し、公開鍵だけをサーバーへ登録します。
新規に鍵を作成する場合は Ed25519 が推奨されています。
鍵を作成
Ed25519形式:
$ ssh-keygen -t ed25519 -C "your_email@example.com"
参考記事:https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
-tは鍵の種類(Type)を指定します。新規作成では Ed25519 が推奨されています。-fで出力先をフルパスで指定できます。- 指定しない場合は秘密鍵が
$HOME/.ssh/id_ed25519、公開鍵が$HOME/.ssh/id_ed25519.pubに作成されます。 -Cは公開鍵に付与するコメントです。省略すると通常はユーザー@ホストが設定されます。-C ""を指定するとコメントを空にできます。- 対話中のパスフレーズ入力で空のまま Enter を押すと、パスフレーズなしの鍵になります。
-N ""は同じ結果を非対話で指定する方法です。
RSA形式
RSA鍵も利用できますが、新規作成では Ed25519 が推奨されています。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
補足
OpenSSHで非推奨なのは RSA鍵そのものではなく、古い
ssh-rsa(SHA-1署名)です。 RSA 4096 + SHA-2署名は現在でも利用できます。
参考:https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
リモートホストへ公開鍵を登録
公開鍵をサーバー側の ~/.ssh/authorized_keys に登録します。
- サーバー:
example.com - ユーザー:
foo
推奨:ssh-copy-id
ssh-copy-id は .ssh ディレクトリの作成やパーミッション設定まで行うため、安全で簡単です。
$ ssh-copy-id foo@example.com
手動で登録する場合
# 公開鍵は id_ed25519.pub とする
local$ cat ~/.ssh/id_ed25519.pub | ssh foo@example.com "cat >> ~/.ssh/authorized_keys"
authorized_keys を上書きしないよう >> で追記します。
パーミッション
サーバー側では以下の権限にします。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
秘密鍵のパーミッション
秘密鍵は所有者だけが読み書きできる権限にします。
一般的には 600 が推奨されます(400 でも利用可能です)。
chmod 600 ~/.ssh/id_ed25519
所有者以外に権限があると Permission denied になる場合があります。
パスフレーズを省略(ssh-agent)
[!NOTE] SSHではパスフレーズなしの鍵を作成することもできます。
対話入力では空のまま Enter、 非対話では
-N ""を指定します。
パスフレーズを設定した場合は ssh-agent に登録すると毎回入力する必要がありません。
~/.ssh/config
SSH設定は ~/.ssh/config に記述できます。
ログイン情報を設定
Host example
HostName example.com
User foo
IdentityFile ~/.ssh/id_ed25519_example
IdentitiesOnly yes
接続は以下だけです。
$ ssh example
実行時に指定することもできます。
$ ssh -i ~/.ssh/id_ed25519_example myuser@xxx.xxx.xxx.xxx
IdentitiesOnly
IdentitiesOnly yes を設定すると、指定した秘密鍵だけを送信します。
複数の鍵を持っている場合の認証失敗を防げます。
パスフレーズの自動入力
OSによって挙動が異なります。
Linux
Host *
AddKeysToAgent yes
macOS
Host *
AddKeysToAgent yes
UseKeychain yes
挙動の違い
| 項目 | Linux | macOS |
|---|---|---|
| ssh-agent | 使う | 使う |
| パスフレーズ保管 | agent(メモリ) | Keychain |
| 再起動後 | 再登録が必要 | 通常不要 |
| セッション跨ぎ | agent存続中は保持 | 保持 |
補足
UseKeychainは macOS 専用です。Linuxでは指定するとエラーになる環境があります。
ssh-agent の起動
デスクトップ環境では自動起動することが多いですが、環境によっては手動起動が必要です。
eval "$(ssh-agent -s)"
StrictHostKeyChecking
SSHは初回接続時にサーバーのホスト公開鍵を ~/.ssh/known_hosts に保存します。
2回目以降は保存済みの鍵と照合し、同じサーバーか確認します。
| 値 | 挙動 |
|---|---|
ask(デフォルト) |
確認して登録 |
yes |
登録済みのみ接続 |
accept-new |
未登録だけ自動登録 |
no |
確認せず接続 |
通常運用
$ ssh user@example.com
初回は確認が表示されます。
The authenticity of host 'example.com' can't be established.
Are you sure you want to continue connecting? (yes/no)
CI/CD
対話できない環境では known_hosts を事前登録する方法が安全です。
mkdir -p ~/.ssh
ssh-keyscan -H example.com >> ~/.ssh/known_hosts
その後通常どおり接続できます。
ssh user@example.com
[!IMPORTANT]
ssh-keyscanの結果をそのまま信頼するのではなく、 可能であれば事前にサーバー管理者からフィンガープリントを確認して登録することを推奨します。
用途別
| 用途 | 推奨 |
|---|---|
| 通常運用 | ask |
| CI/CD | known_hosts事前登録 |
| セキュリティ重視 | yes |
~/.ssh/config 設定例
Linux
Host *
AddKeysToAgent yes
Host foo
HostName xxx.xxx.xxx.xxx
User foo
IdentityFile ~/.ssh/id_ed25519_foo
IdentitiesOnly yes
Host hoge
HostName xxx.xxx.xxx.xxx
User hoge
IdentityFile ~/.ssh/id_ed25519_hoge
IdentitiesOnly yes
macOS
Host *
AddKeysToAgent yes
UseKeychain yes
Host foo
HostName xxx.xxx.xxx.xxx
User foo
IdentityFile ~/.ssh/id_ed25519_foo
IdentitiesOnly yes
多段接続(踏み台サーバー)
現在は ProxyJump が推奨されています。
Host gateway
HostName xxx.xxx.xxx.xxx
User ubuntu
IdentityFile ~/.ssh/secret.key
Host target
HostName 10.xxx.xxx.xxx
User ubuntu
IdentityFile ~/.ssh/secret.key
ProxyJump gateway
IdentitiesOnly yes
ProxyCommand ssh -W %h:%p gateway でも実現できますが、ProxyJump の方が簡潔です。
参考:https://www.wakuwakubank.com/posts/681-ssh-portforward-multistage/
フィンガープリント
秘密鍵・公開鍵のどちらからでも同じフィンガープリントになります。
内部では秘密鍵から公開鍵を導出して計算しています。
代表的なハッシュは
- SHA256(現在の標準)
- MD5(互換性用途)
SHA256
$ ssh-keygen -lf id_ed25519
MD5
$ ssh-keygen -E md5 -lf id_ed25519
公開鍵でも同じ結果になります。
$ ssh-keygen -lf id_ed25519.pub
参考:https://linuxfan.info/ssh-pubkey-fingerprint
SFTP
SFTP情報だけ渡された場合でも、SSH接続できる場合があります。
Address: example.vs.sakura.ne.jp
User: myuser
Pass: mypassword
接続例
$ ssh myuser@example.vs.sakura.ne.jp
パスワードを入力します。
[!NOTE] SFTP専用アカウントでは、SSHシェルには入れず SFTPのみ利用できる場合があります。
PPK形式
PuTTY系ソフトウェアでは秘密鍵を PPK形式 に変換する必要がある場合があります。
FileZillaは通常OpenSSH形式の秘密鍵も利用できますが、環境によって変換が必要と表示されることがあります。