Politică de securitate a conținutului

Politica de Securitate a Conținutului (CSP) este în prezent suportată în aplicațiile bazate pe modele, canvas și cod. Acest articol explică cum să configurezi CSP pentru aplicații bazate pe modele și canvas. Pentru aplicații de cod CSP, consultați documentația aplicațiilor de cod. Administratorii pot controla dacă antetul CSP este trimis și, într-o anumită măsură, ce conține. Setările sunt la nivel de mediu, ceea ce înseamnă că se aplică tuturor aplicațiilor din mediu odată ce sunt activate.

Notă

Politica de securitate a conținutului se aplică numai mediilor care utilizează Dataverse.

Fiecare componentă a valorii antetului CSP controlează activele care pot fi descărcate. Mozilla Developer Network (MDN) oferă descrieri mai detaliate. Valorile implicite sunt prezentate mai jos:

Directivă Valoare implicită Particularizabile
script-src * 'unsafe-inline' 'unsafe-eval' blob: Nu
sursă-lucrător 'self' blob: Nu
sursă-de-stil * 'unsafe-inline' blob: Nu
font-src * data: Nu
strămoși ai cadrului 'self' https://*.powerapps.com Da

Această configurație are ca rezultat un CSP implicit 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;.

Mod strict

Comutatorul Strict CSP creează un CSP care, în mare parte, nu include wildcard-uri sau directive nesigure, cum ar fi unsafe-inline. Când activezi Strict CSP, directivele anterioare devin următoarele directive detaliate în această secțiune. Notația <platform> înseamnă că domeniile platformei sunt furnizate conform cerințelor produsului. Domeniile din această secțiune se pot schimba în timp pe măsură ce produsul crește.

Directivă Valoare implicită (bazată pe model) Valoare implicită (pânză) Particularizabile
script-src 'self' blob: <platform>' 'self' <platform>' Da
sursă-lucrător 'self' blob: 'self' blob: Nu
sursă-de-stil 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Da
font-src 'self' data: <platform> 'self' data: <platform> Da
strămoși ai cadrului 'self' https://*.powerapps.com 'self' https://*.powerapps.com Da
img-src 'self' blob: data: <platform> 'self' data: <platform> Da
conectare-src 'self' blob: data: wss: <platform> 'self' blob: <platform> Da
cadru-src 'self' blob: <platform> 'self' <platform> Da
baza-uri 'none' Indisponibil Nu
forma-acțiune <platform> Indisponibil Da
implicit-src 'self' 'self' Nu

Cerințe preliminare

Pentru aplicațiile de implicare a clienților Dynamics 365 și alte aplicații bazate pe modele, CSP este disponibil doar în medii online și în organizații cu Dynamics 365 customer engagement (on-premises), versiunea 9.1 sau versiune ulterioară.

Configurați CSP

Puteți comuta și configura CSP prin intermediul centrului de administrare. Power Platform Este important să activați mai întâi un mediu de dezvoltare/testare, deoarece activarea CSP ar putea bloca scenarii dacă politica este încălcată. Centrul de administrare suportă, de asemenea, un mod doar cu raport pentru a permite o creștere mai ușoară a producției.

Urmează acești pași pentru a configura CSP:

  1. Conectați-vă la Centrul de administrare Power Platform.
  2. În panoul de navigare, selectați Gestionare. În panoul Gestionare , selectați Medii.
  3. Pe pagina Medii , selectați un mediu.
  4. În bara de comenzi, selectați Setări.
  5. Extindeți Produs, apoi selectați Confidențialitate + Securitate.

Următoarea imagine prezintă starea implicită a setărilor:

Setările implicite ale politicii de securitate a conținutului.

Raportare

Comutatorul *Activare raportare* controlează dacă aplicațiile bazate pe model și cele de tip pânză trimit rapoarte de încălcare. Pentru a-l activa, specifică un punct final. Aplicația trimite rapoarte de încălcare către acest endpoint, indiferent dacă CSP este aplicat sau nu. Dacă CSP nu este aplicat, aplicația folosește modul doar raport. Pentru mai multe informaţii, consultaţi documentația de raportare.

Activați comutatorul de raportare.

Impunere

Punerea în aplicare a CSP este controlată independent pentru aplicațiile bazate pe model și pentru aplicațiile create pe planșă, pentru a oferi control granular asupra politicilor. Utilizați pivotul bazat pe model/planșă pentru a modifica tipul de aplicație dorit.

Comutatorul Impune politica de securitate a conținutului activează politica implicită pentru aplicare pentru tipul de aplicație dat. Activarea acestei opțiuni modifică comportamentul aplicațiilor din acest mediu pentru a respecta politica. Prin urmare, urmează acest flux sugerat de activare:

  1. Aplică politica într-un mediu de dezvoltare sau testare.
  2. Activați modul numai pentru rapoarte în producție.
  3. Aplică politica în producție imediat ce nu sunt raportate încălcări.

Configurare directive

Secțiunea Configurare directive vă permite să controlați directivele individuale din cadrul politicii. În prezent, poți personaliza doar directiva frame-ancestors .

Configurați directivele CSP.

