0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SSH&公開鍵認証でリモート接続

0
Last updated at Posted at 2025-11-30

リモートPCに、SSH(Secure Shell)の公開鍵認証で接続する方法をまとめました。

前の以下記事で、VSCodeからリモートPCのワークスペースを開く方法を紹介した際にSSH接続にも触れたのですが、本題ではなかったこともあって解説を省略したので、その分を本記事でまとめてみました。

  • 1.SSH、公開鍵認証とは
  • 2.SSH接続(Windows)
  • 3.SSH接続(WSL2 Ubuntu)

1. SSH、公開鍵認証とは

SSHは、Secure Shellの略で、以下です。

ネットワークを介してリモートにあるPCに対して、コマンド実行など遠隔操作を行うための通信プロトコル

ネットワークを流れるデータに対して暗号化がかかるため、盗聴されにくく安全です。

同様のことを実現する通信プロトコルにtelnetがありますが、こちらは、暗号化されていない生のデータがネットワークに流れるため、入力したパスワードなどを盗聴されるリスクがあります。なので、現在は、SSHが主流になってます。前の記事で取り上げたVSCodeも、SSHを使って、リモートPCのワークスペースに対する遠隔操作(ビルド、デバッガ実行等)を実現しています。

また、公開鍵認証とは、SSH接続時のユーザー認証方法の1つで、以下です。

公開鍵、秘密鍵という錠前(錠と鍵のセット)を使って行うユーザー認証

「公開鍵」は「鍵」という単語が入ってますが、南京錠のような「錠」に相当します。
「公開鍵」という錠をあらかじめサーバー(リモートPC)に設置して施錠しておき、それを「秘密鍵」で開錠する、といったイメージです(下図)。

fig_公開鍵認証イメージ.png

ユーザー認証方法として最もポピュラーなのはパスワード認証で、SSHでもサポートしてます。手軽ですが、安易なパスワード(ユーザー名と同じにする等)にすると他人に推測されるリスクがあります。公開鍵認証だと、秘密鍵を推測するのはまず不可能と思われるので、その分安全です。

安全性以外でも、パスワード認証は、接続の際にキー入力を求められますが、公開鍵認証ではそれがないので、自動化に適しています。1時間おきにリモートPCに自動接続してファイルを取ってくる、といったスクリプトも実現しやすいです。

2. SSH接続(Windows)

本章では、Windows PC上でSSHサーバーを起動し、そこに別PCからSSH接続する手順を説明します。やりたいことは下図です。

fig_ssh接続_windows.png

ローカルPCがMac(しかも古い)なのはうちのPC事情でそうなっただけで、クライアント側の手順にはMac固有の事項がほぼない(フォルダパスぐらい)ので、ローカルPCがWindowsであってもそのまま適用可能です。

やることは以下です。

  • 2.1 SSHサーバーインストール&起動(リモートPC)
  • 2.2 ポート開放(リモートPC)
  • 2.3 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC)
  • 2.4 SSH接続(ローカルPC)

SSHは、ローカルPC/リモートPC双方に設定ファイルが点在します。下図に構成ファイルを整理しておきました。色々あるように見えますが、SSHクライアント、SSHサーバーのconfigと、秘密鍵/公開鍵ファイルだけで、割とシンプルです。

fig_ファイル構成_win.png

2.1 SSHサーバーインストール&起動(リモートPC)

リモートPC(Windows)で、SSHサーバーをインストール&起動するまでを説明します。ここでは以下を実施します。

  • OpenSSHサーバーのインストール
  • config編集(sshd_config)
  • OpenSSHサーバー起動

OpenSSHサーバーのインストール

SSHサーバーは、OpenSSHサーバーがWindows11の機能としてあるので、それをインストールすれば使用できます。インストールは、Windows11の設定アプリから行えます。手順を下図にまとめました。

OpenSSHサーバー有効化_windows.png

④のインストールは、すぐに終わるのかと思いきや、割と時間がかかりました。うちのPC環境で約10分ぐらいかかりました。

