Linter 规则 - 输出不应包含机密

此规则在模板的输出中发现可能泄露的秘密。

Linter 规则代码

请在 Bicep 配置文件中使用以下值自定义规则设置:outputs-should-not-contain-secrets

解决方案

不要在输出中包含任何可能暴露机密的值。 例如,secureString 或 secureObject 类型的安全参数,或 listKeys 等 list* 函数。 模板的输出存储在部署历史记录中,因此具有只读权限的用户可以访问只读权限无法访问的信息。 以下示例将失败,因为它在输出值中包含安全参数。

@secure()
param secureParam string
​
output badResult string = 'this is the value ${secureParam}'

以下示例将失败,因为它在输出中使用了 list* 函数。

param storageName string
resource stg 'Microsoft.Storage/storageAccounts@2021-04-01' existing = {
  name: storageName
}
​
output badResult object = {
  value: stg.listKeys().keys[0].value
}

以下示例将失败,因为输出名称包含“password”,表明它可能包含机密

output accountPassword string = '...'

若要解决此问题,需要从输出中移除机密数据。 建议输出包含机密的资源的 resourceId,并在创建或更新需要信息的资源时检索机密。 对于较复杂的部署方案,机密也可能存储在 KeyVault 中。

以下示例演示了从模块检索 storageAccount 密钥的安全模式。

output storageId string = stg.id

这可在后续部署中使用,如以下示例所示

someProperty: listKeys(myStorageModule.outputs.storageId.value, '2021-09-01').keys[0].value

静默处理误报

有时,此规则会针对实际上不包含机密的模板输出发出警报。 例如,并非所有 list* 函数实际上都返回敏感数据。 在这些情况下,可以通过在带有警告的行之前添加 #disable-next-line outputs-should-not-contain-secrets 来禁用该行的警告。

#disable-next-line outputs-should-not-contain-secrets // Doesn't contain a password
output notAPassword string = '...'

最好是添加一条注释,解释为什么该规则不适用于此行。

后续步骤

有关 Linter 的详细信息,请参阅使用 Bicep Linter