Compartir por


Política de seguranza do contido

política de seguranza do contido (CSP) é compatible actualmente con modelos e lenzos Power Apps. Os administradores poden controlar se se envía a cabeceira CSP e, ata certo punto, o que contén. A configuración está a nivel do contorno, o que significa que se aplicaría a todas as aplicacións do contorno unha vez activada.

Cada compoñente do valor da cabeceira CSP controla os recursos que se poden descargar e descríbese con máis detalle na Rede de Desenvolvedores de Mozilla (MDN). Por defecto, os valores son os seguintes:

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

Isto resulta nun CSP predeterminado de script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;. Na nosa folla de ruta, temos a posibilidade de modificar as cabeceiras actualmente non personalizables.

Requisitos previos

  • Para as aplicacións de interacción co cliente de Dynamics 365 e outras aplicacións baseadas en modelos, CSP só está dispoñible en contornos en liña e en organizacións con compromiso co cliente de Dynamics 365 (local), versión 9.1 ou posterior.

Configuración do CSP

Pódese cambiar e configurar CSP a través do centro de administración de Power Platform. É importante activar primeiro nun ambiente de desenvolvemento/proba xa que a activación do CSP pode comezar a bloquear escenarios se se infrinxe a política. Tamén admitimos un "modo de só informes" para facilitar a aceleración da produción.

Para configurar CSP, vaia ao centro de administración de centro de administración de Power Platform ->Contornos ->Configuración ->Privacidade + Seguridade. A seguinte imaxe mostra o estado predeterminado da configuración:

Política de seguranza do contido configuración predeterminada

Notificando

A opción "Activar informes" controla se as aplicacións baseadas en modelos e de lenzo envían informes de infracción. Para activalo require que se especifique un punto final. Os informes de infraccións envíanse a este punto final independentemente de se CSP se aplica ou non (usando o modo de só informes se non se aplica CSP). Para obter máis información, consulte a documentación de informes.

Activando o punto final de 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.

A opción "Aplicar política de seguranza do contido" activa a política predeterminada de aplicación para o tipo de aplicación indicado. Ao activar esta opción cámbiase o comportamento das aplicacións neste ambiente para que cumpran coa política. Polo tanto, o fluxo de activación suxerido sería:

  1. Aplicar nun ambiente de desenvolvemento/proba.
  2. Activar o modo de só informes en produción.
  3. Aplicar en produción unha vez que non se informe de infraccións.

Configurar directivas

Esta sección permítelle controlar directivas individuais dentro da política. Actualmente, só se pode personalizar frame-ancestors.

Configura as directivas CSP

Se se deixa a directiva predeterminada activada, utilízase o valor predeterminado especificado na táboa mostrada anteriormente neste artigo. Ao desactivar a alternancia, os administradores poden especificar valores personalizados para a directiva e engadilos ao valor predeterminado. O exemplo seguinte establece valores personalizados para frame-ancestors. A directiva estableceríase como frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com neste exemplo, o que significa que a aplicación podería estar aloxada na mesma orixe, https://*.powerapps.com, https://www.foo.com e https://www.bar.com, pero non noutras orixes. Use o botón Engadir para engadir entradas á lista e a icona de eliminar para eliminalas.

Establecer directivas CSP personalizadas

Opcións de configuración habituais

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

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

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

  • A orixe da súa páxina de inicio de Outlook Web App
  • https://outlook.office.com
  • https://outlook.office365.com

Para inserir Power Apps en Power BI informes, engada 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

Vexamos un par de exemplos de configuración de CSP:

Exemplo 1

Exemplo CSP 1

No exemplo:

  • Os informes están desactivados.
  • A aplicación baseada en modelos está activada.
    • frame-ancestors está personalizado para https://www.foo.com e https://www.bar.com
  • A aplicación do lenzo está desactivada.

As cabeceiras efectivas serían:

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

Exemplo 2

Exemplo CSP 2

No exemplo:

  • Os informes están activados.
    • O extremo de creación está axustado en https://www.mysite.com/myreportingendpoint
  • 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.baz.com

Os valores CSP efectivos serían:

  • Aplicacións baseadas en modelos: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://www.mysite.com/myreportingendpoint;
  • 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.baz.com; report-uri https://www.mysite.com/myreportingendpoint;

Configuración de organización

Pódese configurar CSP sen usar a IU modificando directamente a seguinte configuración da organización:

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

  • ContentSecurityPolicyConfiguration controla o valor da parte dos antepasados ​​da trama (como se viu arriba, establécese en 'self' se ContentSecurityPolicyConfiguration non está definida). Esta configuración está representada por un obxecto JSON coa seguinte estrutura: { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Isto traduciríase en script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; 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 do lenzo mediante o mesmo proceso descrito en ContentSecurityPolicyConfiguration arriba.

  • ContentSecurityPolicyReportUri controla se se deben utilizar 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ón ao punto final especificado, utilizando 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.

Activación de CSP sen IU

Pasos:

  • 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).
  • Pegue e execute o seguinte script na consola.
  • Para activar CSP, pase a configuración predeterminada - enableFrameAncestors(["'self'"])
  • Como exemplo de habilitar outras orixes para incorporar 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!')
}

Desactivación de CSP sen IU

Pasos:

  • 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!')
}