Pravilnik za sigurnost sadržaja

Politika sigurnosti sadržaja (CSP) trenutno je podržana u aplikacijama vođenim modelima, canvasu i kodiranju. Ovaj članak objašnjava kako konfigurirati CSP za aplikacije vođene modelima i canvas aplikacije. Za code apps CSP, pogledajte dokumentaciju code apps. Administratori mogu kontrolirati hoće li se CSP zaglavlje poslati i, u određenoj mjeri, što sadrži. Postavke su na razini okruženja, što znači da se primjenjuju na sve aplikacije u okruženju kad se jednom uključe.

Napomena

Pravila o sigurnosti sadržaja primjenjuju se samo na okruženja koja koriste Dataverse.

Svaka komponenta vrijednosti CSP zaglavlja kontrolira imovinu koja se može preuzeti. Mozilla Developer Network (MDN) pruža detaljnije opise. Zadane vrijednosti su:

Direktiva Zadana vrijednost Prilagodljivo
skripta-src * 'unsafe-inline' 'unsafe-eval' blob: Ne
radnik-SRC 'self' blob: Ne
stil-src * 'unsafe-inline' blob: Ne
font-src * data: Ne
okvir-preci 'self' https://*.powerapps.com Da

Ova konfiguracija rezultira zadanim CSP-om od. 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;

Strogi način rada

Strogi CSP prekidač stvara CSP koji uglavnom ne uključuje wildcardove ili nesigurne direktive, poput .unsafe-inline Kada uključite Strogi CSP, prethodne direktive postaju sljedeće direktive detaljno opisane u ovom odjeljku. Oznaka <platform> znači da su domene platforme dostupne prema zahtjevima proizvoda. Domene u ovom odjeljku mogu se mijenjati tijekom vremena kako proizvod raste.

Direktiva Zadana vrijednost (utemeljena na modelu) Zadana vrijednost (platno) Prilagodljivo
skripta-src 'self' blob: <platform>' 'self' <platform>' Da
radnik-SRC 'self' blob: 'self' blob: Ne
stil-src 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Da
font-src 'self' data: <platform> 'self' data: <platform> Da
okvir-preci 'self' https://*.powerapps.com 'self' https://*.powerapps.com Da
img-src 'self' blob: data: <platform> 'self' data: <platform> Da
Povezivanje-SRC 'self' blob: data: wss: <platform> 'self' blob: <platform> Da
Okvir-SRC 'self' blob: <platform> 'self' <platform> Da
Baza-URI 'none' Nije primjenjivo Ne
Oblik-akcija <platform> Nije primjenjivo Da
Zadano-src 'self' 'self' Ne

Preduvjeti

Za aplikacije za angažman korisnika Dynamics 365 i druge aplikacije vođene modelima, CSP je dostupan samo u online okruženjima i u organizacijama s Dynamics 365 angažmanom korisnika (on-premises), verzija 9.1 ili novija verzija.

Konfiguracija CSP

CSP možete prebacivati i konfigurirati putem centra za Power Platform administratore. Važno je prvo omogućiti razvojno/testno okruženje jer bi omogućavanje CSP-a moglo početi blokirati scenarije ako se prekrši pravilo. Administrativni centar također podržava način rada samo na izvještavanju radi lakšeg povećanja produkcije.

Poduzmite ove korake za konfiguraciju CSP-a:

  1. Prijavite se u centar za administratore platforme Power Platform.
  2. U navigacijskom oknu odaberite Upravljanje. U oknu Upravljanje odaberite Okruženja.
  3. Na stranici Okruženja odaberite okruženje.
  4. Na naredbenoj traci odaberite Postavke.
  5. Proširite Proizvod, a zatim odaberite Privatnost + sigurnost.

Na sljedećoj slici prikazano je zadano stanje postavki:

Zadane postavke pravila o sigurnosti sadržaja.

izvještavanje.

Prekidač Omogući izvješćivanje kontrolira šalju li aplikacije stvorene prema modelu i aplikacije radnog područja izvješća o kršenju. Za omogućavanje, specificirajte krajnju točku. Aplikacija šalje izvještaje o kršenju na ovu krajnju točku bez obzira provodi li se CSP ili ne. Ako CSP nije provođen, aplikacija koristi način rada samo za izvještavanje. Dodatne informacije potražite u dokumentaciji o izvješćivanju.

Uključite prekidač za izvješćivanje.

Provedba

Nametanje CSP-a kontrolira se neovisno za aplikacije stvorene prema modelu i aplikacije od gotovih gradivnih elemenata kako bi se osigurala detaljna kontrola nad pravilima. Upotrijebite pivot prema modelu / gotovim gradivnim elementima za izmjenu željene vrste aplikacije.

Prekidač Nametni pravila sigurnosti sadržaja uključuje zadano pravilo za provedbu za određenu vrstu aplikacije. Uključivanje ovog prekidača mijenja ponašanje aplikacija u ovom okruženju kako bi se pridržavale pravila. Stoga slijedite ovaj predloženi tijek osnaživanja:

  1. Provodite pravila u razvojnom ili testnom okruženju.
  2. Omogući način rada samo za izvješća u proizvodnji.
  3. Provodite pravilo u produkciji kada se ne prijave prekršaji.

Konfiguriranje direktiva

Odjeljak Konfiguriranje direktiva omogućuje vam kontrolu pojedinačnih direktiva unutar pravila. Trenutno možete prilagoditi samo direktivu frame-ancestors .

Konfigurirajte CSP direktive.

