Política de seguranza do contido

A Política de Seguridade de Contidos (CSP) está actualmente soportada en aplicacións orientadas a modelos, canvas e código. Este artigo explica como configurar CSP para aplicacións baseadas en modelos e canvas. Para aplicacións de código CSP, consulta a documentación de aplicacións de código. Os administradores poden controlar se se envía a cabeceira CSP e, ata certo punto, o que contén. As configuracións están a nivel de entorno, o que significa que se aplican a todas as aplicacións do entorno unha vez activadas.

Nota

A política de seguranza de contido só se aplica a entornos que usan Dataverse.

Cada compoñente do valor da cabeceira CSP controla os activos que se poden descargar. A Rede de Desenvolvedores de Mozilla (MDN) ofrece descricións máis detalladas. Por defecto, os valores son os seguintes:

Directiva Valor predefinido Personalizable
fonte-de-script * 'unsafe-inline' 'unsafe-eval' blob: Non
traballador-src 'self' blob: Non
estilo-src * 'unsafe-inline' blob: Non
fonte-src * data: Non
antepasados do marco 'self' https://*.powerapps.com Si

Esta configuración resulta nun CSP predeterminado de script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Modo estrito

O interruptor Strict CSP crea un CSP que na súa maioría non inclúe comodíns nin directivas inseguras, como unsafe-inline. Cando activas o CSP Estrito, as directrices anteriores convértense nas seguintes directrices detalladas nesta sección. A <platform> notación significa que os dominios da plataforma son proporcionados segundo o requirido polo produto. Os dominios desta sección poden cambiar co tempo a medida que o produto medra.

Directiva Valor predeterminado (baseado no modelo) Valor predeterminado (lenzo) Personalizable
fonte-de-script 'self' blob: <platform>' 'self' <platform>' Si
traballador-src 'self' blob: 'self' blob: Non
estilo-src 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Si
fonte-src 'self' data: <platform> 'self' data: <platform> Si
antepasados do marco 'self' https://*.powerapps.com 'self' https://*.powerapps.com Si
img-src 'self' blob: data: <platform> 'self' data: <platform> Si
conectar- src 'self' blob: data: wss: <platform> 'self' blob: <platform> Si
frame- src 'self' blob: <platform> 'self' <platform> Si
URI base 'none' Non dispoñible Non
formulario-acción <platform> Non dispoñible Si
predeterminado- src 'self' 'self' Non

Requisitos previos

Para as aplicacións de compromiso co cliente Dynamics 365 e outras aplicacións baseadas en modelos, o CSP só está dispoñible en contornas en liña e en organizacións con Dynamics 365 Customer Engagement (on-premises), versión 9.1 ou posterior.

Configurar CSP

Podes activar e configurar o CSP a través do Power Platform centro de administración. É importante activar primeiro un ambiente de desenvolvemento/probas, xa que activar CSP podería iniciar escenarios de bloqueo se se viola a política. O centro de administración tamén soporta un modo só con informes para facilitar a aceleración da produción.

Segue estes pasos para configurar CSP:

  1. Inicie sesión no Centro de administración de Power Platform.
  2. No panel de navegación, selecciona Xestionar. No panel Xestionar , seleccione Entornos.
  3. Na páxina Entornos , seleccione un entorno.
  4. Na barra de comandos, seleccione Configuración.
  5. Expande Produto e, a seguir, selecciona Privacidade + Seguridade.

A seguinte imaxe mostra o estado predeterminado da configuración:

Configuración predeterminada da política de seguranza de contido.

Informes

A opción Activar informes controla se as aplicacións baseadas en modelos e as de lenzo envían informes de infracción. Para activalo, especifica un punto final. A aplicación envía informes de violacións a este punto final, independentemente de se CSP se aplica ou non. Se o CSP non está aplicado, a aplicación usa o modo só de informe. Para obter máis información, consulte a documentación de informes.

Activa a opción de crear informes.

Aplicación

A aplicación de CSP contrólase de forma independente para as aplicacións baseadas en modelos e de lenzo para proporcionar un control granular sobre as políticas. Use o pivote baseado en modelos/lenzos para modificar o tipo de aplicación desexado.

O interruptor Aplicar política de seguridade de contido activa a política predeterminada para a aplicación para o tipo de aplicación dado. Ao activar esta opción, cambia o comportamento das aplicacións neste ambiente para que se axuste á política. Por iso, segue este fluxo de habilitación suxerido:

  1. Fai cumprir a política nun entorno de desenvolvemento ou de proba.
  2. Activar o modo de só informes en produción.
  3. Fai cumprir a política en produción unha vez que non se reporten infraccións.

Configurar directivas

A sección Configurar directivas permítelle controlar as directivas individuais dentro da política. Actualmente, só podes personalizar a frame-ancestors directiva.

Configurar directivas CSP.

