🎼

[Azure] 101-vm-sshkey ARM テンプレート読み解き

2020/12/27に公開

はじめに

Azure QuickStart Templates を読み込んで勉強しよう!
ということで、アウトプットもしてみます。第4弾です。

今回の読み解き対象

Deploy a Virtual Machine with SSH Keys

テンプレートの概要

こちらのテンプレートをデプロイすると、SSH 接続に公開鍵認証を使用した VM をデプロイすることができます。

Linux VM を作成する際、セキュリティ上の理由により公開鍵認証を有効にし、パスワード認証を禁止することが多いです。その際は、このテンプレートを参考にできると思います。

読み解く

毎度ですが、よくあるテンプレートのパターンは下記の通りです。

  1. パラメータ指定 (parameters)
  2. 変数の設定 (variables)
  3. デプロイするリソースの記述 (resources)

パラメータ指定 (parameters)

前半の "parameters": から始まる部分では、テンプレート内で使われるパラメータ (変数) の設定です。テンプレートのデプロイ時に選択肢として表示させたりすることができます。

adminPublicKey で、公開鍵の文字列を入力するようになっています。

azuredeploy.json
  "parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Specifies a name for generating resource names."
      }
    },
    ...
    "adminPublicKey": {
      "type": "string",
      "metadata": {
        "description": "Specifies the SSH rsa public key file as a string. Use \"ssh-keygen -t rsa -b 2048\" to generate your SSH key pairs."
      }
    },

なんとなく、adminPublicKey"type": "securestring" と指定する (※) 方が良いのでは? と思ったのですが、落ち着いて考えたら公開鍵だから流出しても別に良いため、これで良いのですね。

(※) "type": "securestring" と指定することで、一般的なパスワード入力画面のようにマスクした状態で入力することができます。また、デプロイ後のログ等でも値を確認することができなくなるため、安全にパスワードのような文字列を渡すことができます。

変数の設定 (variables)

"variables": セクションでは、この yaml ファイル中で利用する変数名を設定できます。このテンプレートでは、サブネットや VM 名などをここで設定しています。変更したいときは、適宜こちらを書き換えてからデプロイすれば良いですね。

azuredeploy.json
  "variables": {
    "vNetName": "[concat(parameters('projectName'), '-vnet')]",
    "vNetAddressPrefixes": "10.0.0.0/16",
    "vNetSubnetName": "default",
    "vNetSubnetAddressPrefix": "10.0.0.0/24",
    "vmName": "[concat(parameters('projectName'), '-vm')]",
    "publicIPAddressName": "[concat(parameters('projectName'), '-ip')]",
    "networkInterfaceName": "[concat(parameters('projectName'), '-nic')]",
    "networkSecurityGroupName": "[concat(parameters('projectName'), '-nsg')]",
    "networkSecurityGroupName2": "[concat(variables('vNetSubnetName'), '-nsg')]"
  },

デプロイするリソースの記述 (resources)

"resources": セクションで、デプロイするリソースを記述しています。

基本的な構成は、拙著の [Azure] 101-vm-multiple-ipconfig テンプレート読み解き が参考になると思いますので、そちらをご覧くださいませ。

パスワード認証は、"type": "Microsoft.Compute/virtualMachinesproperties - osProfile - linuxConfiguration にて構成します。

azuredeploy.json
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2019-12-01",
      "name": "[variables('vmName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "linuxConfiguration": {
            "disablePasswordAuthentication": true,
            "ssh": {
              "publicKeys": [
                {
                  "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                  "keyData": "[parameters('adminPublicKey')]"
                }
              ]
            }
          }
        },
        ...
      }
    }

disablePasswordAuthentication を設定しつつ、設定は PublicKeys で設定していますね。書き方的には、path で指定したファイルに keyData を書き込むイメージですね。

参考 : Microsoft.Compute virtualMachines

最後に

Azure QuickStart Templates は、Azure を勉強するにあたっては結構宝の山だとも思うので、今後も面白そうなものを読み解いてはアウトプットしていきたいな、と思います。

Discussion