在信息安全领域,密钥轮换是一个至关重要的实践。它有助于限制攻击的影响范围,并确保访问密钥定期更新,从而增加被攻破的难度。安全专家建议通过自动化方式进行密钥轮换,以确保密钥的安全性。微软发布的文档详细介绍了如何使用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的状态与云中的实际状态保持一致。