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

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

Código de regra do Linter

Utilize o seguinte valor no ficheiro de configuração do Bicep para personalizar as definições de regras: outputs-should-not-contain-secrets

Solução

Não inclua quaisquer valores numa saída que possam potencialmente expor segredos. Por exemplo, parâmetros seguros do tipo secureString ou secureObject, ou list* funções como listKeys. O resultado de um modelo é armazenado no histórico de implementações, pelo que um utilizador com permissões só de leitura pode obter acesso a informações que, caso contrário, não estão disponíveis com permissão só de leitura. O exemplo seguinte falha porque inclui um parâmetro seguro num valor de saída.

@secure()
param secureParam string
​
output badResult string = 'this is the value ${secureParam}'

O exemplo seguinte falha porque utiliza uma list* função numa saída.

param storageName string
resource stg 'Microsoft.Storage/storageAccounts@2021-04-01' existing = {
  name: storageName
}
​
output badResult object = {
  value: stg.listKeys().keys[0].value
}

O exemplo seguinte falha porque o nome de saída contém "palavra-passe", que indica que pode conter um segredo

output accountPassword string = '...'

Para o corrigir, tem de remover os dados secretos da saída. A prática recomendada é exportar o resourceId do recurso que contém o segredo e obter o segredo quando o recurso que precisa das informações é criado ou atualizado. Os segredos também podem ser armazenados no KeyVault para cenários de implementação mais complexos.

O exemplo seguinte mostra um padrão seguro para obter uma chave storageAccount de um módulo.

output storageId string = stg.id

Que pode ser utilizada numa implementação subsequente, conforme mostrado no exemplo seguinte

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

Silenciar falsos positivos

Por vezes, esta regra alerta em saídas de modelo que não contêm segredos. Por exemplo, nem todas as list* funções devolvem dados confidenciais. Nestes casos, pode desativar o aviso para esta linha ao adicionar #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 motivo a regra não se aplica a esta linha.

Passos seguintes

Para obter mais informações sobre o linter, veja Utilizar o linter Bicep.