Dacă lași directiva implicită activată, folosești valoarea implicită specificată în tabel. Dacă dezactivezi comutatorul, poți specifica valori personalizate pentru directiva și să le adaugi la valoarea implicită. Următorul exemplu stabilește valori personalizate pentru frame-ancestors. Directiva este setată pe frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com în acest exemplu. Această setare înseamnă că aplicația poate fi găzduită în aceeași origine, https://*.powerapps.com, https://www.foo.com, și https://www.bar.com, dar nu și în alte origini. Folosiți butonul Adăugare pentru a adăuga intrări în listă și pictograma Ștergere pentru a le elimina.

Setarea directivelor CSP personalizate.

Configurații comune

Pentru integrarea Microsoft Teams folosind aplicația Dynamics 365, adăugați următoarele la frame-ancestors:

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

Pentru aplicația Dynamics 365 pentru Outlook, adăugați următoarele la frame-ancestors:

  • Originea paginii principale a aplicației web Outlook
  • https://outlook.office.com
  • https://outlook.office365.com

Pentru integrarea Power Apps în rapoartele Power BI, adăugați următoarele la frame-ancestors:

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

Considerații importante

Dezactivarea directivei implicite și salvarea cu o listă goală dezactivează complet directiva și nu o trimite ca parte a antetului de răspuns CSP.

Exemple de configurare CSP

Iată câteva exemple de configurații CSP.

Exemplul 1 - raportarea este dezactivată

Exemplul 1 CSP, condus de model

Exemplul CSP 1, pânză

În exemplu:

  • Raportarea este dezactivată.
  • Aplicarea bazată pe model este activată.
    • frame-ancestors este personalizat pentru https://www.contoso.com și https://www.fabrikam.com.
  • Aplicarea planșei este dezactivată.

Anteturile eficiente sunt:

  • Aplicații proiectate pe bază de model: 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;
  • Aplicații Canvas: antetul CSP nu este trimis.

Exemplul 2 - raportarea este activată

Exemplul CSP 2, condus de model

Exemplul CSP 2, pânză

În exemplu:

  • Raportarea este activată.
    • Punctul final de raportare este setat la https://contoso.com/reporting-endpoint
  • Aplicarea bazată pe model este activată.
    • frame-ancestors este păstrat ca implicit
  • Aplicarea planșei este dezactivată.
    • frame-ancestors este personalizat pentru https://www.contoso.com

Valorile CSP efective sunt:

  • Aplicații proiectate pe bază de model: 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;
  • Aplicații create pe planșă: 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;

Modificați direct setările organizației

Puteți configura CSP fără a utiliza interfața cu utilizatorul, modificând direct aceste setări ale organizației:

  • IsContentSecurityPolicyEnabled controlează dacă antetul Content-Security-Policy este trimis în aplicațiile bazate pe model.

  • ContentSecurityPolicyConfiguration controlează valoarea porțiunii frame-ancestors (așa cum s-a văzut mai devreme, se setează la 'self' dacă ContentSecurityPolicyConfiguration nu este setat). Definiți această setare folosind un obiect JSON cu următoarea structură – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Această configurație se traduce prin script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (De la MDN) Directiva HTTP Content-Security-Policy (CSP) frame-ancestors specifică părinții valizi care pot încorpora o pagină folosind <frame>, <iframe>, <object>, <embed>, sau <applet>.
  • IsContentSecurityPolicyEnabledForCanvas controlează dacă antetul Content-Security-Policy este trimis în aplicațiile canvas.

  • ContentSecurityPolicyConfigurationForCanvas controlează politica pentru canvas folosind același proces descris în ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri controlează dacă raportarea ar trebui utilizată. Această setare este utilizată atât de aplicațiile bazate pe model, cât și de aplicațiile create pe planșă. Un șir valid trimite rapoarte de încălcare către endpoint-ul specificat, utilizând modul doar raportare dacă IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas este dezactivat. Un șir gol dezactivează raportarea. Pentru mai multe informaţii, consultaţi documentația de raportare.

Configurarea CSP fără interfața de utilizare

În special pentru mediile care nu se află în centrul de administrare Power Platform, cum ar fi configurațiile locale, este posibil ca administratorii să dorească să configureze CSP folosind scripturi pentru a modifica direct setările.

Activează CSP fără interfață utilizator

Urmați acești pași pentru a activa CSP fără interfață utilizator:

  • Deschideți instrumentele de dezvoltare din browser în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administrator de sistem este o opțiune bună).
  • Lipiți și executați următorul script în consolă.
  • Pentru a activa CSP, transmiteți configurația implicită - enableFrameAncestors(["'self'"])
  • Ca exemplu de permitere a încorporării aplicației de către alte origini - 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!')
}

Dezactivați CSP fără interfață utilizator

Urmați acești pași pentru a dezactiva CSP fără interfață utilizator:

  • Deschideți instrumentele de dezvoltare din browser în timp ce utilizați aplicația bazată pe model ca utilizator cu privilegii de actualizare a entității organizației (Administrator de sistem este o opțiune bună).
  • Lipiți și executați următorul script în consolă.
  • Pentru a dezactiva CSP, inserați în consolă: 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!')
}