此规则查找模板输出中可能泄露机密。
在 Bicep 配置文件 中使用以下值自定义规则设置: outputs-should-not-contain-secrets
不要在可能公开机密的输出中包含任何值。 例如,secureString 或 secureObject 类型的安全参数,或 list*
listKeys 等函数。
模板的输出存储在部署历史记录中,因此具有只读权限的用户可以获取对信息的访问权限,否则无法使用只读权限。
以下示例失败,因为它在输出值中包含安全参数。
@secure()
param secureParam string
output badResult string = 'this is the value ${secureParam}'
以下示例失败,因为它在输出中使用函数 list*
。
param storageName string
resource stg 'Microsoft.Storage/storageAccounts@2023-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。