密钥轮换与Terraform状态管理

在信息安全领域,密钥轮换是一个至关重要的实践。它有助于限制攻击的影响范围,并确保访问密钥定期更新,从而增加被攻破的难度。安全专家建议通过自动化方式进行密钥轮换,以确保密钥的安全性。微软发布的文档详细介绍了如何使用Azure自动化来轮换密钥。这种方法将密钥轮换过程纳入系统常规操作,减轻了DevOps工程师或开发者的负担,并且对于政府机构来说,也便于进行合规性审计。

然而,注意到网络上有一种趋势,即让Terraform生成密钥,并在Terraform脚本中使用随机化来轮换这些密钥。虽然这种方法可以自动化生成密钥,但并不推崇。因为这样做将密钥轮换变成了部署活动的一部分,如果环境变得足够大,开始进行“范围限定”的部署,那么密钥生成将变得毫无规律,完全依赖于何时运行脚本。

这最终会导致状态管理上的问题。以下面的代码为例:

provider " azurerm" { subscription_id = " ...subscription id..." features { key_vault { purge_soft_delete_on_destroy = true } } } data " azurerm_client_config" " current" {} resource " azurerm_resource_group" " superheroes" { name = " superheroes" location = " usgovvirginia" } resource " random_id" " server" { keepers = { ami_id = 1 } byte_length = 8 } resource " azurerm_key_vault" " superherovault" { name = " superheroidentities" location = azurerm_resource_group.superheroes.location resource_group_name = azurerm_resource_group.superheroes.name enabled_for_disk_encryption = true tenant_id = data.azurerm_client_config.current.tenant_id soft_delete_enabled = true purge_protection_enabled = false sku_name = " standard" access_policy { tenant_id = data.azurerm_client_config.current.tenant_id object_id = data.azurerm_client_config.current.object_id key_permissions = [ " create" , " get" , ] secret_permissions = [ " set" , " get" , " delete" , ] } tags = { environment = " Testing" } } resource " azurerm_key_vault_secret" " Batman" { name = " batman" value = " Bruce Wayne" key_vault_id = azurerm_key_vault.superherovault.id tags = { environment = " Production" } }

基于上述代码,一切看起来都很好,对吧?当执行Terraform脚本时,将拥有一个名为“batman”的秘密,其值为“Bruce Wayne”。但问题在于,如果在Azure门户中更改该值,比如说将“batman”的值更改为“dick grayson”,然后重新运行Terraform apply,它将想把那个密钥重置回“batman”。这时,密钥轮换就被打破了……现在怎么办?

想法是,可以很容易地将“terraform apply”包装在一个bash脚本中,在执行它之前运行一个“terraform refresh”,重新从云中拉取值来填充Terraform脚本。如果不喜欢这个选项,还有另一种解决方案,那就是在资源内部使用lifecycle标签来告诉它忽略更新。并阻止对密钥库的更新,如果密钥在轮换过程中发生了变化。

自动化密钥轮换的过程中,需要注意密钥的生命周期管理。例如,如果密钥在Azure门户中被更改,Terraform应该能够检测到这些更改,并相应地更新其状态。这可以通过在执行Terraform apply之前运行terraform refresh来实现,这样可以确保Terraform的状态与云中的实际状态保持一致。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485