Compartilhar via


Política de segurança de conteúdo

Atualmente , há suporte para CSP (Política de Segurança de Conteúdo) em aplicativos baseados em modelo e tela. Os administradores podem controlar se o cabeçalho CSP é enviado e, até certo ponto, o que ele contém. As configurações estão no nível do ambiente, o que significa que ela é aplicada a todos os aplicativos no ambiente uma vez ativadas.

Nota

A política de segurança de conteúdo só se aplica a ambientes que usam o Dataverse.

Cada componente do valor de cabeçalho do CSP controla os ativos que podem ser baixados e são descritos com mais detalhes na MDN (Mozilla Developer Network): Os valores padrão são os seguintes:

Diretiva Valor padrão Personalizável
script-src * 'unsafe-inline' 'unsafe-eval' blob: data: Não
worker-src 'self' blob: data: Não
style-src * 'unsafe-inline' Não
font-src * data: Não
frame-ancestors 'self' https://*.powerapps.com Sim

Esta configuração resulta em um CSP padrão de script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Modo rigoroso

A alternância CSP estrita cria uma política de segurança de conteúdo que, na maioria das vezes, não inclui curingas ou diretivas inseguras, como unsafe-inline. Quando o CSP estrito estiver ativado, as diretivas detalhadas na tabela anterior se transformarão nas diretivas detalhadas na tabela a seguir. A <platform> notação significa que os domínios de plataforma são fornecidos conforme exigido pelo produto. Os domínios nesta seção podem mudar ao longo do tempo à medida que o produto cresce.

Nota

Atualmente, o CSP estrito só está disponível para aplicativos controlados por modelos.

Diretiva Valor padrão (controlado por modelo) Personalizável
script-src 'self' blob: data: <platform>' Sim
worker-src 'self' blob: data: Não
style-src 'self' 'unsafe-inline' <platform> Sim
font-src 'self' data: <platform> Sim
frame-ancestors 'self' https://*.powerapps.com Sim
img-src 'self' blob: data: <platform> Sim
connect-src 'self' blob: data: wss: <platform> Sim
frame-src 'self' blob: <platform> Sim
base-uri 'none' Não
form-action <platform> Sim
default-src 'self' Não

Pré-requisitos

Para aplicativos Dynamics 365 customer engagement e outros aplicativos baseados em modelo, o CSP só está disponível em ambientes online e em organizações com Dynamics 365 customer engagement (on-premises), versão 9.1 ou posterior.

Configurar CSP

Você pode alternar e configurar o CSP por meio do Centro de administração do Power Platform. É importante habilitar primeiro um ambiente de desenvolvimento/teste, pois habilitar o CSP pode começar a bloquear cenários se a política for violada. Oferecemos suporte também a um modo apenas para relatório, permitindo uma transição mais fácil na produção.

Como configurar CSP:

  1. Entre no Centro de administração do Power Platform.
  2. No painel de navegação, selecione Gerenciar, em seguida, no painel Gerenciar, selecione Ambientes.
  3. Na página Ambientes, selecione um ambiente.
  4. Na barra de comandos, selecione Configurações.
  5. Expanda Produto e selecione Privacidade + Segurança.

A imagem a seguir mostra o estado padrão das configurações:

Configurações padrão da política de segurança de conteúdo.

Relatando

A alternância Ativar relatórios controla se os aplicativos baseados em modelo e aplicativo de tela enviam relatórios de violação. Você precisa especificar um ponto de extremidade para habilitá-lo. Os relatórios de violação são enviados para este ponto de extremidade, independentemente de o CSP ser aplicado ou não (usando o modo somente relatório, se o CSP não for aplicado). Para obter mais informações, consulte documentação do relatório.

Ative a opção de alternar entre relatórios.

Aplicação

A aplicação do CSP é controlada de forma independente para aplicativos de tela e baseados em modelo para fornecer controle granular sobre as políticas. Use o pivô orientado por modelo/tela para modificar o tipo de aplicativo pretendido.

A alternância Aplicar política de segurança de conteúdo ativa a política padrão para imposição para determinado tipo de aplicativo. Ativar essa alternância mudará o comportamento dos aplicativos neste ambiente para aderir à política. Portanto, o fluxo de habilitação sugerido seria:

  1. Aplique em um ambiente de desenvolvimento/teste.
  2. Habilite o modo somente relatório na produção.
  3. Aplique em produção, se nenhuma violação for relatada.

