SSH 鍵認証セットアップ - パスワードレスで安全にログイン
この記事で解決できること
- SSH 鍵ペア(公開鍵・秘密鍵)を生成してサーバに接続する手順が分かる
ssh-copy-idで公開鍵を正しく配置できる~/.ssh/configで複数サーバを管理する方法が身につく
結論(3 ステップ)
ssh-keygen -t ed25519で鍵ペアを生成するssh-copy-id user@serverで公開鍵をサーバに配置する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
権限が 777 や 755 など緩すぎると SSH サーバは鍵を無視して Permission denied (publickey) を返す。接続できない場合は権限を最初に確認する。
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/config に UseKeychain yes と AddKeysToAgent 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 |
エージェントにパスフレーズを預ける |