Ako ostavite zadanu direktivu uključenu, koristite zadanu vrijednost navedenu u tablici. Ako isključite prekidač, možete odrediti prilagođene vrijednosti za direktivu i dodati ih na zadanu vrijednost. Sljedeći primjer postavlja prilagođene vrijednosti za frame-ancestors. Direktiva je postavljena na ovaj frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com primjer. Ova postavka znači da aplikacija može biti hostana u istom izvorištu, https://*.powerapps.com, https://www.foo.com, i , ali https://www.bar.comne i u drugim izvorima. Upotrijebite gumb Dodaj da biste dodali unose na popis, a ikonu Izbriši da biste ih uklonili.

Postavljanje prilagođenih CSP direktiva.

Uobičajene konfiguracije

Za Microsoft Teams integraciju koristeći Dynamics 365 app, dodajte sljedeće u frame-ancestors:

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

Za Dynamics 365 aplikaciju za Outlook, dodajte sljedeće u frame-ancestors:

  • Početna stranica vaše Outlook web aplikacije
  • https://outlook.office.com
  • https://outlook.office365.com

Za ugrađivanje Power Apps u Power BI izvještaje, dodajte sljedeće u frame-ancestors:

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

Važne stavke

Isključivanje zadane direktive i spremanje s praznim popisom potpuno isključuje direktivu i ne šalje je kao dio zaglavlja CSP odgovora.

Primjeri konfiguracije CSP-a

Evo nekoliko primjera CSP konfiguracija.

Primjer 1 – izvješćivanje isključeno

CSP primjer 1, modelom vođen

CSP primjer 1, canvas

U primjeru:

  • Izvješćivanje je isključeno.
  • Provedba prema modelu je omogućena.
    • frame-ancestors je prilagođen na https://www.contoso.com i https://www.fabrikam.com.
  • Provedba radnog područja je onemogućena.

Efektivni naslovi su:

  • Aplikacije stvorene prema modelu: 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;
  • Canvas aplikacije: CSP zaglavlje nije poslano.

Primjer 2 – uključeno izvješćivanje

CSP primjer 2, modelom vođen

CSP primjer 2, canvas

U primjeru:

  • Izvješćivanje je uključeno.
    • Krajnja točka izvješćivanja postavljena je na https://contoso.com/reporting-endpoint
  • Provedba prema modelu je omogućena.
    • frame-ancestors zadržava se kao zadana
  • Provedba radnog područja je onemogućena.
    • frame-ancestors prilagođen je https://www.contoso.com

Efektivne vrijednosti CSP-a su:

  • Aplikacije stvorene prema modelu: 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;
  • Aplikacije od gotovih gradivih elemenata: 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;

Izravna izmjena postavki tvrtke ili ustanove

CSP možete konfigurirati bez korištenja korisničkog sučelja izravnom izmjenom ovih postavki tvrtke ili ustanove:

  • IsContentSecurityPolicyEnabled kontrolira šalje li se zaglavlje Content-Security-Policy u aplikacijama stvorenim prema modelu.

  • ContentSecurityPolicyConfiguration kontrolira vrijednost dijela predaka okvira (kao što je ranije viđeno, postavlja se na 'self' ako ContentSecurityPolicyConfiguration nije postavljen). Definirajte ovu postavku korištenjem JSON objekta sa sljedećom strukturom – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Ova konfiguracija se prevodi u script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Iz MDN-a) Direktiva HTTP Content-Security-Policy (CSP) frame-ancestors navodi važeće nadređene elemente koji mogu ugraditi stranicu koristeći <frame>, <iframe>, <object>, <embed> ili <applet>.
  • IsContentSecurityPolicyEnabledForCanvas kontrolira šalje li se zaglavlje Content-Security-Policy u aplikacijama radnog područja.

  • ContentSecurityPolicyConfigurationForCanvas kontrolira pravila za platno koristeći isti postupak opisan u odjeljku ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri kontrolira treba li se koristiti izvješćivanje. Ovu postavku koriste aplikacije stvorene prema modelu i aplikacije od gotovih gradivnih elemenata. Valjani niz šalje izvješća o kršenju navedenoj krajnjoj točki, koristeći način rada samo za izvješćivanje ako IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas je isključen. Prazan niz onemogućuje izvješćivanje. Dodatne informacije potražite u dokumentaciji o izvješćivanju.

Konfiguriranje CSP-a bez korisničkog sučelja

Posebno za okruženja koja nisu u Power Platform admin centru, kao što su lokalne konfiguracije, administratori će možda htjeti konfigurirati CSP s pomoću skripti za izravnu izmjenu postavki.

Omogućivanje CSP-a bez korisničkog sučelja

Poduzmite ove korake da biste omogućili CSP bez korisničkog sučelja:

  • Otvorite razvojne alate preglednika dok koristite aplikaciju stvorenu prema modelu kao korisnik s povlasticama ažuriranja entiteta organizacije (Administrator sustava je dobra opcija).
  • Zalijepite i izvršite sljedeću skriptu u konzolu.
  • Da biste omogućili CSP, proslijedite zadanu konfiguraciju - enableFrameAncestors(["'self'"])
  • Kao primjer omogućavanja drugim izvorima da ugrade aplikaciju - 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!')
}

Onemogućite CSP bez korisničkog sučelja

Poduzmite ove korake da biste onemogućili CSP bez korisničkog sučelja:

  • Otvorite razvojne alate preglednika dok koristite aplikaciju stvorenu prema modelu kao korisnik s povlasticama ažuriranja entiteta organizacije (Administrator sustava je dobra opcija).
  • Zalijepite i izvršite sljedeću skriptu u konzolu.
  • Da biste onemogućili CSP, zalijepite u konzolu: 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!')
}