Varnostni pravilnik za vsebino

Politika varnosti vsebine (CSP) je trenutno podprta v modelno vodenih, canvas in programskih aplikacijah. Ta članek pojasnjuje, kako konfigurirati CSP za aplikacije, ki temeljijo na modelih, in canvas aplikacije. Za Code apps CSP si oglejte dokumentacijo Code Apps. Skrbniki lahko nadzorujejo, ali je glava CSP poslana in do neke mere, kaj vsebuje. Nastavitve so na ravni okolja, kar pomeni, da se po vklopu uporabijo za vse aplikacije v okolju.

opomba,

Pravilnik o varnosti vsebine velja samo za okolja, ki uporabljajo Dataverse.

Vsaka komponenta vrednosti glave CSP nadzoruje sredstva, ki jih je mogoče prenesti. Mozilla Developer Network (MDN) ponuja bolj podrobne opise. Privzete vrednosti so naslednje:

Direktiva Privzeta vrednost Prilagajanje je mogoče
izvor skripta * 'unsafe-inline' 'unsafe-eval' blob: Ne
vir delavca 'self' blob: Ne
izvor sloga * 'unsafe-inline' blob: Ne
vir-pisav * data: Ne
predniki okvirjev 'self' https://*.powerapps.com Da

Ta konfiguracija ima za posledico privzeti CSP 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

Preklopnik Strogo CSP ustvari CSP, ki večinoma ne vključuje wildcardov ali nevarnih direktiv, kot je unsafe-inline. Ko vklopite Strogi CSP, se predhodne direktive spremenijo v naslednje, podrobno opisane v tem razdelku. Zapis <platform> pomeni, da so domene platforme na voljo v skladu z zahtevami izdelka. Domene v tem razdelku se lahko s časom spreminjajo, ko izdelek raste.

Direktiva Privzeta vrednost (na podlagi modela) Privzeta vrednost (platno) Prilagajanje je mogoče
izvor skripta 'self' blob: <platform>' 'self' <platform>' Da
vir delavca 'self' blob: 'self' blob: Ne
izvor sloga 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Da
vir-pisav 'self' data: <platform> 'self' data: <platform> Da
predniki okvirjev 'self' https://*.powerapps.com 'self' https://*.powerapps.com Da
img-src 'self' blob: data: <platform> 'self' data: <platform> Da
Poveži-SRC 'self' blob: data: wss: <platform> 'self' blob: <platform> Da
Okvir-SRC 'self' blob: <platform> 'self' <platform> Da
bazni uri 'none' N/V Ne
Oblika-akcija <platform> N/V Da
privzeto-src 'self' 'self' Ne

Zahteve

Za aplikacije za angažiranost strank Dynamics 365 in druge aplikacije, ki temeljijo na modelih, je CSP na voljo le v spletnih okoljih in v organizacijah z Dynamics 365 za vključevanje strank (lokalno), različica 9.1 ali novejša.

Konfiguriranje protokola CSP

CSP lahko preklapljate in konfigurirate v skrbniškem središču. Power Platform Pomembno je, da najprej omogočite razvojno/testno okolje, saj lahko omogočanje CSP-ja začne blokirati scenarije, če je pravilnik kršen. Administrativni center podpira tudi način samo poročanja , kar omogoča lažje povečanje produkcije.

Naredite naslednje korake za konfiguracijo CSP:

  1. Vpišite se v skrbniško središče za Power Platform.
  2. V navigacijski plošči izberite Upravljanje. V podoknu Upravljanje izberite Okolja.
  3. Na strani Okolja izberite okolje.
  4. V ukazni vrstici izberite Nastavitve.
  5. Razširite Izdelek in nato izberite Zasebnost + varnost.

Naslednja slika prikazuje privzeto stanje nastavitev:

Privzete nastavitve pravilnika o varnosti vsebine.

Poročanje

Stikalo Omogoči poročanje nadzoruje, ali aplikacije, ki jih poganja model, in aplikacije s platnom pošiljajo poročila o kršitvah. Za omogočanje določite končno točko. Aplikacija pošilja poročila o kršitvah na to končno točko ne glede na to, ali je CSP izvršen ali ne. Če CSP ni uveljavljen, aplikacija uporablja način samo poročanja. Več informacij najdete v dokumentaciji za poročanje.

Vklopite poročanje.

Izvajanje

Uveljavljanje CSP je nadzorovano neodvisno za aplikacije, ki temeljijo na modelu, in aplikacije s platnom, da se zagotovi natančnejši nadzor nad pravilniki. Uporabite pivot na podlagi modela/platna, da spremenite predvideno vrsto aplikacije.

Preklop Uveljavi pravilnik o varnosti vsebine vklopi privzeti pravilnik za uveljavljanje za dano vrsto aplikacije. Če vklopite to stikalo, se vedenje aplikacij v tem okolju spremeni tako, da so v skladu s pravilnikom. Zato sledite temu predlaganemu postopku omogočanja:

  1. Uveljavite politiko v razvojnem ali testnem okolju.
  2. Omogoči način samo za poročilo v produkciji.
  3. Politiko uveljavite v produkciji, ko ni prijavljenih nobenih kršitev.

Konfiguriranje direktiv

V razdelku Konfiguracija direktiv lahko nadzirate posamezne direktive v pravilniku. Trenutno lahko prilagodite le direktivo frame-ancestors .

Konfigurirajte direktive CSP.

