— Blog
WindowsにSSHサーバーを一時的に入れて、LAN内の別PCから接続する手順(後片付けまで)
目次
「別の部屋にあるWindows PCを、手元のPCから調べたい」「預かったPCのログを、手元でじっくり見たい」。そんなときに便利なのが、Windowsに標準で付いている OpenSSH サーバーです。この記事では、同じLAN内からだけ接続できるように一時的に入れて、作業が終わったらきれいに消すまでの手順を、コピーして使えるコマンド付きでまとめます。
この記事でやること
- 接続される側のPC(以下「相手PC」)に OpenSSH サーバーを入れる
- ファイアウォールで、同じLAN内からの接続だけを許可する
- 手元のPC(以下「手元PC」)の鍵を登録し、パスワード無しで接続できるようにする
- 手元PCから
sshで接続し、ファイルをコピーする - 作業が終わったら、入れたものを全部消して、消えたことを確認する
前提と注意
- どちらのPCも Windows 10(1809以降)または Windows 11。手元PCには
sshコマンドが最初から入っています - 2台が同じLAN(同じルーターの下)につながっていること
- 相手PCで管理者としてPowerShellを開けること(スタートを右クリック →「ターミナル(管理者)」)
- OpenSSH サーバーのインストールにはインターネット接続が必要です(Windows Update から取ってきます)
コマンドの上に、どちらのPCで実行するかを色で示しています。
相手PC(管理者) 接続される側のPC。管理者のPowerShellで実行します。
手元PC 接続する側のPC。普通のPowerShellで実行します。
他人のPCで作業するときは、持ち主の了解を必ず取ってください。SSHが入っている間は、鍵を持つ人がそのPCを管理者として操作できます。
また、ルーターでポート22を外部に開ける(ポート転送する)ことは絶対にしないでください。この記事は、LAN内だけで使う前提です。
手順0:今の状態を記録する
最初に、OpenSSH サーバーがもともと入っていたかどうかを確認します。後片付けのときに「消してよいのか、元の状態に戻すだけなのか」が変わるので、結果はメモしておきます。
相手PC(管理者)Get-WindowsCapability -Online -Name OpenSSH.Server* | Select-Object Name, State Get-Service sshd -ErrorAction SilentlyContinue | Select-Object Name, Status, StartType
State が NotPresent で、Get-Service が何も表示しなければ、入っていない状態です。この記事の後片付け手順で、まるごと消してかまいません。
State が Installed なら、もともと入っています。この場合、手順1は飛ばしてください。後片付けでは機能を消さずに、元の状態に戻します(最後の章の「もともと入っていた場合」)。
手順1:OpenSSH サーバーを入れる
相手PC(管理者)Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
数分かかることがあります。最後に Online : True と表示されれば成功です。RestartNeeded : True と表示された場合は、再起動してから次に進みます。
手順2:SSHサービスを起動する
相手PC(管理者)Start-Service sshd Set-Service -Name sshd -StartupType Automatic Get-Service sshd
Status が Running になれば起動しています。
Automatic にすると、相手PCを再起動しても自動でSSHが立ち上がります。負荷テストなどで再起動が起きる作業のときに便利です。再起動のあとはSSHを止めておきたい場合は、Manual にしてください。
初めて起動したときに、設定フォルダ C:\ProgramData\ssh\ が作られます。
手順3:ファイアウォールでLAN内だけに絞る
インストールすると「OpenSSH-Server-In-TCP」という受信許可のルールが自動で作られます。ただし初期状態では、接続元が制限されていません。これを同じネットワーク(LocalSubnet)からの接続だけに絞ります。
相手PC(管理者)Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress LocalSubnet Get-NetFirewallRule -Name OpenSSH-Server-In-TCP | Get-NetFirewallAddressFilter
RemoteAddress : LocalSubnet と表示されればOKです。
ルールが見つからないというエラーが出たときは、次のコマンドで作ってください。
相手PC(管理者)New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -RemoteAddress LocalSubnet
手順4:手元PCの鍵を用意する
パスワードではなく鍵で接続します。鍵にしておくと、相手PCのパスワードを教えてもらう必要がありません。Microsoft アカウントでサインインしているPCでも、問題なく使えます。
まず、手元PCに鍵がすでにあるかを確認します。
手元PCTest-Path $env:USERPROFILE\.ssh\id_ed25519.pub
False と表示されたら、鍵を作ります(質問はすべて Enter で進めてかまいません)。True なら、この作成は飛ばします。
ssh-keygen -t ed25519
最後に、公開鍵(.pub の方)を表示します。
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
ssh-ed25519 AAAA… で始まる1行が表示されます。この1行を相手PCへ持っていきます(USBメモリ、チャット、メモ帳などで構いません)。
相手PCに渡すのは .pub が付いた公開鍵だけです。公開鍵は人に見られても大丈夫です。
.pub が付いていない id_ed25519 は秘密鍵なので、絶対に外へ出さないでください。
手順5:相手PCに鍵を登録する
相手PCで使うアカウントが管理者の場合、鍵は C:\ProgramData\ssh\administrators_authorized_keys に登録します(ユーザーフォルダの .ssh ではありません。ここを間違えて接続できない、というのがよくあるつまずきです)。
1行目の '…' の中を、手順4で表示した公開鍵の1行に置き換えて実行します。
$key = 'ssh-ed25519 AAAA...ここに手順4の1行を貼る...' Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $key -Encoding ascii icacls.exe C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "*S-1-5-32-544:F" /grant "*S-1-5-18:F"
3行目の icacls は、このファイルを開ける人をAdministrators と SYSTEM だけに絞るコマンドです。ほかの人も開ける状態だと、SSHがファイルを無視するので、鍵で接続できません。
*S-1-5-32-544(Administrators)と *S-1-5-18(SYSTEM)はグループを番号で指定する書き方で、日本語版のWindowsでもそのまま使えます。
使うアカウントが管理者ではない場合は、そのユーザーの C:\Users\<ユーザー名>\.ssh\authorized_keys に同じ1行を書きます。
手順6:パスワードでのログインを止める(おすすめ)
鍵で接続できるようにしたので、パスワードでのログインは止めておきます。設定ファイルの先頭に1行足すだけです(SSHの設定は、先に書かれた方が使われます)。
相手PC(管理者)$p = 'C:\ProgramData\ssh\sshd_config'
Copy-Item $p "$p.bak"
Set-Content -Path $p -Value (@('PasswordAuthentication no') + (Get-Content $p)) -Encoding ascii
Restart-Service sshd
元の設定は sshd_config.bak に控えてあります。
手順7:相手PCのIPアドレスとユーザー名を調べる
相手PC(管理者)whoami
Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike '127.*' -and $_.IPAddress -notlike '169.254.*' } | Select-Object InterfaceAlias, IPAddress
whoamiはpc名\ユーザー名の形で表示されます。\より後ろの部分が、SSHで使うユーザー名です- IPアドレスは、たいてい
192.168.x.xの形です。有線と無線の両方が表示されたときは、手元PCと同じネットワークの方を使います
手順8:手元PCから接続する
ユーザー名 と 192.168.0.50 を、手順7で調べた値に置き換えます。
ssh ユーザー名@192.168.0.50
初めて接続するときは「Are you sure you want to continue connecting?」と聞かれるので、yes と入力します。プロンプトが ユーザー名@PC名 C:\Users\…> になれば、接続できています。
最初はコマンドプロンプト(cmd)が開きます。PowerShellを使いたいときは、powershell と入力してください。終わるときは exit です。
コマンドを1つだけ実行する
手元PCssh ユーザー名@192.168.0.50 hostname ssh ユーザー名@192.168.0.50 systeminfo
ファイルを手元PCにコピーする
scp を使います。相手PC側のパスは、C:/… のようにスラッシュで書くと楽です。
# 1ファイルを、手元PCの今いるフォルダへ scp ユーザー名@192.168.0.50:C:/Windows/System32/drivers/etc/hosts .\ # フォルダごとコピーする scp -r ユーザー名@192.168.0.50:C:/作業フォルダ .\
うまくいかないとき
| 表示されるメッセージ | よくある原因 | 確認・対処 |
|---|---|---|
Connection timed out | ファイアウォール、IPアドレスの間違い、別のネットワークにいる | 手順3のルールを確認します。2台が同じルーターにつながっているか、IPアドレスが正しいかも見直します |
Connection refused | SSHサービスが止まっている | 相手PCで Get-Service sshd を実行し、Running でなければ Start-Service sshd |
Permission denied (publickey) | 鍵の登録場所、ファイルの権限、ユーザー名の間違い | 管理者なら administrators_authorized_keys に登録しているか、手順5の icacls を実行したか、ユーザー名が whoami の結果と同じかを確認します |
| とくに無し(理由が分からない) | — | 相手PCでSSHの記録を見ます:Get-WinEvent -LogName 'OpenSSH/Operational' -MaxEvents 20 |
後片付け:入れたものを全部消す
作業が終わったら、相手PCを元の状態に戻します。手順0で NotPresent(もともと入っていなかった)だった場合の手順です。
相手PC(管理者)Stop-Service sshd -ErrorAction SilentlyContinue Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Remove-NetFirewallRule -Name OpenSSH-Server-In-TCP -ErrorAction SilentlyContinue Remove-Item C:\ProgramData\ssh -Recurse -Force -ErrorAction SilentlyContinue
上から順に、サービスの停止、OpenSSH サーバーの削除(サービスごと消えます)、ファイアウォールのルールの削除、鍵・設定ファイルが入ったフォルダの削除です。RestartNeeded : True と表示されたら、再起動してください。
消えたことを確認する
相手PC(管理者)Get-WindowsCapability -Online -Name OpenSSH.Server* | Select-Object Name, State Get-Service sshd -ErrorAction SilentlyContinue Get-NetFirewallRule -Name *OpenSSH* -ErrorAction SilentlyContinue Test-Path C:\ProgramData\ssh
結果が NotPresent → 何も表示されない → 何も表示されない → False の順になれば、後片付けは完了です。
手元PC側の片付け
手元PCには、相手PCの「指紋」(接続先が本物かを確かめるための記録)が残っています。同じIPアドレスに別のPCがつながったときに警告が出るので、消しておきます。
手元PCssh-keygen -R 192.168.0.50
手元PCの鍵(id_ed25519)は、自分の鍵なので残しておいて構いません。
もともと入っていた場合(手順0が Installed だったとき)
機能は消さずに、変えたところだけを元に戻します。
相手PC(管理者)Remove-Item C:\ProgramData\ssh\administrators_authorized_keys -Force Move-Item C:\ProgramData\ssh\sshd_config.bak C:\ProgramData\ssh\sshd_config -Force Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress Any Stop-Service sshd Set-Service -Name sshd -StartupType Manual
最後の行の Manual は、手順0で表示された StartType に合わせてください。
Windowsのイベントログに残る記録について。「サービスが追加・削除された」「SSHでログインした」といった記録は、Windowsのイベントログに残ります。これは消さないのが普通です(消すと、かえって何をしたか分からなくなります)。他人のPCで作業したときは、「調査のために一時的にSSHを入れて、最後に消しました」と持ち主に伝えておくと安心です。
まとめ
- Windowsには OpenSSH サーバーが標準で用意されているので、コマンド1行で入れて、1行で消せます
- ファイアウォールを
LocalSubnetに絞り、鍵で接続して、パスワードでのログインは止めておくと安心です - 管理者アカウントの鍵は
C:\ProgramData\ssh\administrators_authorized_keysに登録し、icaclsで権限を絞るのを忘れないでください - 後片付けは「機能・ファイアウォールのルール・
C:\ProgramData\ssh」の3つ。最後に確認コマンドで、消えたことを確かめます
参考
- https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse(Microsoft Learn:OpenSSH の概要とインストール)
- https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement(Microsoft Learn:OpenSSH のキーベースの認証)
- https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration(Microsoft Learn:OpenSSH サーバーの構成)