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オプションがない。
デプロイ時に設定する方法についてはこちらが参考になるだろう。
では、デプロイ済みのものに対してはどうやって設定するのか?
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だけで完結させれない気がする。
ちょっとここについてはまた継続調査ということで。
ディスカッション
コメント一覧
まだ、コメントがありません