SSH 鍵認証セットアップ - パスワードレスで安全にログイン

SSH 鍵認証セットアップ - パスワードレスで安全にログイン

この記事で解決できること

  • SSH 鍵ペア(公開鍵・秘密鍵)を生成してサーバに接続する手順が分かる
  • ssh-copy-id で公開鍵を正しく配置できる
  • ~/.ssh/config で複数サーバを管理する方法が身につく

結論(3 ステップ)

  1. ssh-keygen -t ed25519 で鍵ペアを生成する
  2. ssh-copy-id user@server で公開鍵をサーバに配置する
  3. ssh user@server でパスワードなしでログインできる

前提(対象環境)

  • OS: Ubuntu / Debian / RHEL 系 Linux
  • クライアント・サーバ両方に OpenSSH がインストール済み
  • 初期設定時はパスワード認証でサーバにログインできる状態

なぜ鍵認証を使うのか?

パスワード認証より安全で自動化にも強い。鍵認証を使う主な理由は 3 点。

  • 安全性: 秘密鍵はクライアント端末から出ない。パスワードをネットワーク越しに送らない
  • ブルートフォース耐性: 数学的に十分な長さの鍵は総当たり攻撃が事実上不可能
  • 自動化: rsync・Ansible・CI/CD パイプラインで非対話的な接続が可能になる

1. 鍵ペアの生成

どのアルゴリズムを選ぶか?

現在は ED25519 一択。RSA-4096 より短く・安全で・高速。

ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub

-C は鍵のコメント(識別用)。省略しても動作する。

パスフレーズを設定する理由

パスフレーズを設定すると秘密鍵ファイル自体が暗号化される。端末を盗まれてもすぐには悪用されない。毎回入力が面倒なら ssh-agent で解決できる(後述)。

生成後の確認:

ls -la ~/.ssh/
total 16
drwx------ 2 user user 4096 May 31 10:00 .
drwxr-xr-x 8 user user 4096 May 31 10:00 ..
-rw------- 1 user user  419 May 31 10:00 id_ed25519
-rw-r--r-- 1 user user  107 May 31 10:00 id_ed25519.pub
  • id_ed25519秘密鍵): 権限 600。絶対に他者に渡さない
  • id_ed25519.pub公開鍵): サーバの ~/.ssh/authorized_keys に追記する側

2. 公開鍵をサーバに配置する

ssh-copy-id を使う(推奨)

パスワード認証が有効なうちに 1 回だけ実行する。

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s)
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed
user@server's password:
Number of key(s) added: 1

内部的には ~/.ssh/authorized_keys に公開鍵の内容を追記し、ディレクトリ・ファイルの権限も自動的に設定する。

ssh-copy-id が使えないときの手動配置

cat ~/.ssh/id_ed25519.pub | ssh user@server \
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

3. パーミッションを正しく設定する

SSH は ディレクトリとファイルの権限が不適切だと鍵認証を拒否 する設計になっている。

パス 正しい権限 理由
~/.ssh/ 700 所有者のみ読み書き実行
~/.ssh/authorized_keys 600 所有者のみ読み書き
~/.ssh/id_ed25519 600 秘密鍵は特に厳格に
~/.ssh/id_ed25519.pub 644 公開鍵は他者が読んでも問題ない

確認・修正コマンド:

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

4. 接続テスト

ssh -v user@server

-v(verbose)を付けると認証の詳細ログが出力される。

...
debug1: Offering public key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx
debug1: Server accepts key: /home/user/.ssh/id_ed25519 ED25519 SHA256:xxxxx
Authenticated to server ([x.x.x.x]:22) using "publickey".

Authenticated to server ... using "publickey" が出れば鍵認証成功。

5. ~/.ssh/config で接続設定を管理する

複数サーバを管理する場合、~/.ssh/config で接続設定を名前にまとめられる。

vim ~/.ssh/config

設定例:

Host myserver
    HostName 192.168.1.100
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519
    Port 22

Host staging
    HostName staging.example.com
    User deploy
    IdentityFile ~/.ssh/id_ed25519

設定後は ssh myserver だけで接続できる。

chmod 600 ~/.ssh/config

~/.ssh/config のパーミッションが 644 より緩いと SSH が設定ファイルを無視することがある。600 にしておく。

6. ssh-agent でパスフレーズを管理する

パスフレーズを毎回入力しなくて済む仕組み。セッション開始時に 1 回だけ入力すれば以後省略できる。

# エージェントを起動
eval "$(ssh-agent -s)"

# 鍵を登録(1 回だけパスフレーズを入力)
ssh-add ~/.ssh/id_ed25519
Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com)

登録済み鍵の確認:

ssh-add -l

macOS は Keychain 統合により自動的に ssh-agent が動作する。~/.ssh/configUseKeychain yesAddKeysToAgent yes を追記すると再起動後も引き継がれる。

まとめ

コマンド 用途
ssh-keygen -t ed25519 鍵ペア生成(ED25519 推奨)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server 公開鍵をサーバに配置
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys 権限を正しく設定
ssh -v user@server 詳細ログ付きで接続テスト
eval "$(ssh-agent -s)" && ssh-add エージェントにパスフレーズを預ける

次に読む