Правило анализатора кода: выходные данные не должны содержать секретную информацию
Это правило позволяет обнаружить возможное раскрытие секретной информации в выходных данных шаблона.
Код правила анализатора кода
Для настройки параметров правил укажите в файле конфигурации 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 = '...'
Чтобы устранить эту проблему, необходимо удалить секретные данные из выходных данных. Рекомендуется вывести идентификатор ресурса, содержащего секрет, и получить секрет при создании или обновлении ресурса, нуждающегося в обновлении. Секреты также могут храниться в 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 = '...'
Лучше всего добавить комментарий с объяснением того, почему правило не применяется к этой строке.
Следующие шаги
Дополнительные сведения об анализаторе кода Bicep см. в разделе Использование анализатора кода Bicep.