CentOS7.2→Windows server 2012 R2にSSHで接続する

タイトルの通りです。今回はLinuxからWindowsに向けて公開鍵で認証してSSH接続を実施します。

**実施目的**
LinuxからWindowに鍵認証でログインする
（パスワードを入力しない）

OSが混在している環境でLinuxからWindows上のbatファイルを実行したい場合などに利用できるかと存じます。ただ、sshは公式でも明言されている通り、正式リリースではなくテストリリースであるとのことです。

**対象OS**
・Windows Server 2012 R2(以下Windows）
・CentOS 7.2(以下Linux)

**手順**
Windows版のOpenSSHを利用します。
本記事時点での最新バージョンは2016/11頭に公開された「v0.0.3.0」です。

公式からファイルをDL
https://github.com/PowerShell/Win32-OpenSSH/releases
→2012 R2なので「OpenSSH-Win64.zip」を利用する

手順は公式のWIKIに沿って進める
https://github.com/PowerShell/Win32-OpenSSH/wiki/Install-Win32-OpenSSH

まずはファイルをDLして、配置する
（配置するパスは、公式に合わせないとうまく動かない事象があるようです)
![path.png](https://qiita-image-store.s3.amazonaws.com/0/110457/7334096e-c5eb-4138-65df-9408561ea001.png)


**管理者権限でpowershellを起動して、インストールコマンド実行**

```powershell:powershell
cd 'C:\Program Files\OpenSSH'
powershell -executionpolicy bypass -file install-sshd.ps1
```
![sc.png](https://qiita-image-store.s3.amazonaws.com/0/110457/88f43e7f-8cbc-a315-1160-f33f3ccdf2b3.png)

**鍵作成**

```powershell:powershell
.\ssh-keygen.exe -A 
```

![mk.png](https://qiita-image-store.s3.amazonaws.com/0/110457/d183dbdb-4051-7ea8-b388-ffeba18b436b.png)

C:\\Program Files\OpenSSH以下にファイルが作成されました。
公式の「6.Secure SSH host keys (optional) 」は今回省略します。

**FWのポートを開ける**

```powershell:powershell
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH 
```

![fw.pnb.png](https://qiita-image-store.s3.amazonaws.com/0/110457/ab8b572b-849d-b20e-092e-82c46a930f5d.png)

**鍵認証関連機能(?)のインストール**

```powershell:powershell
powershell -executionpolicy bypass -file install-sshlsa.ps1
```

![ls.png](https://qiita-image-store.s3.amazonaws.com/0/110457/9a669135-4072-d622-2d45-a35ad395fe1d.png)

OSの再起動実施

**再起動時にsshが上がるようサービスの設定追加**

```powershell:powershell
Set-Service sshd -StartupType Automatic 
Set-Service ssh-agent -StartupType Automatic 
```
![srv.png](https://qiita-image-store.s3.amazonaws.com/0/110457/ae6c488a-d910-70dc-7f72-95d9b55a7a78.png)

手順では、SSH Server Onlyとなっていて、実施しておくべきと投稿にもあったので実施しておく。powershellのコマンドはきちんと勉強しておきたい。。

```powershell:powershell
netsh advfirewall firewall add rule name='SSH Port' dir=in action=allow protocol=TCP localport=22
```

では、Windows側のsshd,ssh-agentを開始してlinux側から接続してみます。

![srvon.png](https://qiita-image-store.s3.amazonaws.com/0/110457/d427da10-1a26-31a5-c511-89c19b292d96.png)

**Linux側**

```bash:sh
$ ssh Administrator@hostname
Administrator@WIN-M61C3KETVII C:\Users\Administrator>
Administrator@WIN-M61C3KETVII C:\Users\Administrator> mkdir .ssh
```

接続できました。ついでに鍵を格納するフォルダを作成しておきます。では本題の鍵認証に進みます。まずは、Linux側で鍵の作成します。
rootユーザで作成して、Windowsに転送します。

```bash:sh
$ cd
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

$ ls -l .ssh
id_rsa
id_rsa.pub

$ scp -p .ssh/id_rsa.pub Administrator@hostname:authorized_keys
```
Windowsのパス指定に自信がなかったので、ホームフォルダに配置しました。配置したauthorized_keysを同階層の.sshフォルダ以下に移動しておきます。

また、Windows側の設定ファイルを以下のように編集


```config:sshd_config
#PubkeyAuthentication yes
PubkeyAuthentication yes

#PasswordAuthentication yes
PasswordAuthentication no
```

sshd,ssh-agentを再起動してLinux側から鍵を指定して認証してみたいと思います。また、簡易バッチファイルを作成してsshで接続するユーザのホームフォルダに配置します。

```bat:test.bat
echo "ssh echo" > test.txt
```

```bash:sh
ssh -i .ssh/id_rsa Administrator@hostname test.bat
Administrator@WIN-M61C3KETVII C:\Users\Administrator>
```

C:¥Users¥Administrator¥のホームフォルダに想定通りtest.txtが出来ました。ここに至るまでに、対話式では接続できるが鍵認証を試行すると権限のエラーになるなど試行錯誤を繰り返していました。最終的には公式のWIKIに書いている手順に沿って進めると、問題なく利用できました。まず公式を見るべきでしたね。