Del via


Sikkerhetspolicy for innhold

Innholdssikkerhetspolicy (CSP) støttes for øyeblikket i modelldrevne apper og lerretsapper. Administratorer kan kontrollere om CSP-hodet sendes og, i en viss utstrekning, hva det inneholder. Innstillingene er på miljønivå, noe som betyr at det brukes på alle apper i miljøet når de er aktivert.

Notat

Sikkerhetspolicyen for innhold gjelder bare for miljøer som bruker Dataverse.

Hver komponent i CSP-hodeverdien styrer ressursene som kan lastes ned, og er beskrevet mer detaljert i Mozilla Developer Network (MDN): Standardverdiene vises nedenfor:

Direktiv Standardverdi Kan tilpasses
script-src * 'unsafe-inline' 'unsafe-eval' blob: data: Nei
worker-src 'self' blob: data: Nei
style-src * 'unsafe-inline' Nei
font-src * data: Nei
frame-ancestors 'self' https://*.powerapps.com Ja

Denne konfigurasjonen resulterer i en standard CSP for script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Streng modus

Veksleknappen Streng CSP oppretter en policy for innholdssikkerhet som for det meste ikke inneholder jokertegn eller usikre direktiver, for eksempel unsafe-inline. Når streng CSP er aktivert, blir direktivene som er beskrevet i den forrige tabellen, til direktivene som er beskrevet i tabellen nedenfor. Notasjonen <platform> betyr at plattformdomener leveres etter behov av produktet. Domenene i denne delen kan endres over tid etter hvert som produktet vokser.

Notat

Streng CSP er for øyeblikket bare tilgjengelig for modelldrevne apper.

Direktiv Standardverdi (modelldrevet) Kan tilpasses
script-src 'self' blob: data: <platform>' Ja
worker-src 'self' blob: data: Nei
style-src 'self' 'unsafe-inline' <platform> Ja
font-src 'self' data: <platform> Ja
frame-ancestors 'self' https://*.powerapps.com Ja
img-src 'self' blob: data: <platform> Ja
connect-src 'self' blob: data: wss: <platform> Ja
ramme-src 'self' blob: <platform> Ja
base-uri 'none' Nei
skjemahandling <platform> Ja
standard-src 'self' Nei

Forutsetning

For Dynamics 365-Customer Engagement-apper og andre modelldrevne apper er CSP bare tilgjengelig i nettbaserte miljøer og organisasjoner med Dynamics 365 Customer Engagement (on-premises), versjon 9.1 eller nyere versjon.

Konfigurer CSP

Du kan veksle og konfigurere CSP via administrasjonssenteret Power Platform . Det er viktig å aktivere et utviklings-/testmiljø først , siden aktivering av CSP kan begynne å blokkere scenarier hvis policyen brytes. Vi støtter også en rapportmodus for å tillate enklere opptrapping i produksjonen.

Slik konfigurerer du CSP:

  1. Logg på Power Platform-administrasjonssenteret.
  2. I navigasjonsruten velger du Behandle, og deretter velger du Miljøer i Behandle-ruten .
  3. Velg et miljø på Miljøer-siden .
  4. Velg Innstillinger på kommandolinjen.
  5. Utvid Produkt, og velg deretter Personvern + sikkerhet.

Bildet nedenfor viser standardtilstanden for innstillingene:

Standardinnstillinger for sikkerhetspolicy for innhold.

Rapporterer

Veksleknappen Aktiver rapportering kontrollerer om modelldrevne apper og lerretsapper sender bruddrapporter. Du må angi et endepunkt for å aktivere det. Bruddrapporter sendes til dette endepunktet uavhengig av om CSP håndheves eller ikke (ved bruk av bare rapportmodus hvis CSP ikke håndheves). Hvis du vil ha mer informasjon, kan du se rapportdokumentasjon.

Aktiver rapporteringsbryteren til på.

Håndhevelse

Håndhevelse av CSP styres uavhengig av modelldrevne apper og lerretsapper for å gi detaljert kontroll over policyene. Bruk den modelldrevne/lerretspivoten til å endre den tiltenkte apptypen.

Aktiver policy for innholdssikkerhet aktiverer standardpolicyen for håndhevelse av innholdssikkerhet for den angitte apptypen. Hvis du aktiverer denne veksleknappen, endres funksjonaliteten til apper i dette miljøet slik at de overholder policyen. Den foreslåtte aktiveringsflyten vil derfor være følgende:

  1. Bruk på et dev/test-miljø.
  2. Aktiver modus for bare rapport i produksjon.
  3. Bruk i produksjon straks ingen brudd er rapportert.

Konfigurer direktiver

Med delen Konfigurer direktiver kan du kontrollere individuelle direktiver i policyen. For øyeblikket kan frame-ancestors bare tilpasses.

Konfigurer CSP-direktiver.

Hvis du lar standarddirektivet være aktivert, brukes standardverdien som er angitt i tabellen. Hvis du deaktiverer veksleknappen, kan administratorer angi egendefinerte verdier for direktivet og legge dem til i standardverdien. Eksemplet nedenfor angir egendefinerte verdier for frame-ancestors. I dette eksemplet hadde frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com blitt angitt for direktivet, som betyr at appen kunne ha blitt driftet i samme opprinnelse, https://*.powerapps.com, https://www.foo.com og https://www.bar.com, men ikke i andre opprinnelser. Bruk Legg til-knappen for å legge til oppføringer i listen og Slett-ikonet for å fjerne dem.

