PowerShellからLinuxサーバーへ「パスワードなし」で安全にSSH接続するには、秘密鍵と公開鍵による公開鍵認証を使います。
仕組みはシンプルで、クライアント側に秘密鍵を安全に保管し、サーバー側には対応する公開鍵だけを登録します。
認証時には鍵ペアで作られた電子署名を検証するため、通信路でパスワードを送らずに本人性を確認できます。
ここではWindows環境(PowerShell)を前提に、鍵の作成からサーバー登録、設定の自動化、トラブル解消までを順に解説します。
鍵ペアを作成する(ed25519推奨)
まずPowerShellを開き、ssh-keygen
で鍵ペアを作成します。アルゴリズムは軽量かつ強度に優れるed25519
を推奨します。
ファイル保存先の既定はユーザープロファイル配下のC:\Users\<ユーザー名>\.ssh
です。パスフレーズは空でも動作しますが、流出耐性を高めるため設定するのが安全です。
ssh-keygen -t ed25519 -C "your-name@your-device"
作成後は秘密鍵がid_ed25519
、公開鍵がid_ed25519.pub
として保存されます。秘密鍵はバックアップを取りつつ厳重に保管し、他者と共有してはいけません。
公開鍵をサーバーへ登録する
次に公開鍵の内容をサーバーの認証ファイルに追記します。PowerShellで公開鍵を表示し、サーバー側の対象ユーザーの~/.ssh/authorized_keys
に一行として貼り付けます。
サーバーにssh-copy-id
が用意されていればそれを使っても構いません。ファイルとディレクトリのパーミッションが厳しすぎると認証が拒否されるため、ホーム配下は一般的な権限に整えます。
# 公開鍵の内容を表示
Get-Content -Raw $HOME\.ssh\id_ed25519.pub
# サーバー側での例(ユーザーのシェル上)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
printf '%s\n' 'ssh-ed25519 AAAA... コメント' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
公開鍵は拡散しても秘匿性は不要ですが、改変や改行の混入は認証失敗の原因になります。改行は一行、末尾に余計な空白を入れないよう注意します。
パスワードなしで接続できることを確認する
登録が済んだらPowerShellから接続を試します。初回はホスト鍵の保存確認が表示されます。信頼できるホストであることを確認したうえで続行します。
秘密鍵の場所を明示したい場合は-i
を付けます。以降の接続でパスワード入力が求められなければ設定は成功です。
ssh user@server.example.com
# あるいは
ssh -i $HOME\.ssh\id_ed25519 user@server.example.com
ssh-agentでパスフレーズ入力を省略する
秘密鍵にパスフレーズを設定した場合は、Windowsのssh-agent
サービスに鍵を登録しておくと、セッションごとの入力を省略できます。
サービスを自動起動に切り替え、ssh-add
で鍵を一度読み込ませると、再起動後も保持されます。
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $HOME\.ssh\id_ed25519
ssh-add -l
端末を離れる際はssh-add -D
で登録をクリアすると安全性が高まります。機密度の高い環境ではタイムアウト付きのエージェント利用も検討します。
configファイルで接続を自動化する
接続先が増えてきたら~/.ssh/config
に設定をまとめ、別名一語で接続できるようにします。ユーザー名、ポート番号、鍵ファイル、踏み台経由などを一箇所で管理でき、運用の手戻りを防げます。
# C:\Users\<ユーザー名>\.ssh\config
Host web
HostName server.example.com
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
StrictHostKeyChecking accept-new
準備が整えばPowerShellからはssh web
の短いコマンドでパスワードなし接続が完了します。踏み台が必要な場合はProxyJump
で中継を自動化できます。
公開鍵認証の仕組みを簡潔に理解する
公開鍵認証では、サーバーがクライアントに乱数を出題し、クライアントは秘密鍵で署名して応答します。サーバーは事前登録された公開鍵で署名を検証し、一致すれば本人だと判断します。
秘密鍵はクライアントから外へ出ないため、盗聴でパスワードが露出するリスクを回避できます。アルゴリズムは楕円曲線を用いるed25519
やRSAが一般的で、現行ではed25519
が推奨されます。
うまくいかない場合の確認点
認証に失敗するときは、サーバー側の~/.ssh/authorized_keys
の改行や余白、権限、ホームディレクトリの所有者を見直します。
OpenSSHの詳細ログを有効化すると原因を素早く絞り込めます。クライアント側はssh -v
で、サーバー側は/var/log/auth.log
やjournalctl -u ssh
を確認します。
ssh -v user@server.example.com
# サーバー側の典型的な権限設定
chmod 700 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R <user>:<user> ~/.ssh
既定と異なる鍵名を使った場合はIdentityFile
をconfig
に記述します。秘密鍵のフォーマット変換が必要な古いサーバーでは、RSA鍵を追加発行して暫定対応する選択肢もあります。
セキュリティ運用で押さえるポイント
秘密鍵は暗号化して保管し、複数端末で使い回さず端末ごとに発行します。不要になった公開鍵はauthorized_keys
から速やかに削除します。
ブルートフォース対策としてはパスワード認証の無効化、二段階目としての多要素認証、さらにAllowUsers
やPermitRootLogin no
などのサーバー設定が有効です。
# /etc/ssh/sshd_config の一例(要再起動)
PasswordAuthentication no
PermitRootLogin no
まとめ
PowerShellからのパスワードなしSSHは、鍵ペアの作成、公開鍵のサーバー登録、ssh-agent
の活用、~/.ssh/config
での自動化という流れを押さえれば、すぐに実運用へ投入できます。
失敗時は権限とログを丁寧に確認し、秘密鍵の厳格な保護とパスワード認証の停止を組み合わせることで、快適さとセキュリティを両立できます。