Microsoft Azureで激安VMインスタンスを立てて遊ぶ （SSHに公開鍵認証を設定するまで）


[前回の記事](https://qiita.com/203mmH/items/9523a07f05b166dcd8a4)では、
無事にMicrosoft AzureにVMインスタンスを作成して、RDP経由でログインすることまで成功しました。
次はもっとサクサク環境を目指して、SSH接続を設定していきましょう。
#パスワード認証での接続
まずは、パスワード認証での接続をテストしておきましょう。

##ネットワークの設定
標準だと、外部からの接続はRDPしか通らない設定になっているので、
Azureポータルから「設定>ネットワーク」を開き、SSH(TCP:ポート22)が通るようにしておきます。
![inbound-rule.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/6947d211-4626-df05-dd7f-a6763353b2a1.png)

##VMインスタンスへのSSHサーバのインストール
Windows 10 Proでは、インストールした直後の状態ではSSHサーバがインストールされていないようです。
![SSHDなし.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/7aa30636-0f04-6fe0-b8a1-462f1efbc4c4.png)

ということで、「Setting」＞「Apps & Features」＞「Manage optional features」＞「Add a feature」から
「OpenSSH Server」を選んで、インストールします。
(すでにWindows 10の「設定」画面が異常に重いです……😣)
![ManageOptionalFeatures.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/1a26eb6c-dd81-6bda-8ca0-982fcc85e6a1.png)![Add-OpenSSHServer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/de532b54-f3ed-ec95-2972-2bcad722ed7c.png)

インストールしただけだと、下記の通り、sshdサービスは停止したままのようですので、
![SSHD.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/f8be02c7-3724-b8bf-8cb0-2ef6058ba578.png)

```powershell
Set-Service -Name sshd -StartupType Automatic
Start-Service sshd
```
と打って、sshdサービスを起動し＆次回OS起動時にも自動でサービスが起動するようにしておきます。
これで、ローカルのPCから、Azure上のVMインスタンスにSSHがつながるはずです。試してみましょう。
##接続テスト
前回の記事で設定したDNS名で接続を試行すると、パスワードを求められ……
![SSH接続テスト-pw.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/414dbc1c-e8cc-67c6-ee95-2b63ffb86463.png)

無事に繋がりました。
![SSH接続テスト-成功.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/e28b6c0b-d296-ea8e-3007-8302126b2c80.png)

ただ、このままでは外部からの攻撃にあまりに脆弱なので、早いところ公開鍵認証を設定したいところです。
#公開鍵認証での接続
SSHサーバへの秘密鍵認証での接続については基本的には、検索して出てくる情報どおりに進めれば大丈夫です。
先人の皆様の記事([SSH公開鍵認証で接続するまで](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5) 、[SSHの公開鍵認証設定をする](https://qiita.com/jinnai73/items/f1822f2e4d567847e215))
を参考にしつつ、サクサク進めていきます。
##公開鍵認証の有効化とパスワード認証の無効化
Windows 10環境でのOpenSSHの設定についてはやや情報が少ないのですが、設定ファイルは
C:\ProgramData\sshに入っているsshd_configをいじってやれば良いようです。
Windows 10にはデフォルトではCUIで動くテキストエディタがインストールされていないので、
RDP経由でメモ帳からいじります。

```
#PubkeyAuthentication yes
```

のコメントアウトを解除してやり、

```
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
```

とあるので、コメントアウトを解除して、"PasswordAuthentication no"と書き換えて、
Powershellから

```powershell

Restart-Service sshd
```

しておきます。これで、公開鍵認証でしか繋がらない設定にできたはずです。
SSHでしか繋がらない環境で設定ファイルをいじると、一歩間違うと二度とつながらなくなるのが怖いですが、
Windows 10環境に繋ぐ場合、RDPでの接続は常に生きているので、非常に安心感がありますね。

##公開鍵のサーバへの転送
公開鍵は、ローカルで作成して、Ctrl+Cでコピーし、RDPで接続した向こうにCtrl+Vで貼り付ければ転送できます。
いちいちscpなどを使わなくても、RDP経由でファイル転送できるので便利です。

あとは公開鍵をsshdの設定ファイルが置かれている
C:\Users\[ユーザー名]\\.sshd\authorized_keys
にリネームしてsshdを再起動すれば秘密鍵認証でつながるはずです。

##Windows環境+OpenSSHのハマリポイント
ところが、試してみると
>Permission denied (publickey,keyboard-interactive)

と表示され、接続に失敗します。

SSHのオプションに-vvvを指定して、詳細ログを表示させてみても、あまり要領を得ません。
>debug2: we did not send a packet, disable method

などといわれてしまいますが、"did not send"じゃない！送ってくれよ！という感じです😠

調べると、authrized_keysファイルのパーミッションが問題になる、との情報が多く出てきて2時間近くハマっていたのですが、
実際の原因は、[Windows Server 2019 EC2インスタンスでSSHサーバーを有効にする](https://dev.classmethod.jp/articles/configure-windows-server-2019-sshd/)に記載がありました。
Windows版のOpenSSHでは、
>ここでWindowsの独自仕様としてsshd_configに以下の記述がされており、Administratorsグループの公開鍵は%programdata%\ssh\administrators_authorized_keysに設定する必要があります。

とのことで、今回は見事にこの条件に該当し、せっかく配置したauthorized_keysを読み込んでくれなかったようです。
ということで、

>C:\Users\[ユーザー名]\\.sshd\authorized_keys

を

>%programdata%\ssh\administrators_authorized_keys

に移動させてやれば、無事に公開鍵認証でログインできました。
#今後の課題
さて、これで一応VMインスタンスにSSH経由で接続できるようにはなりましたが、
いかんせんスペックが非常に低く、特にメモリが厳しいです。
デプロイしたままの環境でタスクマネージャーを開いてみると……
なんと、OSを起動しただけでメモリ使用率92%!
![memory_usage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560607/ae8485a5-72df-f749-5f36-656f6f281fd4.png)

次は、Windows 98 SE時代を思い出すシビアなメモリ状況を改善していきたいと思います。