2026年5月21日

2026年5月21日

SSHキーの安全な管理方法:作成・登録・権限・パスフレーズ・入れ替えと失効

SSHキー(公開鍵認証)を使うと、パスワードを送らずにサーバーへログインできます。ただし、秘密鍵が漏れればその鍵でログインできる全サーバーが危険になります。この記事では、鍵を作るところから、保管・登録・確認・入れ替え・失効まで、日常の管理で必要な操作をまとめます。

コマンドは OpenSSH(Linux・macOS・Windows 10/11 に標準搭載のクライアント)を前提にしています。サーバー側の例は Ubuntu で、RHEL 系(AlmaLinux・Rocky Linux)で違う点は都度書きます。

SSHキーの基本:公開鍵と秘密鍵

ファイル 置き場所 扱い
秘密鍵(例: ~/.ssh/id_ed25519) 手元のPCだけ 他人に渡さない。サーバーに置かない
公開鍵(例: ~/.ssh/id_ed25519.pub) ログイン先サーバーの ~/.ssh/authorized_keys 見られても問題ない

サーバーに登録するのは公開鍵だけです。秘密鍵をサーバーにコピーしたり、チャットやメールで送ったりしないでください。

手順1:鍵を作る

新しく作るなら Ed25519 を選びます。鍵が短く、OpenSSH の現行版で広く使えます。

ssh-keygen -t ed25519 -C "taro@laptop-2026"
  • -C はコメントです。後で「どの端末の鍵か」を見分けられるよう、利用者名と端末名を入れておくと管理が楽になります。
  • 保存先を聞かれたら、そのまま Enter で ~/.ssh/id_ed25519 に保存されます。用途ごとに分けたい場合は ~/.ssh/id_ed25519_work のように名前を変えます。
  • パスフレーズは設定してください。 秘密鍵ファイルが盗まれても、パスフレーズが分からなければ使えません。毎回の入力は後述の ssh-agent で省けます。

古いサーバーや機器が Ed25519 に対応していない場合だけ、RSA を使います。

ssh-keygen -t rsa -b 4096 -C "taro@laptop-2026"

手順2:公開鍵をサーバーに登録する

Linux・macOS では ssh-copy-id を使うと、サーバー側の ~/.ssh/authorized_keys に公開鍵を追記し、権限も整えてくれます(この時点ではパスワードでログインします)。

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.10

Windows の PowerShell には ssh-copy-id がありません。次のように公開鍵を送って追記します。

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

登録できたら、鍵でログインできるか確かめます。

ssh -i ~/.ssh/id_ed25519 user@203.0.113.10

手順3:ファイルの権限を確認する

権限が緩すぎると、手元の ssh は秘密鍵の読み込みを拒否し、サーバー側の sshd は authorized_keys を無視します(sshd の StrictModes が既定で有効なため)。

手元のPC(Linux・macOS):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

サーバー側:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

ホームディレクトリ自体がグループや他人から書き込める状態(chmod 777 など)でも、公開鍵認証は失敗します。

秘密鍵を別の場所へ移してシンボリックリンクを張るような運用は、管理が複雑になるだけで安全性は上がりません。~/.ssh に置いたまま、権限とパスフレーズで守るのが基本です。

手順4:ssh-agent と ~/.ssh/config で使いやすくする

ssh-agent でパスフレーズの入力を省く

ssh-agent に鍵を登録すると、ログアウトするまでパスフレーズの再入力が不要になります。

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l    # 登録済みの鍵の一覧

Windows では ssh-agent のサービスが既定で無効になっています。管理者の PowerShell で一度だけ有効にし、その後 ssh-add を実行します。

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

~/.ssh/config で接続先ごとに鍵を決める

鍵が複数あるときは、接続先ごとに使う鍵を ~/.ssh/config に書いておきます。

Host web01
    HostName 203.0.113.10
    User deploy
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

これで ssh web01 だけで接続できます。IdentitiesOnly yes を付けると、指定した鍵だけを使います。ssh-agent に鍵がたくさん入っていると、順に試すうちにサーバー側の試行回数の上限(MaxAuthTries、既定は6)に達して接続を切られることがあるため、その対策になります。

手順5:鍵だけでログインできるようにする

鍵でログインできることを確認したら、サーバー側でパスワード認証を止めます。作業中のSSH接続は切らずに残し、別のターミナルで確認しながら進めてください。設定を誤っても、残した接続から元に戻せます。

