【PowerShell】パスワードなしでSSH接続する方法|秘密鍵と公開鍵の仕組み

【PowerShell】パスワードなしでSSH接続する方法|秘密鍵と公開鍵の仕組み PowerShell

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.logjournalctl -u sshを確認します。

ssh -v user@server.example.com
# サーバー側の典型的な権限設定
chmod 700 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R <user>:<user> ~/.ssh

既定と異なる鍵名を使った場合はIdentityFileconfigに記述します。秘密鍵のフォーマット変換が必要な古いサーバーでは、RSA鍵を追加発行して暫定対応する選択肢もあります。

セキュリティ運用で押さえるポイント

秘密鍵は暗号化して保管し、複数端末で使い回さず端末ごとに発行します。不要になった公開鍵はauthorized_keysから速やかに削除します。
ブルートフォース対策としてはパスワード認証の無効化、二段階目としての多要素認証、さらにAllowUsersPermitRootLogin noなどのサーバー設定が有効です。

# /etc/ssh/sshd_config の一例(要再起動)
PasswordAuthentication no
PermitRootLogin no

まとめ

PowerShellからのパスワードなしSSHは、鍵ペアの作成、公開鍵のサーバー登録、ssh-agentの活用、~/.ssh/configでの自動化という流れを押さえれば、すぐに実運用へ投入できます。
失敗時は権限とログを丁寧に確認し、秘密鍵の厳格な保護とパスワード認証の停止を組み合わせることで、快適さとセキュリティを両立できます。