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形式の秘密鍵も利用できますが、環境によって変換が必要と表示されることがあります。