練習 - ARM テンプレートでシークレットを管理する

完了

前の演習では、Linux 仮想マシンをプロビジョニングする基本的な Azure Resource Manager (ARM) テンプレートを実行しました。 ここでは、同様のプロセスに従います。

今回は、パスワードをパラメーターとして渡す代わりに、パスワードを Azure Key Vault に格納します。 確実に ARM テンプレートでパスワードにアクセスできるようにするには、サブスクリプション内のキー コンテナーのシークレットを参照するパラメーター ファイルを作成します。

Azure Key Vault をデプロイする

Note

サンドボックスには制限があるため、ここでは Azure portal から Azure Key Vault にキー コンテナーを作成します。 通常は、New-AzKeyVault コマンドレットを使用して、Azure PowerShell からキー コンテナーを作成します。

キー コンテナーを作成し、デプロイ時のアクセスを許可します。 そのためには次を行います。

  1. キー コンテナーの名前を保持する PowerShell 変数を作成します。

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. $KVNAME を実行してその値を出力します。

    $KVNAME
    

    出力は次のようになります (表示される値は異なります)。

    tailwind-secrets5978564
    

    次のステップで使いやすい場所に値をコピーします。

  3. サンドボックスをアクティブ化したときと同じアカウントを使用して、Azure portal にサインインします。

  4. Azure portal のメニューまたは [ホーム] ページから [リソースの作成] を選択します。

  5. 検索ボックスに「Key Vault」と入力します。

  6. 一覧から [Key Vault] を選び、[作成] を選択してキー コンテナーの構成を始めます。

  7. 作成ペインで、次の値を指定します。

    1. [リソース グループ]: リソース グループの名前
    2. [キー コンテナー名]: $KVNAME の値 (例: tailwind-secrets5978564)。
  8. [Review + create](レビュー + 作成) を選択します。

  9. [作成] を選択します これには 1 分ほどかかることがあります。 リソースが作成されたら、[リソースに移動] を選択します。

  10. [設定][アクセスの構成] を選択します。 [Azure Resource Manager (テンプレート デプロイ用)] オプションを有効にして、[適用] を選択します。

  11. PowerShell セッションから ConvertTo-SecureString コマンドレットを実行し、結果を secretSecureString 変数に代入します。

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. 次の Set-AzKeyVaultSecret コマンドを実行して、キー コンテナーにシークレットを作成します。 そのシークレットの名前は vmPassword で、値は insecurepassword123! となります。

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

パラメーター ファイルを作成する

ここでは、VM の名前、管理者のユーザー名、およびキー コンテナー内の VM パスワードへの参照を含むパラメーター ファイルを作成します。

コマンド ラインからテンプレートにパラメーターを渡すことができます。 パラメーター ファイルは、デプロイの間にパラメーターを ARM テンプレートに渡す別の方法であることを思い出してください。 パラメーター ファイルを使用して、テンプレートからキー コンテナーのシークレットにアクセスできます。

  1. 次の Get-AzKeyVault コマンドを実行して、キー コンテナーの ID を出力します。

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    次のような内容が出力されます。

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    次のステップのために出力を記録しておきます。

  2. Visual Studio Code で、azuredeploy.json が格納されているディレクトリに azuredeploy.parameters.json という名前のファイルを作成します。

  3. 次の内容を azuredeploy.parameters.json に追加します。

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. id (空の文字列) の値を、前のステップでコピーした値に置き換えます。 そのうえでファイルを保存します。

Linux VM のデプロイ

ここでは、前の演習でデプロイしたのと同じ ARM テンプレートをデプロイします。 今回は、キー コンテナー内の VM パスワードを参照するパラメーター ファイルを指定します。

  1. 次のコマンド New-AzResourceGroupDeployment を実行します。

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    前の演習では、キーと値の各ペアをコマンド ラインから直接指定しました。 ここでは、"./azuredeploy.parameters.json" を指定してパラメーター ファイルを提供します。

    dnsLabelPrefix には、vm2- の後に乱数を付けたものが設定されます。 これは、DNS 名が前の演習で使用した DNS 名と異なるものになるようにするために必要です。

デプロイを検証する

