SSHで接続する方法（パスフレーズの入力省略、Azureへのテスト接続）

# 概要
この記事はSSH接続に関して、公開鍵の作成や秘密鍵の作成、Azureの仮想マシン（Linux）へのテスト接続などを記事にしています。
特に、公開鍵認証やパスフレーズの入力の省略など私自身知らなかった部分や、実装で困った部分を重点的に解説していきます。

# 目次
1. 公開鍵、秘密鍵の作成
2. Azureでテスト用環境の構築
3. テスト接続
4. パスフレーズの入力の省略

# 1. 公開鍵、秘密鍵の作成
今回は以下の仕様で公開鍵、秘密鍵を作成します。
- 形式：Open SSH
- 暗号化アルゴリズム：RSA暗号
- 暗号化強度（鍵長）：4096ビット
- パスフレーズの有無：有

鍵の作成では、以下のコマンドをPowerShellやコマンドプロンプトで実行します。
```powershell:create_ssh_keys.ps1
ssh-keygen -t rsa -b 4096
```
このコードを実行すると、パスフレーズの入力を求められるため、必要に応じてパスフレーズを入力します。
パスフレーズは空でも問題ありませんが、秘密鍵が漏洩した場合を考慮して、パスフレーズを設定しておくことをお勧めします。

パスフレーズを入力するとC:\Users\ユーザー名\\.ssh フォルダ配下に以下２つのファイルが作成されます。
- id_rsa（秘密鍵）
- id_rsa.pub（公開鍵）

**※注意**
もし、既に秘密鍵が存在する場合は、コード実行時に上書き保存するか選択できますが、上書きする前にバックアップを取得しておくことをお忘れなく。

参考：[ssh-keygen使い方まとめ(自分用)](https://qiita.com/notkzk/items/919dc7123924c87d9d3f)

# 2. Azureでテスト用環境の構築
### 手順
接続テスト用に以下の環境を構築します。
- OSの種類：Linux
- イメージ：Ubuntu Server 20.04 LTS - x64 Gen2
- サイズ：Standard_B2s
- ユーザー名：azureuser

作成方法は以下の通りです。
1. AzureのPortalからリソースの作成で仮想マシンを作成する
2. 基本セクションでサブスクリプションやリソースグループなどを入力する
原則デフォルトの値で問題ないですが、以下の項目については変更する
   - SSH公開キーのソース：既存の公開キーを使用
   - SSH公開キー：[1. 公開鍵、秘密鍵の作成](#1-公開鍵秘密鍵の作成)で作成した、公開鍵をメモ帳などで開き、その値を入力する（改行しないように注意）
   <img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/61be3256-e709-56f7-bfd5-d6bdf8669f28.png">

   - パブリック受信ポート：選択したポートを許可する
   - 受信ポートを選択：SSH(22)
   <img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/68535953-aa75-3a9f-069d-ab2fe83f987d.png">
3. 確認および作成セクションから作成ボタンをクリックする

### 補足
以下のようにSSH公開キーのソースを"新しいキーの組の生成"にすると、VM作成時に新しく鍵が作成されます。
ただし、OpenSSH形式ではなくPem形式となりますので、システムの要件を確認し自分に必要な鍵を生成、登録してください。
<img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/cff04b53-163b-5db5-27bb-a112ce2d0bcf.png">

# 3. テスト接続
さて、ここまで来たら一度接続できるかテストしてみます。
ローカルPCからAzure上のVMに対して、公開鍵認証で接続をしてみます。

### 手順
1. AzureのPortalから2で作成したVMのリソースページを開きます
2. 設定 > "接続"のセクションを開きます
3. 接続方法に"ネイティブSSH"を選択し、接続方法の詳細を表示させます
   <img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/3a7b2752-46f2-03c5-8969-7f5c5476d389.png">
4. ③SSHコマンドのコピーと実行で秘密鍵のパスを指定し、コマンドをコピーします
   <img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/847d535f-8bdb-18f9-e8c5-4d4d6a3acd8f.png">
5. PowerShellやコマンドプロンプトから、5のコマンドを実行します
6. パスフレーズを設定している場合は、パスフレーズを入力します

### 補足
Azureに登録している鍵を入れ替えたい場合などは、設定>"接続"ページから"その他のオプション"を選択し、"パスワードまたはキーのリセット"から、ユーザー名を変更したり、カギを追加したり変更したりできます。
<img width = 30% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/e052ece0-327a-56b8-ec32-cbb7a67e4da9.png">
<img width = 50% src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1612369/d7646e6f-b52f-5089-290a-47ef6987f12e.png">

# 4. パスフレーズの入力の省略
パスフレーズの設定をしている場合、接続する際にパスフレーズを毎回入力する必要があり、システムなどで制御している場合（例：日時バッチでSFTPでファイル送付するなど）に邪魔になってきます。

OpenSSH Authentication Agentでは秘密鍵とパスフレーズのペアを登録することで、パスフレーズの入力を省くことが出来ます。
今回はパスフレーズの入力を省略する部分を設定していきます。

参考：[【Windows】OpenSSH Authentication Agentを使用する](https://tech.cmd08.com/windows-ssh-client)

### 手順
1. OpenSSH Authentication Agentを起動させる
   1. Windowsのサービスの画面を開く（ファイル名を指定して実行（ファイル名：services.msc））
   2. OpenSSH Authentication Agentを右クリックしプロパティを開く
   3. スタートアップの種類を"自動"に変更する
   4. サービスの状態が"停止"の場合は、開始する
2. PowerShellなどで以下のコードを実行する（秘密鍵へのパスが異なる場合は適宜変更してください）
   ```powershell
   ssh-add "C:\Users\ユーザー名\.ssh\id_rsa"
   ```
3. パスフレーズの入力を求められるためパスフレーズを入力する

### 補足
OpenSSHのバージョンによっては以下のエラーが出ます。
こちらはOpenSSHのバージョンが古い場合に出るみたいです。
```
warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
azureuser@IPアドレス: Permission denied (publickey)
```

OpenSSHのバージョンは以下のコードで確認できます。
OpenSSHのバージョンが最新であるか、カギを作成した端末のバージョンとの差異があるかなど確認をして対処してください。
```powershell
ssh -V
```