config編集(sshd_config)

OpenSSHサーバーのconfig(下図赤枠)を編集します。configファイル(sshd_config)の場所は下図記載の通りです。

OpenSSHサーバー_config_windows.png

configファイル(sshd_config)はテキストファイルなので、メモ帳やサクラエディタ等、お好きなテキストエディタで編集できますが、ここで1点注意点があります。

管理者権限で起動したテキストエディタでconfigファイル(sshd_config)をロードし、編集する

筆者はこれを怠り一般ユーザー権限でテキストエディタを起動してconfigファイルを編集してしまったがために、OpenSSHサーバーがconfig設定通りに起動できずDefault状態で起動してしまう、という現象に陥ってしまいました。

configファイルのセーブはちゃんとできていたので、原因がさっぱりわからず、ハマってしまいました。ChatGPTに聞くと色んな解決案を提案してくれるのですが、どれも成功せず、SIDサービスの有効化など、よくわからない回り道をさせられた挙句、OpenSSHサーバーが壊れているので無理、Windowsを再インストールしなさい、という乱暴な結論で締めくくられてしまいました。

Windowsの再インストールを実行する気にはなれなかったので、configファイルが読み込まれてない、という現象に立ち戻り、ググりながら、configファイルを再作成したり色々試行錯誤して、上述の解決案になんとかたどり着きました。

configファイル(sshd_config)を管理者権限のテキストエディタで開いたら、以下編集(編集箇所のみ抜粋)を行い、ポート変更&公開鍵認証の有効化、を行います。

c:\ProgramData\ssh\sshd_config(SSHサーバーのconfigファイル)
# ポート変更
Port 10022

# 公開鍵認証の有効化
PubkeyAuthentication yes

# 以下行はコメントアウト
#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

ポート変更は必須ではなく、何も設定しなければデフォルトポート(22)でSSHサーバーが起動します。ただ、デフォルトポート(22)は、SSHのポートとして広く知られているポート(下記URL参照)であり、狙われるリスクが高いので、安全性を高めるために、変更を行っておいたほうがよいです。上記ポート例(10022)以外でも、10000より上のポート番号は大体空いているので、好きなポートを指定すればよいです。

administrators_authorized_keysは、Windows独自の設定のようですが、よくわからないし、ググると、コメントアウトすべき、という意見が多かったので、コメントアウトしておきました。

OpenSSHサーバー起動

Windows11のサービスアプリからOpenSSHサーバーを起動します。

まず、サービスアプリを起動します。スタートボタンから「サービス」と検索し、出てきたサービスアプリをクリックすれば起動できます。コマンドラインだと、PowerShellやWin+Rから、services.mscを実行すれば起動できます。

サービスアプリ内で、「OpenSSH SSH Server」という項目を探して選択し、左上の「▶」(下図赤丸)をクリックすれば、SSHサーバーを起動できます。

ただし、これだけだと、PC再起動時にSSHサーバーは起動しないため、PC再起動の度にサービスアプリから「▶」をクリックすることになります。下図緑字の手順を追加実行すれば、PC起動時にSSHサーバーも自動起動するようになります。

OpenSSHサーバー起動_windows.png

2.2 ポート開放(リモートPC)

SSHサーバーで使用するポート(2.1節 sshd_configに記入したポート)を開放します。

Windowsの設定アプリから、下図手順で開放できます。

ポート開放_Windowsファイヤウォール1.png
ポート開放_Windowsファイヤウォール2.png

2.3 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC)

ローカルPCで公開鍵/秘密鍵を作成し、公開鍵をリモートPCに設置します(下図赤枠)。

公開鍵_秘密鍵_windows.png

公開鍵/秘密鍵の作成は、ローカルPCのターミナル上でssh-keygenコマンドを実行します。

ローカルPCのターミナル
# ホームフォルダに移動
cd $HOME

# .sshフォルダ作成(※既にある場合は不要)&移動
mkdir .ssh
cd .ssh