Configurar diretivas

A seção Configurar diretivas permite controlar diretivas individuais dentro da política. Atualmente, apenas frame-ancestors podem ser personalizados.

Configurar diretivas de CSP.

Manter a diretiva padrão ativada utiliza o valor padrão especificado na tabela. Desativar a alternância permite que os administradores especifiquem valores personalizados para a diretiva e os anexem ao valor padrão. O exemplo abaixo define valores personalizados para frame-ancestors. A diretiva seria definida como frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com neste exemplo, significando que o aplicativo seria hospedado na mesma origem, https://*.powerapps.com, https://www.foo.com e https://www.bar.com, mas não em outras origens. Use o botão Adicionar para adicionar entradas à lista e o ícone Excluir para removê-las.

Configurando diretivas de CSP personalizadas.

Configurações comuns

Para integração do Microsoft Teams usando o Aplicativo Dynamics 365, adicione o seguinte a frame-ancestors:

  • https://teams.microsoft.com/
  • https://teams.cloud.microsoft/
  • https://msteamstabintegration.dynamics.com/

Para o Dynamics 365 App for Outlook, adicione o seguinte a frame-ancestors:

  • Origem da página inicial do Outlook Web App
  • https://outlook.office.com
  • https://outlook.office365.com

Para inserção do Power Apps nos relatórios do Power BI, adicione o seguinte a frame-ancestors:

  • https://app.powerbi.com
  • https://ms-pbi.pbi.microsoft.com

Considerações importantes

Desativar a diretiva padrão e salvar com uma lista vazia desativa a diretiva completamente e não a envia como parte do cabeçalho de resposta do CSP.

Exemplos de configuração de CSP

Vamos dar uma olhada em alguns exemplos de configurações de CSP.

Exemplo 1 - relatórios desativados

Exemplo 1 de CSP.

No exemplo:

  • Os relatórios estão desativados.
  • A aplicação orientada por modelo está habilitada.
    • frame-ancestors é personalizado para https://www.foo.com e https://www.bar.com
  • A imposição de tela está desativada.

Os cabeçalhos eficazes seriam:

  • Aplicativos baseados em modelos: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors https://www.foo.com https://www.bar.com;
  • Aplicativos de tela: o cabeçalho CSP não seria enviado.

Exemplo 2 - relatórios ativados

Exemplo 2 de CSP.

No exemplo:

  • O relatório está ativado.
    • O ponto de extremidade do relatório foi definido como https://www.mysite.com/myreportingendpoint
  • A aplicação orientada por modelo está habilitada.
    • frame-ancestors é mantido como padrão
  • A imposição de tela está desativada.
    • frame-ancestors é personalizado como https://www.baz.com

Os valores CSP efetivos seriam:

  • Aplicativos baseados em modelos: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://www.mysite.com/myreportingendpoint;
  • Aplicativos de tela: Content-Security-Policy-Report-Only: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors https://www.baz.com; report-uri https://www.mysite.com/myreportingendpoint;

Modificar as configurações da organização diretamente

Você pode configurar o CSP sem usar a interface do usuário modificando estas configurações da organização diretamente:

  • IsContentSecurityPolicyEnabled controla se o cabeçalho Content-Security-Policy é enviado nos aplicativos baseados em modelo.

  • ContentSecurityPolicyConfiguration controla o valor da parte frame-ancestors (como visto acima, ele é definido como 'self' se ContentSecurityPolicyConfiguration não estiver definido). Essa configuração é definida usando um objeto JSON com esta estrutura – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Esta configuração se traduz em script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Da MDN) A diretiva HTTP Content-Security-Policy (CSP) frame-ancestors especifica pais válidos que podem conter uma página usando <frame>, <iframe>, <object>, <embed> ou <applet>.
  • IsContentSecurityPolicyEnabledForCanvas controla se o cabeçalho Content-Security-Policy é enviado nos aplicativos de tela.

  • ContentSecurityPolicyConfigurationForCanvas controla a política para tela usando o mesmo processo descrito em ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri controla se os relatórios devem ser usados. Essa configuração é usada por aplicativos de tela e baseados em modelo. Uma cadeia de caracteres válida envia relatórios de violação para o ponto de extremidade especificado, usando o modo somente relatório se IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas estiver desativado. Uma cadeia de caracteres vazia desabilita a geração de relatórios. Para obter mais informações, consulte documentação do relatório.

