Share via


Säkerhetspolicy för innehåll

Säkerhetspolicy för innehåll (CSP) stöds för närvarande i modellbaserade och arbetsyta Power Apps. Administratörer kan styra om CSP-rubriken skickas och, i viss utsträckning, vad det innehåller. Inställningarna finns på miljönivån, vilket innebär att den tillämpas på alla program i miljön när den har aktiverats.

Varje komponent i det här CSP-rubrikvärdet styr vilka tillgångar som kan hämtas och beskrivs mer i detalj i Mozilla Developer Network (MDN). Standardvärdena är följande:

Direktiv Default value Anpassningsbart
script-src * 'unsafe-inline' 'unsafe-eval' Nej
worker-src 'self' blob: Nej
style-src * 'unsafe-inline' Nej
font-src * data: Nej
frame-ancestors 'self' https://*.powerapps.com Ja

Detta resulterar i en standard CSP för script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;. I vårt meddelande finns möjlighet att ändra för närvarande icke-anpassningsbara huvuden.

Förutsättningar

  • För Dynamics 365 Customer Engagement-appar och andra modellbaserade appar är CSP endast tillgängligt i onlinemiljöer Dynamics 365 Customer Engagement (on-premises) och i organisationer med version 9.1 eller senare.

Konfigurera molnlösningsleverantör

CSP kan växlas och konfigureras via Power Platform administrationscenter. Det är viktigt att aktivera på en utvecklings-/testmiljö först eftersom aktivering av CSP kan börja blockera scenarier om policyn bryts. Vi stödjer också ett "endast rapportläge" för att möjliggöra enklare upptrappning av produktionen.

Om du vill konfigurera CSP navigerar du till Power Platform administrationscentret ->Miljöer ->Inställningar ->Sekretess + Säkerhet. I följande bild visas standardinställningarnas status:

Standardinställningar för innehållssäkerhetspolicy

Rapportering

Växlingen Aktivera rapportering styr om modellbaserade program och arbetsyteappar ska skicka rapporter om kränkningar. För att aktivera det krävs att en slutpunkt anges. Felrapporter skickas till denna slutpunkt oavsett om CSP är framtvingat eller inte (med rapportskyddat läge om CSP inte tillämpas). Mer information finns i rapporteringsdokumentationen.

Aktivera rapporteringsslutpunkt

Tillämpning

Upprätthållandet av CSP styrs oberoende av modellbaserade program och arbetsyteappar för att ge detaljerad kontroll över principer. Använd den modellbaserad/arbetsyta pivot om du vill ändra den avsedda apptypen.

Växlingen "säkerhetspolicy för innehåll" aktiverar standardprincipen för tvingande för den angivna apptypen. Om du aktiverar den här växlingen ändras apparna i den här miljön så att de följer policyn. Därför skulle det föreslagna aktiveringsflödet vara:

  1. Framtvinga för en utvecklings-/testmiljö.
  2. Aktivera endast rapportläge i produktion.
  3. Framtvinga produktionsfel när inga kränkningar har anmälts.

Konfigurera direktiv

Det sista avsnittet är "Konfigurera direktiv". I det här avsnittet kan du kontrollera enskilda personers rättigheter enligt policyn. För tillfället går det bara att anpassa frame-ancestors.

Konfigurera CSP-direktiv

Standardvärdet som anges i tabellen som visas tidigare i den här artikeln används i standard direktivet. Om du stänger av låsknappen kan administratörer ange anpassade värden för direktivet och lägga till dem i standardvärdet. I exemplet nedan anges anpassade värden för frame-ancestors. Direktivet skulle anges till frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com i det här exemplet, vilket betyder att appen kan vara värd i samma ursprung https://*.powerapps.com, https://www.foo.com och https://www.bar.com men inte i andra ursprung. Använd knappen Lägg till om du vill lägga till poster i listan och ta bort ikonen för att ta bort dem.

Ställa in anpassade CSP-direktiv

Vanliga konfigurationer

För Microsoft Teams integrering med appen Dynamics 365 lägger du till följande till frame-ancestors:

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