# 公開鍵、秘密鍵作成
#   問い合わせにはすべて空入力(リターンのみ)でOK
ssh-keygen -t ed25519

今回は、ローカルPC=Macで行いましたが、WindowsやLinuxでも同じコマンドでOKです。ホームフォルダ($HOME)の場所だけがOS毎に異なります。下表にまとめておきましたが、これを直接入力しなくても、ターミナルには$HOME(もしくは、~)と入力すればよいです。

OS ホームフォルダ($HOME)の場所(※xx:ユーザー名)
Mac /Users/xx
Windows c:\Users\xx
Linux(WSL2 Ubuntuも含む) /home/xx

ssh-keygenを実行するとファイルが2つ出力されますが、

  • id_ed25519が秘密鍵
  • id_ed25519.pubが公開鍵

です。どちらもテキストファイルなので、テキストエディタで中身を見ることができます。秘密鍵には、かなり長い文字の羅列が書き込まれています。公開鍵には、文字の羅列+ローカルPCのユーザー名/PC名が1行で書き込まれてます。

なお、ed25519というのは、デジタル署名アルゴリズムの1つで、従来のRSAより高速かつ安全、とのことなので、これを使っておけば無難かと思われます。


作成した公開鍵をリモートPCに設置します。

リモートPCに設置するのは、公開鍵 です。秘密鍵をリモートPCに「公開」してはいけません。

SSHサーバーは、リモートPCのホームフォルダ/.sshにあるauthorized_keysというファイルに登録されている公開鍵情報を参照するので、ここに、さきほど作成した公開鍵を登録します。authorized_keysファイルがもしなければ、あらかじめ空のテキストファイルとして作成しておきます。

このauthorized_keysファイルに、ローカルPCにある公開鍵ファイル(id_ed25519.pub)の中身をコピーします。

コピーの方法はいろいろありますが、今回は、リモートPCのWindowsエクスプローラ上で公開鍵ファイル(id_ed25519.pub)とauthorized_keysファイルを開いて、テキストエディタ上でコピペする方法をとりました(下図)。この方法だと、何をしているのか、がよくわかります。テキストエディタは一般ユーザー権限でOKです。

公開鍵のコピー_windows.png

なお、コピーは、以下記事のように、ssh-copy-idコマンドを使うのがメジャーなやり方のようです。ただ、これをやる場合は、本記事では有効化していないSSHのパスワード認証を一時的に有効化する必要がありそうです。

2.4 SSH接続(ローカルPC)

ローカルPCのターミナル上でsshコマンド(SSHクライアントソフトの1つ)を実行すれば接続できます。sshコマンドは、Windows/Linuxでも共通です。
Windowsなら、TeraTerm等、他のSSHクライアントソフトを使っても接続できます。

ローカルPCのターミナル
# SSH接続
#   ssh -i <秘密鍵> -p <リモートPCのポート> <リモートPCのユーザー名@IPアドレス>

ssh -i $HOME/.ssh/id_ed25519 -p 10022 takamasa@192.168.0.5

ローカルPC=Macでの実行例は下図です。リモートPC(Windows)のホームフォルダに接続できてます。
SSHサーバー接続_frommac_windows.png

ローカルPCのconfigファイル(下図赤枠)は、なくても上記で接続できます。ただ、configファイルがあれば、sshコマンドの入力を簡略化できます。

ローカルPCのconfigファイル.png

configファイルは、ローカルPCのホームフォルダ/.sshに、以下内容のテキストファイルを作成します。一般ユーザー権限のテキストエディタで作成してOKです。

$HOME/.ssh/config(ローカルPCのconfigファイル)
Host <ホスト名>  任意の名前
  HostName <リモートPCのIPアドレス>
  User <リモートPCのユーザー名>
  Port <リモートPCのポート>
  StrictHostKeyChecking no
  PasswordAuthentication no
  PreferredAuthentications publickey
  IdentityFile <秘密鍵>
  IdentitiesOnly yes
