Del via


Sikkerhetspolicy for innhold

sikkerhetspolicy for innhold (CSP) støttes for øyeblikket i modelldrevet og lerret 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 vil bli brukt på alle apper i miljøet når de 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
skript-src * 'unsafe-inline' 'unsafe-eval' Nei
arbeider-src 'self' blob: Nei
stil-src * 'unsafe-inline' Nei
font-src * data: Nei
ramme-forfedre '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 nettbaserte miljøer og i organisasjoner med Dynamics 365 Customer Engagement (lokal), versjon 9.1 eller nyere versjon.

Konfigurere CSP

CSP kan byttes mellom og konfigureres via administrasjonssenteret for Power Platform. Det er viktig å aktivere i et utviklings-/testmiljø først , siden aktivering av CSP kan begynne å blokkere scenarioer hvis policyen brytes. 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.

Konfigurer 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://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

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

Eksempel 1

CSP-eksempel 1

I eksemplet:

  • Rapportering er deaktivert.
  • Modelldrevet håndhevelse er aktivert.
    • frame-ancestors er tilpasset 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:

  • 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 er tilpasset 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 kontrollerer om Content-Security-Policy-hodet sendes i modelldrevne apper.

  • ContentSecurityPolicyConfiguration kontrollerer verdien for frame-ancestors-delen (som vist ovenfor, den er satt til 'self' hvis ContentSecurityPolicyConfiguration er ikke 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 kontrollerer om Content-Security-Policy-hodet sendes i lerretsapper.

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

  • ContentSecurityPolicyReportUri kontrollerer 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å hvordan du aktiverer andre opprinnelser 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 følgende skript 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!')
}