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。