$HOME/.ssh/configの例
Host desk-windows
  HostName 192.168.0.5
  User takamasa
  Port 10022
  StrictHostKeyChecking no
  PasswordAuthentication no
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

configファイルを作成しておけば、sshコマンドの入力は下記のように簡略化できます。

ローカルPCのターミナル
# SSH接続
#   ssh <ホスト名> ※configファイルに入力したホスト名

ssh desk-windows

3. SSH接続(WSL2 Ubuntu)

Windows PC内のWSL2 Ubuntu上でSSHサーバーを起動し、そこに別PCからSSH接続する手順を説明します。やりたいことは下図です。

fig_ssh接続_wsl2_ubuntu.png

やることは以下です。2章と比べてやることが多く大変そうですが、3.2節のSSHサーバー絡みでハマりにくく、案外すんなり実行できます。

  • 3.1 WSL2ネットワークモード設定(リモートPC(Windows))
  • 3.2 SSHサーバーインストール&起動(リモートPC(WSL2))
  • 3.3 ポート開放(リモートPC(Windows))
  • 3.4 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC(WSL2))
  • 3.5 SSH接続(ローカルPC)

構成ファイルは下図です。WSL関連のconfigファイルが増えてます。

fig_ファイル構成_wsl2_ubuntu.png

3.1 WSL2ネットワークモード設定(リモートPC(Windows))

リモートPC(Windows)上で、WSL2のネットワークモードを、ミラーモード(mirrored)に設定します。

ミラーモードとは以下です。

WSL2の仮想ネットワークを、ホスト(Windows)の物理ネットワークにミラーリング(同一視)するモード

WSL2ミラーモード.png

WSL2では、仮想化技術によって、ホスト(Windows)のPC内部に、独立した仮想PCが生成されてます。Ubuntuもその仮想PCにインストールされます。ネットワークも、独立した仮想ネットワークがPC内部に生成されてます。仮想PCはそこにしか接続しておらず、かつ、外部PCから仮想ネットワークが見えないため、外部PCから仮想PCには、通常の手段では接続できません。

なので、ミラーモード登場以前は、外部PCから接続するために、ポートフォワードという処理を別途行う必要がありました。ポートフォワードとは、あるPCのポートへのアクセスを別PCのポートに転送する、という処理です。ホスト(Windows)のポートへのアクセスを、ポートフォワードで仮想PCのポートに転送することで、外部PCから仮想PCへの接続を確立させてました。

ただ、ミラーモードの登場によって、仮想ネットワークと物理ネットワークが同一視される(同一であるように見える)ようになるため、ポートフォワードをする必要がなくなり、外部PCからの接続確立が容易になりました。もっとも、ミラーモードを実現する手段として内部でポートフォワードが行われているのかもしれませんが、これを意識する必要はありません。

ミラーモードの説明がいささか長くなりましたが、ミラーモードに設定する方法は簡単です。

リモートPC(Windows)上にある、WSL2のconfigファイル(c:\Users\xx\.wslconfig)に以下を追記し、リモートPC(Windows)上でWSL2を再起動するだけです。

c:\Users\xx\.wslconfig(WSL2のconfigファイル)
[wsl2]
networkingMode=mirrored
リモートPCのターミナル(PowerShell)
# WSL再起動
wsl --shutdown

.wslconfigファイルがない場合は、空のテキストファイルとして作成し、テキストエディタで上記を書き込めばOKです。テキストエディタは一般ユーザー権限でよいです。

3.2 SSHサーバーインストール&起動(リモートPC(WSL2))

リモートPC(WSL2 Ubuntu)で、SSHサーバーをインストール&起動するまでを説明します。2章同様、以下を実施します。

  • OpenSSHサーバーのインストール
  • config編集(sshd_config)
  • OpenSSHサーバー起動

OpenSSHサーバーのインストール

OpenSSHサーバーのインストールは、WSL Ubuntuのターミナルから以下コマンドを実行します。

WSL2 Ubuntuターミナル
# SSHサーバー(sshd)インストール
sudo apt install openssh-server

