OpenSSH for Windows の使用方法

## 本記事について

SSHの公開鍵認証において、
Windowsのオプション機能として用意されている `OpenSSH for Windows` から `ssh-agent` を利用してSSH接続する手順です。

変につまづいたので残しておきます。

環境

* Windows10 Pro 1803

## OpenSSH インストール

```powershell:powershell(管理者)
> Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
```

## `ssh-agent` サービス設定

1. `services.msc` を管理者権限で起動
1. `サービス（ローカル）` の中から `OpenSSH Authentication Agent` を探す
1. 右クリックメニューの `プロパティ` を開く
1. `スタートアップの種類` を `自動` にし、サービスを開始

以上でシステム起動時に `ssh-agent` が自動起動される。

## 秘密鍵

`C:\Users\<USER_NAME>\.ssh` ディレクトリ以下に作成・管理する。

### `.ssh` ディレクトリ

存在しなければ作成。

```powershell:powershell
mkdir $env:userprofile\.ssh
```

次にアクセス制御リスト（ACL）の設定を行い、アクセスできるのは所有者のみにする。

1. `.ssh` ディレクトリを右クリック -> `プロパティ`

1. `セキュリティ` タブの `詳細設定`
  ![security-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/e7ba91e6-905a-b2cd-ca48-8130e0a9fc5e.png)

1. `継承の無効化`
  ![security-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/134e708e-1a55-6e36-f09d-a69e61d7fa0e.png)

1. `継承されたアクセス許可をこのオブジェクトの明示的なアクセス許可に変換します`
  ![12-33-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/996dbe37-1acc-0a98-2894-205226a4a500.png)


1. 所有者以外のユーザー（SYSTEMやAdministrators）を `削除`
  ![security-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/11e5b860-23e6-37c3-7829-86b3880433bb.png)

1. `OK`

### 秘密鍵の作成

`C:\Users\<USER_NAME>\.ssh` ディレクトリ以下に作成する。

```powershell:ed25519鍵の作成例
ssh-keygen -t ed25519 -C "$env:username" -f $env:userprofile\.ssh\id_ed25519
```

デフォルトで `C:\Users\<USER_NAME>\.ssh` のACL設定を継承しているため、`.ssh` ディレクトリの設定ができていれば後述のパーミッションエラーは発生しないはず。

## `C:\Users\<USER_NAME>\.ssh\config` ファイルの作成

SSH接続の設定を記述することで、`ssh` コマンドを打つときに楽になる。
SSHポート変更や公開鍵認証を使う場合はこの設定ファイルを記述すること推奨。

この `config` ファイル作成については

* [~/.ssh/configについて - Qiita][ssh_config-1]
* [`Include`キーワードで`ssh_config`を分割できるようになった件 - Qiita][ssh_config-2]

が参考になります（詳細は割愛）。

## `ssh-agent` に秘密鍵とパスフレーズのペアを登録

`ssh-agent` に秘密鍵とパスフレーズのペアを登録し、SSH接続時にパスフレーズを入力せずに接続できるようにする。

`ssh-add <秘密鍵のパス>` コマンドを実行し、鍵のパスフレーズを入力。

```powershell:
> ssh-add $env:userprofile\.ssh\id_ed25519
Enter passphrase for $env:userprofile\.ssh\id_ed25519:
Identity added: $env:userprofile\.ssh\id_ed25519 (USER_NAME)
```

登録リストの表示。

```powershell
> ssh-add -l
256 SHA256:hogehoge... USER_NAME (ED25519)
```

以上でパスフレーズ入力なしでリモートにSSH接続できるようになっているはず。

```powershell
> ssh REMOTE_HOST
[hoge@server ~]$
```

失敗する場合は `config` ファイルを見直したり、下記のエラーが発生していないか確認してください。

## 遭遇したエラー

### `WARNING: UNPROTECTED PRIVATE KEY FILE!`

`ssh-add` コマンドを打つときに発生したパーミッションエラー。

```powershell
> ssh-add $env:userprofile\.ssh\id_ed25519
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for '$env:userprofile\\.ssh\\id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
```

ACL設定ができていないことが原因。
[上記](#ssh-ディレクトリ) を参考に、秘密鍵のあるディレクトリにおいて **所有者のみがアクセス許可を持つ** ように設定する。

### `ssh*` コマンドが認識されない

OpenSSHのインストールは成功したのにコマンドとして認識してくれない症状。
`powershell` の再起動はもちろん、PC再起動してもダメ。

環境変数 `PATH` を確認してみると、なぜか `SystemRoot` がうまく展開されていない。

この解決策として、[PowerShellからのPATH設定がなんかうまくいかない話。][path] を参考にGUIからパスを切り取り＆貼り付けしたら `PATH` が通るようになった。

そういうとこやぞ、Windows 😡😡😡

## 参考

* [Windows の OpenSSH のインストール](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse)
* [Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた - Qiita](https://qiita.com/q1701/items/3cdc2d7ef7a3539f351d)

* [~/.ssh/configについて - Qiita][ssh_config-1]
* [`Include`キーワードで`ssh_config`を分割できるようになった件 - Qiita][ssh_config-2]

* [PowerShellからのPATH設定がなんかうまくいかない話。 - Qiita][path]

[ssh_config-1]:https://qiita.com/passol78/items/2ad123e39efeb1a5286b
[ssh_config-2]:https://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0
[path]:https://qiita.com/Chiffon-Pudding/items/e98d2466a3f1a8b02c16