Partilhar via


Regra de 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 da regra de linha

Use o seguinte valor no arquivo de configuração do Bicep para personalizar as configurações da regra: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 list* funções como listKeys. A saída de um modelo é armazenada no histórico de implantação, de modo que um usuário com permissões somente leitura pode obter acesso a informações que, de outra forma, não estariam disponíveis com 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 list* função 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', indicando que ele pode conter um segredo

output accountPassword string = '...'

Para corrigi-lo, você precisa remover os dados secretos da saída. A prática recomendada é produzir o resourceId do recurso que contém o segredo e recuperá-lo quando o recurso que precisa das informações for criado ou atualizado. Os segredos também podem ser armazenados no KeyVault para cenários de implantação mais complexos.

O exemplo a seguir mostra um padrão seguro para recuperar uma chave 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 não contêm segredos. Por exemplo, nem todas as list* funções realmente retornam dados confidenciais. Nesses casos, você pode desativar o aviso para essa linha adicionando #disable-next-line outputs-should-not-contain-secrets antes da linha com o aviso.

#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 essa linha.

Próximos passos

Para obter mais informações sobre o linter, consulte Usar binter linter.