config編集(sshd_config)

OpenSSHサーバーのconfig(下図赤枠)を編集します。configファイル(sshd_config)の場所は下図記載の通りです。

OpenSSHサーバー_config_wsl2_ubuntu.png

configファイル(sshd_config)はテキストファイルなので、お好きなテキストエディタ(vinanogeditemacs等)で編集可能です。ただし、2章同様、

管理者権限(※)で起動したテキストエディタで編集

(※)ubuntuの管理者権限(sudoを付与してエディタ起動)

する必要があります。

WSL2 Ubuntuターミナル
# テキストエディタ(nano)起動例(ubuntu管理者権限)
cd /etc/ssh
sudo nano sshd_config

ただ、2章のWindowsと異なるのは、誤って一般ユーザー権限のテキストエディタで編集した場合、編集結果のセーブがそもそもできないことです(アクセス権限エラーになる)。セーブ時のエラーで誤りに気づけるし、ホームフォルダ以外のファイルを管理者権限で編集する、というのはLinuxの常識ですので、Windowsのときのように原因不明のエラーにハマるリスクは小さいかと思われます。

configファイル(sshd_config)の編集内容は2章とほぼ同様です(以下)。administrators_authorized_keysの行はこちらには元々入ってないので、ケアは不要です。

/etc/ssh/sshd_config(SSHサーバーのconfigファイル)
# ポート変更
Port 20022

# 公開鍵認証の有効化
PubkeyAuthentication yes

OpenSSHサーバー起動

Windowsのサービスアプリに相当するsystemctlコマンドで起動します。ただし、WSL2のUbuntuでは、デフォルトでこのコマンドが無効化されているので、有効化が必要です。

systemctlコマンドの有効化は、WSL2 Ubuntu内の/etcフォルダにあるwsl.confというconfigファイル(テキストファイル)(下図赤枠)を以下内容で作成します。

/etc/wsl.conf(WSL2のconfigファイル)
[boot]
systemd=true

作成後にWSL2を再起動すれば、有効化完了です。

リモートPCのターミナル(PowerShell)
# WSL再起動
wsl --shutdown

OpenSSHサーバー_wslconf_wsl2_ubuntu.png

それにしても、なんでWSL2の設定ファイルが.wslconfigwsl.confの2つに分かれているのか。1つにまとめてくれればいいのに。。

有効化後は、systemctlコマンドでOpenSSHサーバーを起動します。WSL2起動時にSSHサーバーを自動起動する設定もこのコマンドで可能です。

WSL2 Ubuntuターミナル
# WSL2起動時にOpenSSHサーバーを自動起動する設定
sudo systemctl enable ssh

# OpenSSHサーバー起動
sudo systemctl start ssh

3.3 ポート開放(リモートPC(Windows))

ポート開放は、リモートPCのWindows上で行います(※WSL2 Ubuntu上ではない)。手順は、2.2節と全く同じですので、そちらを参照いただけたらと思います。

3.4 公開鍵/秘密鍵作成&設置(ローカルPC&リモートPC(WSL2))

ここも、2.3節と全く同様の手順で行えます。違いは公開鍵情報(authorized_keys)の格納フォルダだけです(下図)。手順は、2.3節を参照いただけたらと思います。

公開鍵_秘密鍵_wsl2_ubuntu.png

3.5 SSH接続(ローカルPC)

ここも、2.4節と全く同様の手順です。configファイルの例、および、SSH接続のsshコマンド実行例を抜粋します。詳細は2.4節を参照いただけたらと思います。

$HOME/.ssh/configの例
Host desk-wsl-ubuntu
  HostName 192.168.0.5
  User simasaki
  Port 20022
  StrictHostKeyChecking no
  PasswordAuthentication no
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
ローカルPCのターミナル
# SSH接続
#   ssh <ホスト名> ※configファイルに入力したホスト名

ssh desk-wsl-ubuntu

SSHサーバー接続_frommac_wsl2_ubuntu.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?