Comparteix via


Norma de seguretat del contingut

Actualment, la Política de Seguretat de Continguts (CSP) és compatible amb aplicacions basades en models, canvas i codi. Aquest article explica com configurar CSP per a aplicacions basades en models i canvas. Per a aplicacions de codi CSP, consulta la documentació d'aplicacions de codi. Els administradors poden controlar si s'envia la capçalera CSP i, fins a cert punt, la informació que conté. La configuració és a nivell d'entorn, cosa que significa que s'apliquen a totes les aplicacions de l'entorn un cop activades.

Nota

La política de seguretat del contingut només s'aplica als entorns que utilitzen Dataverse.

Cada component del valor de capçalera del CSP controla els actius que es poden descarregar. La Mozilla Developer Network (MDN) proporciona descripcions més detallades. Els valors per defecte són els següents:

Directiva Valor per defecte Personalitzable
script-src * 'unsafe-inline' 'unsafe-eval' blob: No
treballador-src 'self' blob: No
estil-src * 'unsafe-inline' No
font-src * data: No
avantpassats del marc 'self' https://*.powerapps.com

Aquesta configuració dóna com a resultat un CSP per defecte de script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Mode estricte

El commutador Strict CSP crea un CSP que principalment no inclou comodins ni directrius insegures, com unsafe-inlineara . Quan actives el CSP estricte, les directrius anteriors esdevenen les següents directrius detallades en aquesta secció. La <platform> notació significa que els dominis de plataforma es proporcionen segons el producte requereix. Els dominis d'aquesta secció poden canviar amb el temps a mesura que el producte creix.

Directiva Valor per defecte (basat en models) Valor per defecte (llenç) Personalitzable
script-src 'self' blob: <platform>' 'self' <platform>'
treballador-src 'self' blob: 'self' blob: No
estil-src 'self' 'unsafe-inline' <platform> 'self' 'unsafe-inline' <platform>
font-src 'self' data: <platform> 'self' data: <platform>
avantpassats del marc 'self' https://*.powerapps.com 'self' https://*.powerapps.com
img-src 'self' blob: data: <platform> 'self' data: <platform>
connectar-src 'self' blob: data: wss: <platform> 'self' blob: <platform>
marc-src 'self' blob: <platform> 'self' <platform>
base-uri 'none' No disponible No
forma-acció <platform> No disponible
per defecte-src 'self' 'self' No

Requisits previs

Per a les aplicacions del Dynamics 365 Customer Engagement i altres aplicacions basades en models, el CSP només està disponible en entorns en línia i en organitzacions amb el Dynamics 365 Customer Engagement (on-premises), versió 9.1 o versió posterior.

Configureu CSP

Podeu alternar i configurar CSP a través del centre d'administració Power Platform . És important habilitar primer un entorn de desenvolupament/prova, ja que habilitar CSP podria començar a bloquejar escenaris si es infringeix la política. El centre d'administració també suporta un mode només amb informes per facilitar l'acceleració de la producció.

Fes aquests passos per configurar el CSP:

  1. Inicieu la sessió al Centre d'administració del Power Platform.
  2. A la subfinestra de navegació, seleccioneu Administra. A la subfinestra Administra , seleccioneu Entorns.
  3. A la pàgina Entorns , seleccioneu un entorn.
  4. A la barra d'ordres, seleccioneu Configuració.
  5. Expandiu Producte i, a continuació, seleccioneu Privadesa + Seguretat.

La imatge següent mostra l'estat predeterminat de la configuració:

Configuració predeterminada de la política de seguretat del contingut.

Informes

El commutador Activa els informes controla si les aplicacions basades en models i de llenç envien informes d'infracció. Per activar-ho, especifica un punt final. L'aplicació envia informes de violacions a aquest punt final, independentment de si el CSP s'aplica o no. Si el CSP no s'aplica, l'aplicació utilitza el mode només per informar. Per obtenir més informació, vegeu la documentació d'informes.

Activeu el commutador d'informes.

Aplicació

L'aplicació de CSP es controla de manera independent per a les aplicacions de llenç i basades en models per proporcionar un control granular sobre normes. Utilitzeu el pivot basat en model/llenç per modificar el tipus d'aplicació previst.

El commutador Aplica la norma de seguretat del contingut activa la norma predeterminada per a l'aplicació per al tipus d'aplicació determinat. Si activeu aquest commutador, canvia el comportament de les aplicacions d'aquest entorn per complir la política. Per tant, segueix aquest flux d'habilitació suggerit:

  1. Aplica la política en un entorn de desenvolupament o proves.
  2. Habiliteu el mode de només informe en producció.
  3. Fes complir la política en producció un cop no es denunciïn infraccions.

Configura les directives

La secció Configura directives us permet controlar directives individuals dins de la política. Actualment, només pots personalitzar la frame-ancestors directiva.

Configureu les directives CSP.