Ubuntu 22.04 / 24.04 では、/etc/ssh/sshd_config の先頭で /etc/ssh/sshd_config.d/*.conf を読み込み、同じ項目は最初に読まれた値が有効になります。ファイルは名前の順に読まれるので、既存のファイル(例: クラウド環境で作られる 50-cloud-init.conf)より前に来る名前で作ります。

sudoedit /etc/ssh/sshd_config.d/01-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

PermitRootLogin prohibit-password は、root では鍵でのみログインを許す設定です。root でのログイン自体を禁じるなら no にします(その前に sudo を使える一般ユーザーで鍵ログインできることを確認してください)。

設定の文法と、実際に有効になる値を確かめてから再起動します。

sudo sshd -t
sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractive|permitrootlogin'
sudo systemctl restart ssh     # RHEL 系は sshd

別のターミナルから、鍵を使わない接続が拒否されることを確認します。

ssh -o PubkeyAuthentication=no user@203.0.113.10
# Permission denied (publickey). と表示されれば、パスワードではログインできない状態です

手順6:登録済みの鍵を棚卸しする

どの鍵が登録されているか

サーバーの authorized_keys に入っている鍵のフィンガープリントとコメントを一覧にできます。

ssh-keygen -lf ~/.ssh/authorized_keys

手元の鍵のフィンガープリントは次のとおりです。

ssh-keygen -lf ~/.ssh/id_ed25519.pub

どの鍵でログインされたか

ログイン記録は authorized_keys ではなく、サーバーのログに残ります。成功したログインには、使われた鍵のフィンガープリントが記録されます。

# Ubuntu
sudo grep 'Accepted publickey' /var/log/auth.log | tail -n 20
# systemd の journal から見る場合(Ubuntu のサービス名は ssh、RHEL 系は sshd)
sudo journalctl -u ssh --since today | grep 'Accepted'

Accepted publickey for deploy from 198.51.100.7 port 51234 ssh2: ED25519 SHA256:... の SHA256:... の部分を、上の一覧と突き合わせれば、どの鍵(どの人・どの端末)で入ったかが分かります。

手順7:鍵を入れ替える・失効させる

パスフレーズだけ変える

鍵はそのままで、パスフレーズだけを変えられます。

ssh-keygen -p -f ~/.ssh/id_ed25519

鍵を入れ替える

  1. 新しい鍵を作る(手順1)
  2. 新しい公開鍵をサーバーに登録する(手順2)
  3. 新しい鍵でログインできることを確認する
  4. サーバーの ~/.ssh/authorized_keys から古い鍵の行を削除する

端末の紛失・退職・漏えいのとき

その鍵で入れるすべてのサーバーの authorized_keys から、該当する行を削除します。鍵の行の末尾にあるコメント(-C で付けた文字列)やフィンガープリントで探します。

grep -n 'taro@laptop-2026' ~/.ssh/authorized_keys

秘密鍵の側で「失効」させる仕組みはないため、サーバー側から消すことが失効の手段です。どの鍵をどのサーバーに登録したかを、一覧にして管理しておくと、この作業を漏れなく行えます。

手順8:鍵ごとに使える範囲を絞る(任意)

authorized_keys の各行の先頭にオプションを付けると、その鍵の使い道を制限できます。

from="198.51.100.0/24" ssh-ed25519 AAAAC3Nza... taro@laptop-2026
restrict,command="/usr/local/bin/backup.sh" ssh-ed25519 AAAAC3Nza... backup@nas
  • from= は、指定した接続元からのみこの鍵を受け付けます。
  • restrict はポート転送や端末割り当てなどをまとめて禁止し、command= はログイン時に実行するコマンドを固定します。バックアップなど自動処理用の鍵に向いています。

管理のポイント

  • 1人1鍵、端末ごとに別の鍵にする(共有の鍵を使い回すと、1人分だけ失効できない)
  • 秘密鍵にはパスフレーズを付ける
  • 鍵のコメントに利用者と端末名を入れ、登録先のサーバーを一覧にしておく
  • 不要になった鍵は authorized_keys から削除する
  • パスワード認証を止める作業は、既存の接続を残したまま行う

SSHサーバー側の設定全般は SSHのセキュリティ設定 も参考にしてください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