VMへの接続をBastionのSSH 秘密キーの認証でやっていく

Bastionについての調査の過程でこちらをやっていく。

今回実験に使ったソースはこちら
ブランチを分けて色々な構成を試していってるのでブランチがmainでないです。
Terraformでリソース作成して、azコマンドでsshの鍵を登録しています。

https://github.com/xiaotiantakumi/azure-terraform-templates/tree/bastion_ssh_keyvault

さて、VMへの接続で一番セキュアなやり方としては、Azure Key VaultにSSH 秘密キーを格納しておくことだろう。

Terraformで基本的に環境構築していくのですが、まずはportalから実験的に色々やっていく。
この時、すでにデプロイしているVMにSSH秘密キーをどうやって設定していくのかというのかわからなかったので調査した。

そもそも、すでにデプロイ済みのVMにSSH秘密キーを設定できるのだろうか?

https://learn.microsoft.com/ja-jp/cli/azure/vm?view=azure-cli-latest#az-vm-update

上記を見る限り、az vm updateではaz vm createであった–ssh-key-valuesオプションがない。

デプロイ時に設定する方法についてはこちらが参考になるだろう。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/mac-create-ssh-keys#provide-an-ssh-public-key-when-deploying-a-vm

では、デプロイ済みのものに対してはどうやって設定するのか?

az vm user updateコマンドを使用してVMAccess拡張を呼び出し、SSHキーを更新するというのが流れのようです。ということで、こちらをやっていきます。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/extensions/vmaccess#update-ssh-key

ssh-keygenで鍵を作る

何はともあれ、接続のために鍵が必要になる。
鍵の作り方は以下で書いてます。

ssh-keygen -t rsa -b 4096 -C "comment" -f ~/.ssh/vm-xiao-dev-001_key -N ""

このコマンドで鍵を作成しました。

公開鍵をvmにアップロードする

こちらを参考にやってみました。

az vm user update \
  --resource-group RG-XIAO-EXAMPLE \
  --name vm-xiao-dev-001 \
  --username xiao_test \
  --ssh-key-value ~/.ssh/vm-xiao-dev-001_key.pub

こんな感じでうまく登録されたようだ。

念の為ディレクトリはこんな感じ

認証の種類でローカルファイルからのSSH秘密キーで接続確認

VMに公開鍵が登録されたので接続確認していきます。
Bastionの認証の種類でローカルファイルからのSSH秘密キーを選択します。
ローカルファイルは、さっき作ったキーになります。
秘密鍵の方を選択します。pubが公開鍵ですね。

無事に接続できることを確認しました。

Keyvaultに秘密鍵を入れる

Github ActionsとかAzure Pipelineで使えるようにシェルスクリプトにしておきます。
キーコンテナーの作成とキーボルトに値を設定するには以下のようにします。

#!/bin/bash

rgName="RG-XIAO-EXAMPLE"
vmName="vm-xiao-dev-001"
kvname="kv-xiao"

ssh-keygen -t rsa -b 4096 -C "az vm ssh key" -f ~/.ssh/vm-xiao-dev-001_key -N ""

# 作成した公開鍵を作成したVMに登録する
az vm user update \
  --resource-group $rgName \
  --name $vmName \
  --username xiao_test \
  --ssh-key-value ~/.ssh/vm-xiao-dev-001_key.pub

# キーボールトが存在するかどうかを確認し、存在しない場合は作成する
kvlist=$(az keyvault list --query "[?name=='$kvname']" | jq '. | length')
if [ "${kvlist}" -eq 0 ]; then
  echo "Key Vault $kvname does not exist. Creating..."
  az keyvault create -n $kvname -g $rgName
else
  echo "Key Vault $kvname already exists."
fi

# キーボールトにシークレットを設定する
clientSecretVar="sc-xiao-vm-ssh-key"
az keyvault secret set --vault-name $kvname --name "$clientSecretVar" --file "~/.ssh/vm-xiao-dev-001_key"

これでキーボルトが作成されました。

以下のような設定で接続できることが確認できました。

Terraformで一括で作成できるかも?

もしかしたらazコマンドを使わなくてもいけるかもしれないと思いました。

terraformでやっていく場合はこちらが参考になるはず

https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/quick-create-terraform

こちらの方法でsshキーを作成した場合、秘密鍵は別途ダウンロードしないといけないような気がする。なので、terraformだけで完結させれない気がする。

ちょっとここについてはまた継続調査ということで。

Azure

Posted by takumioda