Jaa


Sisällön suojauskäytäntö

Sisällön suojauskäytäntöä (CSP) tuetaan tällä hetkellä mallipohjaisissa sovelluksissa ja pohjaan perustuvissa sovelluksissa. Järjestelmänvalvojat voivat määrittää, lähetetäänkö CSP-otsikko ja – tiettyyn rajaan asti – mitä se sisältää. Asetukset ovat ympäristötasolla, mikä tarkoittaa, että se on otettu käyttöön kaikissa ympäristön sovelluksissa, kun se on otettu käyttöön.

Muistiinpano

Sisällön suojauskäytäntö koskee vain ympäristöjä, joissa käytetään Dataversea.

Jokainen CSP-otsikon arvon komponentti ohjaa resursseja, jotka voidaan ladata ja jotka on kuvattu tarkemmin Mozilla Developer Networkissa (MDN). Oletusarvot näkyvät alla:

Direktiivi Oletusarvo Mukautettavissa
script-src * 'unsafe-inline' 'unsafe-eval' blob: data: Ei
worker-src 'self' blob: data: Ei
style-src * 'unsafe-inline' Ei
font-src * data: Ei
frame-ancestors 'self' https://*.powerapps.com Kyllä

Tämä määritys johtaa oletusarvoiseen CSP:hen 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;.

Tiukka tila

Tiukka CSP-vaihtopainike luo sisällön suojauskäytännön, joka ei useimmiten sisällä yleismerkkejä tai vaarallisia direktiivejä, kuten unsafe-inline. Kun tiukka CSP-asetus on käytössä, edellisessä taulukossa esitetyt direktiivit muuttuvat seuraavassa taulukossa yksityiskohtaisiksi direktiiveiksi. Tämä <platform> merkintä tarkoittaa, että käyttöympäristön toimialueet ovat tuotteen edellyttämiä. Tämän osion toimialueet saattavat muuttua ajan mittaan tuotteen kasvaessa.

Muistiinpano

Tiukka CSP on tällä hetkellä käytettävissä vain mallipohjaisille sovelluksille.

Direktiivi Oletusarvo (mallipohjainen) Mukautettavissa
script-src 'self' blob: data: <platform>' Kyllä
worker-src 'self' blob: data: Ei
style-src 'self' 'unsafe-inline' <platform> Kyllä
font-src 'self' data: <platform> Kyllä
frame-ancestors 'self' https://*.powerapps.com Kyllä
img-src 'self' blob: data: <platform> Kyllä
connect-src 'self' blob: data: wss: <platform> Kyllä
frame-src 'self' blob: <platform> Kyllä
base-uri 'none' Ei
form-action <platform> Kyllä
default-src 'self' Ei

edellytykset

Dynamics 365 Customer Engagement -sovelluksissa ja muissa mallipohjaisissa sovelluksissa CSP on käytettävissä vain verkkoympäristöissä ja organisaatioissa, joissa on Dynamics 365 Customer Engagement (on-premises) -versio 9.1 tai sitä uudempi.

Määritä CSP

Voit vaihtaa ja määrittää CSP:n hallintakeskuksen kautta Power Platform . On tärkeää ottaa ensin käyttöön kehitys- ja testausympäristö , koska CSP:n käyttöönotto voi alkaa estää skenaarioita, jos käytäntöä rikotaan. Tuemme myös vain raportti - tilaa, joka helpottaa tuotannon tehostamista.

CSP:n määrittäminen:

  1. Kirjaudu Power Platform -hallintakeskukseen.
  2. Valitse siirtymisruudussa Hallinta ja valitse sitten Hallinta-ruudussaYmpäristöt.
  3. Valitse Ympäristöt-sivulla ympäristö.
  4. Valitse komentopalkissa Asetukset.
  5. Laajenna Tuote ja valitse sitten Tietosuoja + suojaus.

Seuraavassa kuvassa näkyy asetusten oletustila:

Sisällön suojauskäytännön oletusasetukset.

Raportoidaan