Angi egendefinerte CSP-direktiver.

Vanlige konfigurasjoner

For Microsoft Teams-integrering som bruker Dynamics 365-appen legg til følgende i frame-ancestors:

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

Legg til følgende i frame-ancestors for Dynamics 365 App for Outlook:

  • Opprinnelsen til startsiden for Outlook Web App
  • https://outlook.office.com
  • https://outlook.office365.com

Hvis du vil bygge inn Power Apps i Power BI-rapporter, legger du til følgende i frame-ancestors:

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

Viktige hensyn

Hvis du deaktiverer standarddirektivet og lagrer med en tom liste, deaktiveres direktivet fullstendig, og det sendes ikke som en del av CSP-svarhodet.

Eksempler på CSP-konfigurasjon

La oss ta en titt på et par eksempler på CSP-konfigurasjoner.

Eksempel 1 – rapportering deaktivert

CSP-eksempel 1.

Se på eksemplet:

  • Rapportering er deaktivert.
  • Modelldrevet håndhevelse er aktivert.
    • frame-ancestors tilpasses til https://www.foo.com og https://www.bar.com
  • Lerretshåndheving er deaktivert.

De effektive overskriftene vil være følgende:

  • Modelldrevne apper: 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.foo.com https://www.bar.com;
  • Lerretsapper: CSP-overskrift ville ikke bli sendt.

Eksempel 2 – rapportering slått på

CSP-eksempel 2.

Se på eksemplet:

  • Rapportering er aktivert.
    • Endepunkt for rapportering er satt til https://www.mysite.com/myreportingendpoint
  • Modelldrevet håndhevelse er aktivert.
    • frame-ancestors beholdes som standard
  • Lerretshåndheving er deaktivert.
    • frame-ancestors tilpasses til https://www.baz.com

De effektive CSP-verdiene vil være følgende:

  • Modelldrevne apper: 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 'self' https://*.powerapps.com; report-uri https://www.mysite.com/myreportingendpoint;
  • Lerretsapper: 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;

Endre organisasjonsinnstillinger direkte

Du kan konfigurere CSP uten å bruke brukergrensesnittet ved å endre disse organisasjonsinnstillingene direkte:

  • IsContentSecurityPolicyEnabled styrer om hodet for innholdssikkerhetspolicy sendes i modelldrevne apper.

  • ContentSecurityPolicyConfiguration kontrollerer verdien for frame-ancestors-delen (som vist ovenfor, den settes til 'self' if ContentSecurityPolicyConfiguration er ikke angitt). Denne innstillingen defineres ved hjelp av et JSON-objekt med følgende struktur – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Denne konfigurasjonen oversettes til script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Fra MDN) Rammedirektivene for HTTP-innholdssikkerhetspolitikk angir gyldige overordnede som kan bygge inn en side ved hjelp <frame>, <iframe>, <object>, <embed> eller <applet>.
  • IsContentSecurityPolicyEnabledForCanvas styrer om hodet for innholdssikkerhetspolicy sendes i lerretsapper.

  • ContentSecurityPolicyConfigurationForCanvas kontrollerer policyen for lerret ved hjelp av samme prosess som er beskrevet i ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri styrer om rapportering skal brukes. Denne innstillingen brukes av både modelldrevne apper og lerretsapper. En gyldig streng sender bruddrapporter til det angitte endepunkt ved hjelp av modus for bare rapporter hvis IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas er deaktivert. En tom streng deaktiverer rapportering. Hvis du vil ha mer informasjon, kan du se rapportdokumentasjon.

Konfigurere CSP uten grensesnitt

Spesielt for miljøer som ikke er i Power Platform-administrasjonssenteret, for eksempel lokale konfigurasjoner, kan administratorer ønske å konfigurere CSP ved hjelp av skript for å endre innstillingene direkte.

Aktivere CSP uten brukergrensesnitt

Utfør disse trinnene for å aktivere CSP uten brukergrensesnitt:

  • Åpne nettleserutviklingsverktøy samtidig som du bruker den modelldrevne appen som en bruker med oppdateringsrettigheter for organisasjonsenheten (systemadministrator er et godt alternativ).
  • Lim inn og kjør skriptet nedenfor i konsollen.
  • Hvis du vil aktivere CSP, sender du standardkonfigurasjonen – enableFrameAncestors(["'self'"])
  • Som et eksempel på aktivering av ytterligere opprinnelse for å bygge inn appen – 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!')
}

Deaktiver CSP uten brukergrensesnitt

Følg disse trinnene for å deaktivere CSP uten brukergrensesnitt:

  • Åpne nettleserutviklingsverktøy samtidig som du bruker den modelldrevne appen som en bruker med oppdateringsrettigheter for organisasjonsenheten (systemadministrator er et godt alternativ).
  • Lim inn og kjør skriptet nedenfor i konsollen.
  • Hvis du vil deaktivere CSP, limer du inn i konsollen: 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!')
}