För Dynamics 365 App for Outlook du måste lägga till startsida för Outlook Web App frame-ancestors.

För inbäddning Power Apps i Power BI-rapporter lägger du till följande i frame-ancestors:

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

Viktigt!

Stänger av standarddirektivet och sparar med en tom lista stänger av direktivet helt och skickar det inte som en del av CSP-svarsrubriken.

Exempel

Här följer några exempel på konfiguration med CSP:

Exempel 1

CSP exempel 1

I exemplet ovan:

  • Rapporteringen är inaktiverad.
  • Modellbaserad tvingande åtgärder har aktiverats.
    • frame-ancestors har anpassats till https://www.foo.com och https://www.bar.com
  • Tvingande arbetsyta är inaktiverad.

De effektiva rubrikerna är:

  • Modellbaserade appar: 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;
  • Arbetsyteappar: CSP-rubrik skulle inte skickas.

Exempel 2

CSP exempel 2

I exemplet ovan:

  • Rapporteringen är aktiverad.
    • Rapporteringsslutpunkt anges till https://www.mysite.com/myreportingendpoint
  • Modellbaserad tvingande åtgärder har aktiverats.
    • frame-ancestors sparas som standard
  • Tvingande arbetsyta är inaktiverad.
    • frame-ancestors har anpassats till https://www.baz.com

De effektiva CSP-värdena skulle vara:

  • Modellbaserade appar: 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;
  • Arbetsyteappar: 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;

Organisationsinställningar

CSP kan konfigureras utan att använda användargränssnittet genom att ändra följande organisationsinställningar direkt:

  • IsContentSecurityPolicyEnabled styr om rubriken säkerhetspolicy för innehåll skickas i modellbaserade program.

  • ContentSecurityPolicyConfiguration styr värdet på frame-ancestors-delen (som ses ovan är den inställd på 'self' om ContentSecurityPolicyConfiguration inte anges). Den här inställningen representeras av ett JSON-objekt med följande struktur –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Detta skulle leda tillscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Från MDN) Direktivet HTTP säkerhetspolicy för innehåll (CSP) frame-ancestors specificerar giltiga föräldrar som kan bädda in en sida med <frame>, <iframe>, <object>, <embed> eller <applet>.
  • IsContentSecurityPolicyEnabledForCanvas styr om rubriken säkerhetspolicy för innehåll skickas i arbetsyteappar.

  • ContentSecurityPolicyConfigurationForCanvas kontrollerar policyn för användningen med samma process som beskrivs i ContentSecurityPolicyConfiguration ovan.

  • ContentSecurityPolicyReportUri kontrollerar om rapportering ska användas. Den här inställningen används både av modellbaserade och arbetsyteappar. En giltig sträng skickar rapporter om kränkningar till den angivna slutpunkt med rapportläge om IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas är inaktiverat. En tom sträng inaktiverar rapportering. Mer information finns i rapporteringsdokumentationen.

Konfigurera CSP utan UI

Särskilt för miljöer som inte finns i Power Platform administrationscenter, till exempel lokal konfigurationer, kanske administratörer vill konfigurera CSP med hjälp av skript för att direkt ändra inställningar.

Aktivera CSP utan användargränssnitt

Steg:

  • Öppna webbläsarutvecklingsverktyg medan du använder den modelldrivna programmet som användare med uppdateringsprivilegier för organisationsenhet (systemadministratör är ett bra alternativ).
  • Klistra in och kör skriptet nedan i konsolen.
  • Om du bara vill aktivera CSP skickar du standardkonfigurationen – enableFrameAncestors(["'self'"])
  • Som ett exempel på att aktivera ytterligare ursprung för att infoga programmet – 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!')
}

Inaktivera CSP utan användargränssnitt

Steg:

  • Öppna webbläsarutvecklingsverktyg medan du använder den modelldrivna programmet som användare med uppdateringsprivilegier för organisationsenhet (systemadministratör är ett bra alternativ).
  • Klistra in och kör skriptet nedan i konsolen.
  • Om du vill inaktivera molnlösningsleverantör klistrar du in i konsolen: 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!')
}