Ota raportointi käyttöön -vaihtopainike määrittää, lähettävätkö mallipohjaiset ja pohjaan perustuvat sovellukset rikkomusraportteja. Sinun on määritettävä päätepiste, jotta voit ottaa sen käyttöön. Rikkomuksia koskevat raportit lähetetään tähän päätepisteeseen riippumatta siitä, onko CSP käytössä vai ei (käyttämällä Vain raportti -tilaa, jos CSP ei ole käytössä). Lisätietoja on raportointia koskevassa dokumentaatiossa.

Ota raportointikytkin käyttöön käytössä.

Valvonta

CSP otetaan käyttöön mallipohjaisille ja pohjaan perustuville sovelluksille erikseen, jotta käytäntöjä voidaan hallita tarkemmin. Käytä mallipohjaista / pohjaan perustuvaa sovellusta muokataksesi tarkoitettua sovellustyyppiä.

Pakota sisällön suojauskäytäntö -valintakytkin ottaa käyttöön oletuskäytännön annetun sovellustyypin pakottamiseksi. Tämän valitsimen kytkeminen päälle muuttaa tapaa, jolla tämän ympäristön sovellukset noudattavat käytäntöä. Tästä syystä suositeltu käyttöönoton työnkulku olisi:

  1. Ota käyttöön kehitys-/testiympäristössä.
  2. Ota Vain raportti -tila käyttöön tuotantoympäristössä.
  3. Ota käyttöön tuotantoympäristössä, kun rikkomuksia ei enää raportoida.

Määritä ohjeet

Määritä direktiivit -osiossa voit hallita käytännön yksittäisiä direktiivejä. Tällä hetkellä vain frame-ancestors-direktiiviä voidaan mukauta.

Määritä CSP-direktiivit.

Oletusdirektiivin jättämisessä päälle käytetään taulukossa määritettyä oletusarvoa. Kytkimen poistaminen käytöstä antaa järjestelmänvalvojille mahdollisuuden määrittää mukautettuja arvoja käskylle ja liittää ne oletusarvoon. Alla oleva esimerkki määrittää mukautetut arvot frame-ancestors-direktiiville. Direktiivin arvoksi määritetään tässä esimerkissä frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com. Se tarkoittaa sitä, että sovellusta voi isännöidä samassa alkuperäisessä paikassa, https://*.powerapps.com, https://www.foo.com ja https://www.bar.com, mutta ei muissa paikoissa. Käytä Lisää-painiketta lisätäksesi merkintöjä luetteloon ja poista ne Poista-kuvakkeella .

Mukautettujen CSP-direktiivien määrittäminen.

Yleiset määritykset

Lisää Microsoft Teams -integrointi Dynamics 365 -sovelluksen avulla lisäämällä seuraava kohteeseen frame-ancestors:

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

Dynamics 365 App for Outlookissa lisätään seuraavat kohteeseen frame-ancestors:

  • Outlook Web App -aloitussivun alkuperä
  • https://outlook.office.com
  • https://outlook.office365.com

Jos haluat upottaa Power Apps -tietoja Power BI -raportteihin, lisää seuraavat asiat kohteeseen frame-ancestors:

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

Tärkeitä huomioon otettavia seikkoja

Oletusdirektiivin poistaminen käytöstä ja tyhjän luettelon tallentaminen poistaa direktiivin kokonaan käytöstä eikä lähetä sitä osana CSP-vastauksen otsikkoa.

CSP-määritysesimerkkejä

Katsotaanpa paria esimerkkiä CSP-kokoonpanoista.

Esimerkki 1 - raportointi pois päältä

CSP-esimerkki 1.

Esimerkki:

  • Raportointi on poistettu käytöstä.
  • Käytäntö on käytössä mallipohjaisille sovelluksille.
    • frame-ancestors-direktiiviksi on mukautettu https://www.foo.com ja https://www.bar.com
  • Käytäntö on käytössä pohjaan perustuvissa sovelluksissa.

Voimassa olevat otsikot olisivat:

  • Mallipohjaiset sovellukset: 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;
  • Pohjaan perustuvat sovellukset: CSP-otsikkoa ei lähetettäisi.