VM がプロビジョニングされていて、SSH 経由で接続できることを確認します。 次の手順に従います。

  1. Invoke-Expression コマンドを実行して、SSH 経由で VM に接続します。

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    メッセージが表示されたら、「yes」と入力して接続を続けます。 次に、管理者パスワード insecurepassword123! を入力します。

    重要

    実際には、パスワードは安全に保持しておきます。 一般にパスワードを使用するより安全な公開キー認証を使用することもできます。

  2. VM への SSH 接続から、hostname を実行して VM のホスト名を出力します。

    hostname
    

    VM の内部ホスト名 vm1 が表示されます。

    vm2
    
  3. exit を実行して、SSH セッションを終了します。

    exit
    

お疲れさまでした。 Key Vault からシークレット情報を読み取るパラメーター ファイルを使用するように、デプロイを拡張しました。

Azure Key Vault をデプロイする

Azure Key Vault で、キー コンテナーを作成し、セキュリティで保護されたシークレットとして VM パスワードを追加します。 そのためには次を行います。

  1. キー コンテナーの名前を保持する Bash 変数を作成します。

    KVNAME=tailwind-secrets$RANDOM
    

    キー コンテナーの名前は一意である必要があります。 $RANDOM の部分により、キー コンテナー名がランダムな一連の数字で終了することが保証されます。

  2. 次の az keyvault create コマンドを実行して、キー コンテナーを作成します。

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    --enabled-for-template-deployment 引数により、Azure Resource Manager (ARM) テンプレートでキー コンテナーからシークレットを取得することが許可されます。

  3. 次の az keyvault secret set コマンドを実行して、キー コンテナーにシークレットを作成します。 そのシークレットの名前は vmPassword で、値は insecurepassword123! となります。

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

パラメーター ファイルを作成する

ここでは、VM の名前、管理者のユーザー名、およびキー コンテナー内の VM パスワードへの参照を含むパラメーター ファイルを作成します。

コマンド ラインからテンプレートにパラメーターを渡すことができます。 パラメーター ファイルは、デプロイの間にパラメーターを ARM テンプレートに渡す別の方法であることを思い出してください。 パラメーター ファイルを使用して、テンプレートからキー コンテナーのシークレットにアクセスできます。

  1. 次の az keyvault show コマンドを実行して、キー コンテナーの ID を出力します。

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    次のような内容が出力されます。

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    次のステップのために出力を記録しておきます。

  2. Visual Studio Code で、azuredeploy.json が格納されているディレクトリに azuredeploy.parameters.json という名前のファイルを作成します。

  3. 次の内容を azuredeploy.parameters.json に追加します。

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. id (空の文字列) の値を、前のステップでコピーした値に置き換えます。 そのうえでファイルを保存します。

Linux VM のデプロイ

ここでは、前の演習でデプロイしたのと同じ ARM テンプレートをデプロイします。 今回は、キー コンテナー内の VM パスワードを参照するパラメーター ファイルを指定します。

次の az deployment group create コマンドを実行して、テンプレートをデプロイします。

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

前の演習では、--parameters 引数でキーと値の各ペアを提供しました。 ここでは、@azuredeploy.parameters.json を指定してパラメーター ファイルを提供します。

dnsLabelPrefix には、vm2- の後に乱数を付けたものが設定されます。 これは、DNS 名が前の演習で使用した DNS 名と異なるものになるようにするために必要です。

デプロイを検証する

前の演習で行ったように、VM がプロビジョニングされていて、SSH 経由で接続できることを確認します。 簡潔にするため、今度は途中の手順を一部省略します。

  1. 次のように実行し、SSH 経由で VM に接続します。

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    メッセージが表示されたら、「yes」と入力して接続を続けます。 次に、管理者パスワード insecurepassword123! を入力します。

  2. VM への SSH 接続から、hostname を実行して VM のホスト名を出力します。

    hostname
    

    VM の内部ホスト名 vm2 が表示されます。

    vm2
    
  3. exit を実行して、SSH セッションを終了します。

    exit
    

お疲れさまでした。 Key Vault からシークレット情報を読み取るパラメーター ファイルを使用するように、デプロイを拡張しました。