Če pustite privzeto direktivo vklopljeno, uporabite privzeto vrednost, določeno v tabeli. Če izklopite preklopnik, lahko določite prilagojene vrednosti za direktivo in jih dodate privzeti vrednosti. Naslednji primer določa prilagojene vrednosti za frame-ancestors. Direktiva je nastavljena na tem primeru frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com . Ta nastavitev pomeni, da je aplikacija lahko gostovana v istem izvoru, https://*.powerapps.com, https://www.foo.com, in https://www.bar.com, vendar ne v drugih izvorih. Za dodajanje vnosov na seznam uporabite gumb Dodaj , za odstranitev pa ikono Izbriši .

Nastavitev prilagojenih direktiv CSP.

Splošne konfiguracije

Za Microsoft Teams integracijo z uporabo aplikacije Dynamics 365 app dodajte naslednje v frame-ancestors:

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

Za Dynamics 365 App for Outlook dodajte naslednje na frame-ancestors:

  • Izvor domače strani vaše Outlook spletne aplikacije
  • https://outlook.office.com
  • https://outlook.office365.com

Za vgradnjo Power Apps v Power BI poročila dodajte naslednje v frame-ancestors:

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

Pomembni premisleki

Izklop privzete direktive in shranjevanje s praznim seznamom popolnoma izklopi direktivo in je ne pošlje kot del glave odgovora CSP.

Primeri konfiguracije CSP-ja

Tukaj je nekaj primerov konfiguracij CSP.

Primer 1 – poročanje izklopljeno

CSP primer 1, modelno vodeno

CSP primer 1, canvas

V primeru:

  • Poročanje je izklopljeno.
  • Uveljavljanje na podlagi modela je omogočeno.
    • frame-ancestors je prilagojen na https://www.contoso.com in https://www.fabrikam.com.
  • Uveljavljanje platna je onemogočeno.

Učinkovite glave so:

  • Aplikacije, ki temeljijo na 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 glava ni poslana.

Primer 2 – poročanje vklopljeno

CSP primer 2, modelno vodeno

CSP primer 2, canvas

V primeru:

  • Poročanje je vklopljeno.
    • Končna točka za poročila je nastavljena na https://contoso.com/reporting-endpoint
  • Uveljavljanje na podlagi modela je omogočeno.
    • frame-ancestors je ohranjeno kot privzeto
  • Uveljavljanje platna je onemogočeno.
    • frame-ancestors je prilagojeno https://www.contoso.com

Efektivne vrednosti CSP so:

  • Aplikacije, ki temeljijo na 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 s platnom: 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;

Neposredno spreminjanje nastavitev organizacije

CSP lahko konfigurirate brez uporabe uporabniškega vmesnika tako, da neposredno spremenite te nastavitve organizacije:

  • IsContentSecurityPolicyEnabled nadzoruje, ali se glava Content-Security-Policy pošlje v aplikacijah, ki jih poganja model.

  • ContentSecurityPolicyConfiguration nadzoruje vrednost dela prednikov okvirjev (kot je bilo že vidno, nastavi na , 'self' če ContentSecurityPolicyConfiguration ni nastavljen). To nastavitev definirajte z uporabo JSON objekta z naslednjo strukturo – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Ta konfiguracija se prevede v script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (iz MDN) Direktiva HTTP Content-Security-Policy (CSP) frame-ancestors določa veljavne nadrejene elemente, ki lahko vdelajo stran z <frame>, <iframe>, <object>, <embed> ali <applet>.
  • IsContentSecurityPolicyEnabledForCanvas nadzoruje, ali se glava Content-Security-Policy pošlje v aplikacijah platna.

  • ContentSecurityPolicyConfigurationForCanvas nadzoruje pravilnik za platno z uporabo istega postopka, kot je opisan v ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri nadzoruje, ali naj se uporablja poročanje. To nastavitev uporabljajo aplikacije, ki temeljijo na modelu, in aplikacije s platnom. Veljaven niz pošlje poročila o kršitvah navedeni končni točki z uporabo načina samo za poročanje, če je možnost IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas izklopljena. Prazen niz onemogoči poročanje. Več informacij najdete v dokumentaciji za poročanje.

Konfiguriranje CCSP brez UI-ja

Zlasti za okolja, ki niso v skrbniškem središču za Power Platform, kot so konfiguracije na mestu uporabe, lahko skrbniki konfigurirajo CSP s skripti za neposredno spremenitev nastavitev.

Omogoči CSP brez uporabniškega vmesnika

Če želite omogočiti CSP brez uporabniškega vmesnika, sledite tem korakom:

  • Odprite orodja za razvijalce brskalnika, medtem ko uporabljate aplikacijo, ki temelji na modelu, kot uporabnik s privilegiji za posodabljanje entitet organizacije (sistemski skrbnik je dobra možnost).
  • V konzolo prilepite in zaženite naslednji skript.
  • Če želite omogočiti CSP, podajte privzeto konfiguracijo - enableFrameAncestors(["'self'"])
  • Kot primer omogočanja vdelave aplikacije v druge izvore - 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!')
}

Onemogoči CSP brez uporabniškega vmesnika

Če želite onemogočiti CSP brez uporabniškega vmesnika, sledite tem korakom:

  • Odprite orodja za razvijalce brskalnika, medtem ko uporabljate aplikacijo, ki temelji na modelu, kot uporabnik s privilegiji za posodabljanje entitet organizacije (sistemski skrbnik je dobra možnost).
  • V konzolo prilepite in zaženite naslednji skript.
  • Če želite onemogočiti CSP, prilepite v konzolo: 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!')
}