Esimerkki 2 - raportointi päällä

CSP-esimerkki 2.

Esimerkki:

  • Raportointi on käytössä.
    • Raportoinnin päätepisteeksi on määritetty https://www.mysite.com/myreportingendpoint
  • Käytäntö on käytössä mallipohjaisille sovelluksille.
    • frame-ancestors pidetään oletusarvona
  • Käytäntö on käytössä pohjaan perustuvissa sovelluksissa.
    • frame-ancestors-direktiiviksi on mukautettu https://www.baz.com

Voimassa olevat CSP-arvot olisivat:

  • Mallipohjaiset sovellukset: 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;
  • Pohjaan perustuvat sovellukset: 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;

Muokkaa organisaation asetuksia suoraan

Voit määrittää CSP:n ilman käyttöliittymää muokkaamalla näitä organisaatioasetuksia suoraan:

  • IsContentSecurityPolicyEnabled hallitsee, lähetetäänkö Content-Security-Policy-otsikko mallipohjaisissa sovelluksissa.

  • ContentSecurityPolicyConfiguration ohjaa frame-ancestors-osan arvoa (kuten yllä näkyy, sen arvoksi 'self' määritetään, jos ContentSecurityPolicyConfiguration ei ole määritetty). Tämä asetus määritetään käyttämällä JSON-objektia, jonka rakenne on seuraava: – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Tämä kokoonpano tarkoittaa script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (MDN-sisältöä) HTTP:n Content-Security-Policy (CSP) frame-ancestors-direktiivi määrittää kelvolliset ylätasot, jotka voi upottaa sivun käyttäen jotain seuraavista: <frame>, <iframe>, <object>, <embed> tai <applet>.
  • IsContentSecurityPolicyEnabledForCanvas hallitsee, lähetetäänkö Content-Security-Policy-otsikko pohjaan perustuvissa sovelluksissa.

  • ContentSecurityPolicyConfigurationForCanvas ohjaa pohjan käytäntöä käyttämällä samaa prosessia, joka on kuvattu kohdassa ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri määrittää, tulisiko raportointia käyttää. Sekä mallipohjaiset että pohjaan perustuvat sovellukset käyttävät tätä asetusta. Kelvollinen merkkijono lähettää rikkomuksia koskevia raportteja määritettyyn päätepisteeseen käyttämällä Vain raportti -tilaa, jos IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas ei ole käytössä. Tyhjä merkkijono poistaa raportoinnin käytöstä. Lisätietoja on raportointia koskevassa dokumentaatiossa.

CSP:n määrittäminen ilman käyttöliittymää

Järjestelmänvalvojvat saattavat haluta määrittää CSP-käytännön muokkaamalla asetuksia suoraan komentosarjoilla, erityisesti Power Platform -hallintakeskuksen ulkopuolisissa ympäristöissä, kuten paikallisissa kokoonpanoissa.

Ota CSP käyttöön ilman käyttöliittymää

Ota CSP käyttöön ilman käyttöliittymää seuraavasti:

  • Avaa selaimen kehitystyökalut, kun käytät mallipohjaista sovellusta käyttäjänä, jolla on organisaatioentiteetin päivitysoikeudet (Järjestelmänvalvoja on hyvä vaihtoehto).
  • Liitä ja suorita alla oleva komentosarja konsolissa.
  • Jos haluat ottaa CSP:n käyttöön, välitä oletusmääritys – enableFrameAncestors(["'self'"])
  • Esimerkki siitä, miten sovelluksen upotetaan muita lähteitä – 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!')
}

Poista CSP käytöstä ilman käyttöliittymää

Poista CSP käytöstä ilman käyttöliittymää seuraavasti:

  • Avaa selaimen kehitystyökalut, kun käytät mallipohjaista sovellusta käyttäjänä, jolla on organisaatioentiteetin päivitysoikeudet (Järjestelmänvalvoja on hyvä vaihtoehto).
  • Liitä ja suorita alla oleva komentosarja konsolissa.
  • Voit poistaa CSP:n käytöstä liittämällä konsoliin 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!')
}