Se deixas activada a directiva predeterminada, usas o valor por defecto especificado na táboa. Se desactivas o interruptor, podes especificar valores personalizados para a directiva e engadilos ao valor por defecto. O seguinte exemplo establece valores personalizados para frame-ancestors. A directiva está configurada para frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com neste exemplo. Esta configuración significa que a aplicación pode estar aloxada na mesma orixe, https://*.powerapps.com, https://www.foo.com, e https://www.bar.com, pero non noutras orixes. Usa o botón Engadir para engadir entradas á lista e a icona Eliminar para eliminalas.

Configuración de directivas CSP personalizadas.

Opcións de configuración habituais

Para Microsoft Teams integración usando a aplicación Dynamics 365, engade o seguinte a frame-ancestors:

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

Para a aplicación Dynamics 365 para Outlook, engade o seguinte a frame-ancestors:

  • Orixe da páxina principal da túa aplicación web Outlook
  • https://outlook.office.com
  • https://outlook.office365.com

Para incrustar Power Apps en Power BI informes, engade o seguinte a frame-ancestors:

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

Consideracións importantes

Desactivar a directiva predeterminada e gardar cunha lista baleira desactiva a directiva completamente e non a envía como parte da cabeceira de resposta do CSP.

Exemplos de configuración de CSP

Aquí tes un par de exemplos de configuracións CSP.

Exemplo 1: informes desactivados

Exemplo 1 de CSP, dirixido por modelos

Exemplo CSP 1, canvas

No exemplo:

  • Os informes están desactivados.
  • A aplicación baseada en modelos está activada.
    • frame-ancestors está personalizada a https://www.contoso.com e https://www.fabrikam.com.
  • A aplicación do lenzo está desactivada.

Os encabezados efectivos son:

  • Aplicacións xeradas por modelos: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline' :blob; font-src * data:; frame-ancestors https://www.contoso.com https://www.fabrikam.com;
  • Aplicacións Canvas: a cabeceira CSP non se envía.

Exemplo 2: informes activados

Exemplo 2 de CSP, dirixido por modelos

Exemplo CSP 2, lenzo

No exemplo:

  • Os informes están activados.
    • O extremo de creación está axustado en https://contoso.com/reporting-endpoint
  • A aplicación baseada en modelos está activada.
    • frame-ancestors mantense por defecto
  • A aplicación do lenzo está desactivada.
    • frame-ancestors está personalizado para https://www.contoso.com

Os valores efectivos do CSP son:

  • Aplicacións xeradas por modelos: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://contoso.com/reporting-endpoint;
  • Aplicacións de lenzo: 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.contoso.com; report-uri https://contoso.com/reporting-endpoint;

Modificar a configuración da organización directamente

Podes configurar CSP sen usar a IU modificando directamente estes axustes da organización:

  • IsContentSecurityPolicyEnabled controla se a cabeceira Content-Security-Policy se envía nas aplicacións baseadas en modelos.

  • ContentSecurityPolicyConfiguration controla o valor da parte dos antepasados do marco (como se viu antes, establece se 'self'ContentSecurityPolicyConfiguration non está activado). Defina esta configuración usando un obxecto JSON coa seguinte estrutura – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Esta configuración tradúcese en script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (De MDN) A directiva de antepasados de marco HTTP Content-Security-Policy (CSP) especifica os elementos principais válidos que poden incrustar unha páxina usando <frame>, <iframe>, <object>, <embed> ou <applet>.
  • IsContentSecurityPolicyEnabledForCanvas controla se a cabeceira Content-Security-Policy se envía nas aplicacións de lenzo.

  • ContentSecurityPolicyConfigurationForCanvas controla a política para Canvas usando o mesmo proceso descrito en ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri controla se se deben usar os informes. Esta configuración úsana tanto as aplicacións baseadas en modelos como as de lenzo. Unha cadea válida envía informes de infraccións ao punto final especificado, usando o modo só de informes se IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas está desactivado. Unha cadea baleira desactiva os informes. Para obter máis información, consulte a documentación de informes.

Configuración de CSP sen IU

Especialmente para contornos que non se atopen no centro de administración de Power Platform, como as configuracións locais, os administradores poden querer configurar CSP mediante scripts para modificar directamente a configuración.

Activar CSP sen interface de usuario

Siga estes pasos para activar CSP sen interface de usuario:

  • Abra as ferramentas de desenvolvedor do navegador mentres utiliza a aplicación baseada en modelos como usuario con privilexios de actualización da entidade da organización (o administrador do sistema é unha boa opción).
  • Pega e executa o seguinte script na consola.
  • Para activar CSP, pase a configuración predeterminada: enableFrameAncestors(["'self'"])
  • Como exemplo de como permitir que outras orixes incrusten a aplicación: 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!')
}

Desactivar CSP sen IU

Siga estes pasos para desactivar CSP sen IU:

  • Abra as ferramentas de desenvolvedor do navegador mentres utiliza a aplicación baseada en modelos como usuario con privilexios de actualización da entidade da organización (o administrador do sistema é unha boa opción).
  • Pega e executa o seguinte script na consola.
  • Para desactivar CSP, pegue na consola: 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!')
}