在Terraform中自动挂载Azure File Storage

51次阅读
没有评论

问题描述

想要在虚拟机(VM)进行资源部署时,自动挂载Azure File Storage。他已经查阅了微软的文档,其中描述了如何在Linux系统上使用Azure CLI挂载文件共享。此外,用户还提到了在本地主机上使用Terraform成功设置的替代方案,但在应用后发现访问密钥(primary_access_key)仍然保存在Terraform的状态中。用户希望知道这是否安全,是否有方法从状态中删除密钥。此外,用户还在使用cloud-init时,关于密钥是否会保留在VM的自定义数据中以及是否有其他安全的挂载数据到VM的方法。

解决方案

在阅读下面的解决方案之前,请确保已备份好相关数据并了解涉及的风险。

使用Terraform挂载Azure File Storage

你可以通过Terraform来自动挂载Azure File Storage,以下是一种可能的做法:

  1. 首先,需要定义已存在的存储帐户。在Terraform中,使用azurerm_storage_account资源来完成这一步骤。你可以在Terraform配置文件中添加如下内容:
data "azurerm_storage_account" "storage-account" {
  name                = "storageaccount"
  resource_group_name = "RG-storage-account"
}
  1. 在部署虚拟机(azurerm_virtual_machine资源)时,使用远程执行 provisioner 在VM上执行挂载操作。以下是一个示例:
resource "azurerm_virtual_machine" "vm" {
  # ... 其他配置

  provisioner "remote-exec" {
    inline = [
      "sudo mkdir -p /mnt/${data.azurerm_storage_account.storage-account.name}/share",
      "sudo mount -t cifs //${data.azurerm_storage_account.storage-account.name}.file.core.windows.net/share /mnt/${data.azurerm_storage_account.storage-account.name}/share -o vers=3.0,dir_mode=0755,file_mode=0755,serverino,username=${data.azurerm_storage_account.storage-account.name},password=${data.azurerm_storage_account.storage-account.primary_access_key}",
    ]
  }
}

在这个示例中,我们创建了一个azurerm_virtual_machine资源,并使用remote-exec provisioner 执行挂载操作。请注意,这里的密码${data.azurerm_storage_account.storage-account.primary_access_key}是从Terraform状态中获取的。如果你担心密码泄露的问题,可以考虑以下几种方式:

保护密码安全

  1. 加密状态文件:使用Terraform的加密功能,将状态文件加密存储,以保护其中的敏感信息。这可以通过设置环境变量TF_CLI_ARGS_init="-backend-config=encrypt=true"来实现。

  2. 使用环境变量:将密码存储在环境变量中,然后在Terraform配置中引用。这样不会将密码明文写入配置文件,也不会存储在状态中。但要确保环境变量的安全性。

  3. 使用密钥管理工具:使用专门的密钥管理工具,如HashiCorp的Vault,来安全地存储和获取敏感数据。

安全挂载数据

除了使用密码保护策略外,你还可以考虑以下方法来更安全地挂载数据:

  1. 使用Azure Managed Identity:将VM与Azure Managed Identity 关联,允许VM在不使用密码的情况下访问Azure资源。这样可以避免在配置文件中明文存储密码。

  2. 使用SAS令牌:生成临时共享访问签名(SAS)令牌,以临时授权VM访问Azure文件共享,而无需存储密码。

使用Cloud-Init

如果你考虑使用cloud-init来挂载文件共享,可以考虑以下步骤:

  1. 将挂载命令添加到cloud-init脚本中,以在VM启动时自动执行。

  2. 考虑使用加密的cloud-init自定义数据,以增加数据的安全性。

总结

在使用Terraform自动挂载Azure File Storage时,需要考虑安全性和密码管理问题。通过加密状态文件、使用环境变量、密钥管理工具,以及利用Azure Managed Identity 或 SAS 令牌等方式,可以更好地保护敏感数据并确保安全挂载。同时,使用cloud-init时,考虑加密自定义数据以增加安全性。

正文完