Regra Linter ─ as saídas não devem conter segredos

Esta regra encontra a possível exposição de segredos nas saídas de um modelo.

Código de regra linter

Use o seguinte valor no arquivo de configuração do Bicep para personalizar configurações de regras: outputs-should-not-contain-secrets

Solução

Não inclua valores em uma saída que possam expor segredos. Por exemplo, parâmetros seguros do tipo secureString ou secureObject ou funções list*, como listKeys. A saída de um modelo é armazenada no histórico de implantação, portanto um usuário com permissões somente leitura poderia obter acesso a informações que de outra forma não estariam disponíveis com a permissão somente leitura. O exemplo a seguir falha porque inclui um parâmetro seguro em um valor de saída.

@secure()
param secureParam string

output badResult string = 'this is the value ${secureParam}'

O exemplo a seguir falha porque usa uma função list* em uma saída.

param storageName string
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' existing = {
  name: storageName
}

output badResult object = {
  value: stg.listKeys().keys[0].value
}

O exemplo a seguir falha porque o nome de saída contém 'senha', o que indica que ele pode conter um segredo

output accountPassword string = '...'

Para corrigir o problema, você precisará remover os dados secretos da saída. A prática recomendada é gerar a resourceId do recurso que contém o segredo e recuperar o segredo quando o recurso que precisa das informações for criado ou atualizado. Os segredos também podem ser armazenados no Key Vault para cenários de implantação mais complexos.

O exemplo a seguir mostra um padrão seguro para recuperar uma chave de storageAccount de um módulo.

output storageId string = stg.id

Que pode ser usado em uma implantação subsequente, conforme mostrado no exemplo a seguir

someProperty: listKeys(myStorageModule.outputs.storageId.value, '2021-09-01').keys[0].value

Silenciar falsos positivos

Às vezes, essa regra alerta sobre saídas de modelo que na verdade não contêm segredos. Por exemplo, nem todas as funções list* retornam dados confidenciais. Nesses casos, é possível desabilitar o aviso para esta linha adicionando #disable-next-line outputs-should-not-contain-secrets antes dela.

#disable-next-line outputs-should-not-contain-secrets // Doesn't contain a password
output notAPassword string = '...'

É uma boa prática adicionar um comentário explicando por que a regra não se aplica a esta linha.

Próximas etapas

Para saber mais sobre o linter, confira Usar o linter do Bicep.