10秒でWindowsにSSHサーバーをインストール【PowerShell Only】Windows 10 Home / Windows 11

# TL;DR

管理者でPowerShellを開き( Win + x, a )、以下を実行してください。公開鍵は自分のに置き換えてもいいです。( ssh-ed25519で始まる文字列 )

```powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0; `
Set-Service -Name sshd -StartupType Automatic; `
Start-Service sshd; `
Add-Content -Path $env:ProgramData\ssh\administrators_authorized_keys -Value 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINJThW5ogPD1jSSkPjKKnhbity186S9e2HAfwQ1B3Nus'; `
icacls $env:ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant Administrators:F /grant SYSTEM:F /remove 'Authenticated Users'
```

`ssh -i private_key.txt username@192.168.11.7`とかでログインできます。`192.168.11.7`はPowerShellで`ipconfig`と入力して確認してください

[private_key.txt](https://gist.githubusercontent.com/GitHub30/e0d1a0d8269c02da189a57e6f5cc0021/raw/73b397942a792d2e9d3a004247dd83fde2d6f9b2/private_key.txt)

## ログインシェルの変更

管理者でPowerShellを開き( Win + x, a )、以下を実行してください。

PowerShellを使用

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
```

Git Bashを使用

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe" -PropertyType String -Force 
```

## 公開鍵の追加

管理者でPowerShellを開き( Win + x, a )、以下を実行してください。

```powershell
Add-Content -Path $env:ProgramData\ssh\administrators_authorized_keys -Value 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINJThW5ogPD1jSSkPjKKnhbity186S9e2HAfwQ1B3Nus'
```

## 外出先からアクセス

管理者でPowerShellを開き( Win + x, a )、以下を実行してください。`<token>`は、以下のサイトにログインして頂いてください

https://ngrok.com/download

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
choco install ngrok -y
ngrok config add-authtoken <token>
ngrok tcp 22
```

`ssh -i private_key.txt -p 12345 username@0.tcp.jp.ngrok.io`とかでログインできます。

https://chocolatey.org/install

### PC起動時にngrokを起動

` Win + r `を押し、` shell:startup `を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/4ace38dc-7e9c-9f81-4b8d-e9c9efb59131.png)

右クリックし、`新規作成` > `ショートカット`を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/28064cb2-fe91-dcbc-09fe-57fd333426ac.png)

`ngrok tcp 22`を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/abcde3f9-d0aa-a23d-879a-458f9778b92b.png)

完了を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3268f9cb-a013-72e0-091f-bd6df9078cd8.png)

ngrokの固定TCPアドレスは有料のため、外出先から接続先を確認するときは**ダッシュボード**かAPIをご利用ください

https://ngrok.com/docs/network-edge/domains-and-tcp-addresses/#tcp-addresses

ダッシュボード ← オススメ✨
https://dashboard.ngrok.com/

APIキーの作成
https://dashboard.ngrok.com/api

接続先確認
https://ngrok.com/docs/api/resources/endpoints/#example-request
```bash
curl \
  -X GET \
  -H "Authorization: Bearer {API_KEY}" \
  -H "Ngrok-Version: 2" \
  https://api.ngrok.com/endpoints
```

## Configの確認

```powershell
sshd -T -C user=$env:username
```
https://github.com/dev-sec/ansible-ssh-hardening/issues/188#issuecomment-459990037

## 解説
Add-WindowsCapabilityをするとファイアウォールルールが追加される
```powershell
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell#install-openssh-for-windows

StartupTypeがManual→Automatic(宇多田ヒカル)になっていること確認
```powershell
Get-Service -Name sshd | Select-Object -property Name,StartupType
Set-Service -Name sshd -StartupType Automatic
Get-Service -Name sshd | Select-Object -property Name,StartupType
```

Start-Serviceをすると`$env:ProgramData\ssh`フォルダが作成される。
```powershell
Start-Service sshd
```

公式ドキュメントにはないが、`Authenticated Users`を削除しないと動かない

```powershell
Add-Content -Path $env:ProgramData\ssh\administrators_authorized_keys -Value 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINJThW5ogPD1jSSkPjKKnhbity186S9e2HAfwQ1B3Nus'
icacls $env:ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant Administrators:F /grant SYSTEM:F /remove 'Authenticated Users'
```

https://superuser.com/a/1605117

https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement#administrative-user

## アンインストール

```bash
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0; `
Remove-Item $env:ProgramData\ssh -Recurse -Force
```

よいSSHライフをお過ごしください