Share via


Sikkerhetspolicy for innhold

Content Security Policy (CSP) støttes for øyeblikket i modelldrevet og lerrets-Power Apps. Administratorer kan kontrollere om CSP-hodet sendes og, i en viss utstrekning, hva det inneholder. Innstillingene er på miljønivå, noe som betyr at de brukes på alle apper i miljøet når den er slått på.

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' Nei
worker-src 'self' blob: Nei
style-src * 'unsafe-inline' Nei
font-src * data: Nei
frame-ancestors 'self' https://*.powerapps.com Ja

Dette fører til en standard CSP på script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;. Vi har muligheten til å endre hoder som for øyeblikket ikke kan tilpasses, i veikartet vårt.

Forutsetning

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

Konfigurere CSP

CSP kan byttes mellom og konfigureres via administrasjonssenteret for Power Platform. Det er viktig at du aktiverer i et dev/test-miljø først, siden aktivering av CSP kan begynne å blokkere scenarioer hvis policyen ikke overholdes. Vi støtter også en "bare rapportmodus" for å muliggjøre enklere opptrapping i produksjonsmiljøet.

Hvis du vil konfigurere CSP, går du til Power Platform-administrasjonssenteret ->Miljøer ->Innstillinger ->Personvern + Sikkerhet. Bildet nedenfor viser standardtilstanden for innstillingene:

Standardinnstillinger for sikkerhetspolicy for innhold

Rapporterer

Aktiver rapportering styrer om modelldrevne apper og lerretsapper sender bruddrapporter. Aktivering av den krever at endepunkt må angis. 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.

Aktivere rapporteringsendepunkt

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.

Veksleknappen Håndhev sikkerhetspolicy for innhold aktiverer standardpolicyen for håndhevelse for den gitte 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.

Konfigurere direktiver

Den siste delen er "Konfigurere direktiver". I denne delen kan du styre individuelle direktiver innenfor policyen. For øyeblikket kan frame-ancestors bare tilpasses.

Konfigurere CSP-direktiver

Hvis du lar standarddirektivet være aktivert, brukes standardverdien angitt i tabellen vist tidligere i denne artikkelen. 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 til å legge til oppføringer i listen og sletteikonet 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://msteamstabintegration.dynamics.com/

For Dynamics 365 App for Outlook må du legge til opprinnelsen for startsiden for Outlook Web App i frame-ancestors.

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

  • https://app.powerbi.com
  • https://msi-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

La oss se på et par eksempler på CSP-konfigurasjon:

Eksempel 1

CSP-eksempel 1

I eksemplet over:

  • 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'; worker-src 'self' blob:; 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

CSP-eksempel 2

I eksemplet over:

  • 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'; worker-src 'self' blob:; 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;

Organisasjonsinnstillinger

CSP kan konfigureres uten å bruke brukergrensesnittet ved å endre følgende organisasjonsinnstillinger direkte:

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

  • ContentSecurityPolicyConfiguration styrer verdien til delen for frame-ancestors (som vist ovenfor, er den satt til 'self' hvis ContentSecurityPolicyConfiguration ikke er angitt). Denne innstillingen representeres av et JSON-objekt med følgende struktur –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Dette kan 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 styrer om policy for lerreter bruker de samme prosessene som beskrevet i ContentSecurityPolicyConfiguration over.

  • 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

Trinn:

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

Deaktivere CSP uten brukergrensesnitt

Trinn:

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