SSH キーで接続する Azure Linux VM を ３ パターン試してみた

## 背景と目的

今まではパスワード認証かつ接続元の IP アドレスを絞って SSH 接続する方法で Azure Linux VM を検証に使ってきましたが、毎回ランダムなパスワードを生成してコピペするのが面倒になってきました。そこで毎回コピペせずに都度違う SSH キーを使う方法を 3 パターン試してみました。

1. SSH キーペアをローカルで作成して使う方法
1. SSH キーペアをローカルで作って SSH 公開キーを Azure に登録して使う方法
1. SSH キーペアを Azure で作成して SSH 秘密キーをローカルに保存して使う方法

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.1
BuildVersion:   21C52

$ az version
{
  "azure-cli": "2.32.0",
  "azure-cli-core": "2.32.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## SSH キーペアをローカルで作成して使う方法

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/mac-create-ssh-keys>

上記サイトを参考に SSH キーペアを作成して SSH 接続するまでを試します。

```bash:bash
# VM を作成するリージョンを設定します
region=japaneast

# リソース名のプレフィックスを設定します
prefix=mnrsshvm1

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# SSH キーペアをファイル名を指定して作成します
ssh-keygen -m PEM -t rsa -b 4096 \
  -f ${prefix}

# 作成した SSH 公開キーを指定して VM を作成します
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image UbuntuLTS \
  --admin-username azureuser \
  --ssh-key-value ${prefix}.pub \
  --size Standard_B1ls \
  --nsg-rule NONE \
  --storage-sku Standard_LRS

# NSG に自分の IP アドレスから SSH 接続出来るようにします
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-SSH \
  --nsg-name ${prefix}-vmNSG \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

# SSH 秘密キーを使用して SSH 接続します
ssh -i ${prefix} azureuser@$(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-detail \
  --query publicIps \
  --output tsv)

# リソースグループを削除します
az group delete \
  --name ${prefix}-rg

# 作成した SSH キーペアを削除します
rm -f ${prefix}*
```

## SSH キーペアをローカルで作って SSH 公開キーを Azure に登録して使う方法

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/ssh-keys-azure-cli#upload-an-ssh-key>

上記サイトを参考に SSH 公開キーを Azure にアップロードする手順が加わります。

```bash:bash
# VM を作成するリージョンを設定します
region=japaneast

# リソース名のプレフィックスを設定します
prefix=mnrsshvm2

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# SSH キーペアをファイル名を指定して作成します
ssh-keygen -m PEM -t rsa -b 4096 \
  -f ${prefix}

# SSH 公開キーを Azure にアップロードします
az sshkey create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-sshkey \
  --public-key @${prefix}.pub
  
# アップロードした SSH 公開キーを指定して VM を作成します
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image UbuntuLTS \
  --admin-username azureuser \
  --ssh-key-name ${prefix}-sshkey \
  --size Standard_B1ls \
  --nsg-rule NONE \
  --storage-sku Standard_LRS

# NSG に自分の IP アドレスから SSH 接続出来るようにします
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-SSH \
  --nsg-name ${prefix}-vmNSG \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

# SSH 秘密キーを使用して SSH 接続します
ssh -i ${prefix} azureuser@$(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-detail \
  --query publicIps \
  --output tsv)

# リソースグループを削除します
az group delete \
  --name ${prefix}-rg

# 作成した SSH キーペアを削除します
rm -f ${prefix}*
```

## SSH キーペアを Azure で作成して SSH 秘密キーをローカルに保存して使う方法

<https://docs.microsoft.com/ja-jp/azure/virtual-machines/ssh-keys-azure-cli#generate-new-keys>

上記サイトを参考に SSH キーペアを Azure で作成する手順が加わります。

```bash:bash
# VM を作成するリージョンを設定します
region=japaneast

# リソース名のプレフィックスを設定します
prefix=mnrsshvm3

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# SSH キーペアを Azure で作成します
az sshkey create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-sshkey

# ローカルに保存されたファイル名が以下の例のように表示されます
Private key is saved to "/home/user/.ssh/7777777777_9999999".
Public key is saved to "/home/user/.ssh/7777777777_9999999.pub".

# ローカルに保存された秘密キーのパーミッションを変更します
chmod 600 /home/user/.ssh/7777777777_9999999

# アップロードした SSH 公開キーを指定して VM を作成します
az vm create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --os-disk-name ${prefix}-vmOSDisk \
  --image UbuntuLTS \
  --admin-username azureuser \
  --ssh-key-name ${prefix}-sshkey \
  --size Standard_B1ls \
  --nsg-rule NONE \
  --storage-sku Standard_LRS

# NSG に自分の IP アドレスから SSH 接続出来るようにします
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-SSH \
  --nsg-name ${prefix}-vmNSG \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

# SSH 秘密キーを使用して SSH 接続します
ssh -i ~/.ssh/7777777777_9999999 azureuser@$(az vm show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vm \
  --show-detail \
  --query publicIps \
  --output tsv)

# リソースグループを削除します
az group delete \
  --name ${prefix}-rg

# 作成した SSH キーペアを削除します
rm -f ~/.ssh/7777777777_9999999*
```

## 参考

<https://docs.microsoft.com/ja-jp/cli/azure/vm?view=azure-cli-latest#az_vm_create>