Поделиться через


Правило анализатора кода: выходные данные не должны содержать секретную информацию

Это правило позволяет обнаружить возможное раскрытие секретной информации в выходных данных шаблона.

Код правила анализатора кода

Для настройки параметров правил укажите в файле конфигурации 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.