Configurar CSP sem Interface do Usuário

Especialmente para ambientes fora do centro de administração do Power Platform, como configurações local, os administradores talvez queiram configurar o CSP usando scripts para modificar diretamente as configurações.

Habilitar CSP sem IU

Siga estas etapas para habilitar o CSP sem interface do usuário:

  • Abra as ferramentas de desenvolvimento do navegador enquanto usa o aplicativo baseado em modelo como um usuário com privilégios de atualização de entidade organizacional (Administrador do Sistema é uma boa opção).
  • Cole e execute o script a seguir no console.
  • Para habilitar o CSP, passe para a configuração padrão – enableFrameAncestors(["'self'"])
  • Como exemplo de habilitar outras origens para inserir o aplicativo - enableFrameAncestors(["*.powerapps.com", "'self'", "abcxyz"])
async function enableFrameAncestors(sources) {
    const baseUrl = Xrm.Utility.getGlobalContext().getClientUrl();

    if (!Array.isArray(sources) || sources.some(s => typeof s !== 'string')) {
        throw new Error('sources must be a string array');
    }

    const orgResponse = await fetch(`${baseUrl}/api/data/v9.1/organizations`);
    if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
    const orgs = await orgResponse.json();
    const { organizationid, contentsecuritypolicyconfiguration, iscontentsecuritypolicyenabled } = orgs.value[0];

    console.log(`Organization Id: ${organizationid}`);
    console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);
    console.log(`CSP Config: ${contentsecuritypolicyconfiguration}`);

    const orgProperty = prop => `${baseUrl}/api/data/v9.1/organizations(${organizationid})/${prop}`;

    console.log('Updating CSP configuration...')
    const config = {
        'Frame-Ancestor': {
            sources: sources.map(source => ({ source })),
        },
    };
    const cspConfigResponse = await fetch(orgProperty('contentsecuritypolicyconfiguration'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: JSON.stringify(config),
        }),
    });

    if (!cspConfigResponse.ok) {
        throw new Error('Failed to update csp configuration');
    }
    console.log('Successfully updated CSP configuration!')

    if (iscontentsecuritypolicyenabled) {
        console.log('CSP is already enabled! Skipping update.')
        return;
    }

    console.log('Enabling CSP...')
    const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: true,
        }),
    });

    if (!cspEnableResponse.ok) {
        throw new Error('Failed to enable csp');
    }
    console.log('Successfully enabled CSP!')
}

Desabilitar CSP sem UI

Siga estas etapas para desabilitar o CSP sem interface do usuário:

  • Abra as ferramentas de desenvolvimento do navegador enquanto usa o aplicativo baseado em modelo como um usuário com privilégios de atualização de entidade organizacional (Administrador do Sistema é uma boa opção).
  • Cole e execute o script a seguir no console.
  • Para desabilitar o CSP, cole no console: disableCSP()
async function disableCSP() {
    const baseUrl = Xrm.Utility.getGlobalContext().getClientUrl();

    const orgResponse = await fetch(`${baseUrl}/api/data/v9.1/organizations`);
    if (!orgResponse.ok) throw new Error('Failed to retrieve org info');
    const orgs = await orgResponse.json();
    const { organizationid, iscontentsecuritypolicyenabled } = orgs.value[0];

    console.log(`Organization Id: ${organizationid}`);
    console.log(`CSP Enabled?: ${iscontentsecuritypolicyenabled}`);

    const orgProperty = prop => `${baseUrl}/api/data/v9.1/organizations(${organizationid})/${prop}`;

    if (!iscontentsecuritypolicyenabled) {
        console.log('CSP is already disabled! Skipping update.')
        return;
    }

    console.log('Disabling CSP...')
    const cspEnableResponse = await fetch(orgProperty('iscontentsecuritypolicyenabled'), {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            value: false,
        }),
    });

    if (!cspEnableResponse.ok) {
        throw new Error('Failed to disable csp');
    }
    console.log('Successfully disabled CSP!')
}