问题描述
想要在虚拟机(VM)进行资源部署时,自动挂载Azure File Storage。他已经查阅了微软的文档,其中描述了如何在Linux系统上使用Azure CLI挂载文件共享。此外,用户还提到了在本地主机上使用Terraform成功设置的替代方案,但在应用后发现访问密钥(primary_access_key
)仍然保存在Terraform的状态中。用户希望知道这是否安全,是否有方法从状态中删除密钥。此外,用户还在使用cloud-init时,关于密钥是否会保留在VM的自定义数据中以及是否有其他安全的挂载数据到VM的方法。
解决方案
在阅读下面的解决方案之前,请确保已备份好相关数据并了解涉及的风险。
使用Terraform挂载Azure File Storage
你可以通过Terraform来自动挂载Azure File Storage,以下是一种可能的做法:
- 首先,需要定义已存在的存储帐户。在Terraform中,使用
azurerm_storage_account
资源来完成这一步骤。你可以在Terraform配置文件中添加如下内容:
data "azurerm_storage_account" "storage-account" {
name = "storageaccount"
resource_group_name = "RG-storage-account"
}
- 在部署虚拟机(
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状态中获取的。如果你担心密码泄露的问题,可以考虑以下几种方式:
保护密码安全
-
加密状态文件:使用Terraform的加密功能,将状态文件加密存储,以保护其中的敏感信息。这可以通过设置环境变量
TF_CLI_ARGS_init="-backend-config=encrypt=true"
来实现。 -
使用环境变量:将密码存储在环境变量中,然后在Terraform配置中引用。这样不会将密码明文写入配置文件,也不会存储在状态中。但要确保环境变量的安全性。
-
使用密钥管理工具:使用专门的密钥管理工具,如HashiCorp的Vault,来安全地存储和获取敏感数据。
安全挂载数据
除了使用密码保护策略外,你还可以考虑以下方法来更安全地挂载数据:
-
使用Azure Managed Identity:将VM与Azure Managed Identity 关联,允许VM在不使用密码的情况下访问Azure资源。这样可以避免在配置文件中明文存储密码。
-
使用SAS令牌:生成临时共享访问签名(SAS)令牌,以临时授权VM访问Azure文件共享,而无需存储密码。
使用Cloud-Init
如果你考虑使用cloud-init来挂载文件共享,可以考虑以下步骤:
-
将挂载命令添加到cloud-init脚本中,以在VM启动时自动执行。
-
考虑使用加密的cloud-init自定义数据,以增加数据的安全性。
总结
在使用Terraform自动挂载Azure File Storage时,需要考虑安全性和密码管理问题。通过加密状态文件、使用环境变量、密钥管理工具,以及利用Azure Managed Identity 或 SAS 令牌等方式,可以更好地保护敏感数据并确保安全挂载。同时,使用cloud-init时,考虑加密自定义数据以增加安全性。