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@2023-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。