Si deixes la directiva per defecte activada, utilitzes el valor per defecte especificat a la taula. Si desactives el commutador, pots especificar valors personalitzats per a la directiva i afegir-los al valor per defecte. L'exemple següent estableix valors personalitzats per a frame-ancestors. La directiva s'estableix a frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com en aquest exemple. Aquesta configuració significa que l'aplicació pot allotjar-se en el mateix origen, https://*.powerapps.com, https://www.foo.com, i https://www.bar.com, però no en altres orígens. Utilitzeu el botó Afegeix per afegir entrades a la llista i la icona Suprimeix per eliminar-les.

Configuració de directives CSP personalitzades.

Configuracions comunes

Per a Microsoft Teams la integració mitjançant l'aplicació Dynamics 365, afegiu el següent a frame-ancestors:

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

Per a, Dynamics 365 App for Outlook afegiu el següent a frame-ancestors:

  • L'origen de la pàgina d'inici de l'Outlook Web App
  • https://outlook.office.com
  • https://outlook.office365.com

Per incrustar-lo Power Apps en Power BI informes, afegiu el següent a frame-ancestors:

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

Consideracions importants

Desactivar la directiva per defecte i desar amb una llista buida desactiva completament la directiva i no l'envia com a part de la capçalera de resposta de CSP.

Exemples de configuració de CSP

Aquí tens un parell d'exemples de configuracions CSP.

Exemple 1: informes desactivats

Exemple 1 de CSP, basat en models

Exemple CSP 1, llenç

A l'exemple:

  • Els informes estan desactivats.
  • L'aplicació basada en models està habilitada.
    • frame-ancestors es personalitza a https://www.contoso.com i https://www.fabrikam.com.
  • L'aplicació de llenç està inhabilitada.

Les capçaleres efectives són:

  • Aplicacions basades en models: 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.contoso.com https://www.fabrikam.com;
  • Aplicacions Canvas: la capçalera CSP no s'envia.

Exemple 2: informes activats

Exemple 2 de CSP, basat en models

Exemple CSP 2, llenç

A l'exemple:

  • Els informes estan activats.
    • L'extrem de creació d'informes està establert en https://contoso.com/reporting-endpoint
  • L'aplicació basada en models està habilitada.
    • frame-ancestors es manté per defecte
  • L'aplicació de llenç està inhabilitada.
    • frame-ancestors està personalitzat per https://www.contoso.com

Els valors efectius del CSP són:

  • Aplicacions basades en models: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://contoso.com/reporting-endpoint;
  • Aplicacions de llenç: 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 la configuració de l'organització directament

Podeu configurar CSP sense utilitzar la interfície d'usuari modificant directament aquesta configuració de l'organització:

  • IsContentSecurityPolicyEnabled controla si la capçalera Content-Security-Policy s'envia a les aplicacions basades en models.

  • ContentSecurityPolicyConfiguration controla el valor de la part dels ancestres del marc (com s'ha vist abans, s'estableix en 'self' si ContentSecurityPolicyConfiguration no està establert). Defineix aquest entorn utilitzant un objecte JSON amb la següent estructura – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Aquesta configuració es tradueix en script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (De MDN) La directiva HTTP Content-Security-Policy (CSP) frame-ancestors especifica els elements principals vàlids que es poden incrustar en una pàgina mitjançant <frame>, <iframe><object>, <embed> o <applet>.
  • IsContentSecurityPolicyEnabledForCanvas controla si la capçalera Content-Security-Policy s'envia a les aplicacions de llenç.

  • ContentSecurityPolicyConfigurationForCanvas controla la norma del llenç mitjançant el mateix procés descrit a ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri controla si s'han d'utilitzar els informes. Aquesta configuració s'utilitza tant a les aplicacions basades en models en les de llenç. Una cadena vàlida envia informes d'infracció al punt final especificat, utilitzant el mode només d'informe si IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas està desactivat. Una cadena buida inhabilita els informes. Per obtenir més informació, vegeu la documentació d'informes.

Configuració de CSP sense UI

Especialment per als entorns que no són al Centre d'administració del Power Platform, com ara configuracions locals, és possible que els administradors vulguin configurar CSP utilitzant scripts per modificar directament la configuració.

Habilita CSP sense interfície d'usuari

Seguiu aquests passos per habilitar CSP sense interfície d'usuari:

  • Obriu les eines de desenvolupament del navegador mentre utilitzeu l'aplicació basada en models com a usuari amb privilegis d'actualització d'entitats de l'organització (administrador del sistema és una bona opció).
  • Enganxeu i executeu el següent script a la consola.
  • Per habilitar CSP, passeu la configuració predeterminada: enableFrameAncestors(["'self'"])
  • Com a exemple de permetre que altres orígens incrustin l'aplicació: 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!')
}

Inhabilita CSP sense interfície d'usuari

Seguiu aquests passos per inhabilitar CSP sense interfície d'usuari:

  • Obriu les eines de desenvolupament del navegador mentre utilitzeu l'aplicació basada en models com a usuari amb privilegis d'actualització d'entitats de l'organització (administrador del sistema és una bona opció).
  • Enganxeu i executeu el següent script a la consola.
  • Per inhabilitar CSP, enganxeu-lo a la 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!')
}