Linter 規則 - 輸出不應包含祕密

此規則會在範本的輸出中尋找可能的祕密曝光。

Linter 規則程式碼

使用 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@2021-04-01' existing = {
  name: storageName
}
​
output badResult object = {
  value: stg.listKeys().keys[0].value
}

下列範例會失敗,因為輸出名稱包含「密碼」,指出其可能包含祕密

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