Jaa


Sisällön suojauskäytäntö

CSP-käytäntöä tuetaan tällä hetkellä mallipohjaisissa ja koodisovelluksissa. Tässä artikkelissa kerrotaan, miten CSP määritetään mallipohjaisia ja pohjaan perustuvia sovelluksia varten. Koodisovellusten CSP:n osalta katso koodisovellusten dokumentaatio. Järjestelmänvalvojat voivat määrittää, lähetetäänkö sisällön suojauskäytännön otsikko. He voivat myös tiettyyn rajaan asti määrittää, mitä se sisältää. Asetukset ovat ympäristötasolla, mikä tarkoittaa, että ne otetaan käyttöön kaikissa ympäristön sovelluksissa, kun ne on kerran otettu käyttöön.

Huomautus

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

Kukin CSP-otsikon arvon osa hallitsee resursseja, jotka voidaan ladata palvelusta. Mozilla Developer Network (MDN) tarjoaa tarkempia kuvauksia. Oletusarvot näkyvät alla:

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

Tämän määrityksen tulos on oletusarvoinen sisällön suojauskäytäntö kohteelle 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;.

Tiukka tila

Tiukka CSP-vaihtopainike luo CSP-järjestelmän, joka ei useimmiten sisällä yleismerkkejä tai vaarallisia direktiivejä, kuten unsafe-inline. Kun otat tiukan CSP-järjestelmän käyttöön, edellä annetuista direktiiveistä tulee tässä osiossa yksityiskohtaiset ohjeet. 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.

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

Edellytykset

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

Sisällön suojauskäytännön määrittäminen

Voit valita ja määrittää sisällön suojauskäytännön Power Platform -hallintakeskuksen avulla. On tärkeää ottaa ensin käyttöön kehitys- tai testausympäristö, koska sisällön suojauskäytännön käyttöönotto voi alkaa estää skenaarioita, jos käytäntöä rikotaan. Hallintakeskus tukee myös vain raportteja - tilaa, joka helpottaa tuotannon tehostamista.

Määritä CSP seuraavasti:

  1. Kirjaudu Power Platform -hallintakeskukseen.
  2. Valitse siirtymisruudussa Hallitse. Valitse Hallitse-ruudussa Ympäristöt.
  3. Valitse Ympäristöt-sivulla ympäristö.
  4. Valitse komentopalkissa Asetukset.
  5. Laajenna Tuote ja valitse sitten Yksityisyys + Suojaus.

Seuraavassa kuvassa näkyy asetusten oletustila:

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

Raportointi

Ota raportointi käyttöön -vaihtopainike määrittää, lähettävätkö mallipohjaiset sovellukset ja pohjaan perustuvat sovellukset raportteja rikkomuksista. Jos haluat ottaa sen käyttöön, määritä päätepiste. Sovellus lähettää rikkomusraportteja tähän päätepisteeseen riippumatta siitä, pakotetaanko CSP vai ei. Jos CSP ei ole käytössä, sovellus käyttää vain raportti -tilaa. Lisätietoja on raportointia koskevassa dokumentaatiossa.

Siirrä raportoinnin vaihtopainike Käytössä-asentoon.

Valvonta

Sisällön suojauskäytäntö 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öä. Noudata siis tätä ehdotettua käyttöönottotyönkulkua:

  1. Ota käytäntö käyttöön kehitys- tai testiympäristössä.
  2. Ota Vain raportti -tila käyttöön tuotantoympäristössä.
  3. Pane käytäntö täytäntöön tuotannossa, kun rikkomuksista ei raportoida.

Ohjeiden määrittäminen

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

Määritä sisällön suojauskäytännön direktiivit.

Jos jätät oletusdirektiivin käyttöön, käytät taulukossa määritettyä oletusarvoa. Jos poistat vaihtopainikkeen käytöstä, voit määrittää direktiivin mukautetut arvot ja liittää ne oletusarvoon. Seuraavassa esimerkissä asetetaan mukautetut -arvot parametrille frame-ancestors. Tässä esimerkissä direktiivin asetukseksi frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com on määritetty . Tämä asetus tarkoittaa, että sovellusta voidaan isännöidä samalla alkuperällä, https://*.powerapps.com, https://www.foo.comja https://www.bar.com, mutta ei muilla alkuperällä. Käytä Lisää-painiketta lisätäksesi luetteloon merkintöjä ja Poista-kuvaketta poistaaksesi niitä.

Määritä sisällön suojauskäytännön mukautettuja direktiivejä.

Yleiset määritykset

Lisää Dynamics 365 -sovellusta käyttävään Microsoft Teams -integrointiin seuraava kohteeseen frame-ancestors:

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

Lisää Dynamics 365 App for Outlookille seuraava kohteeseen frame-ancestors:

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

Lisää Power BI -raporttien Power Appsin upottamiseen seuraava 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 sisällön suojauskäytännön vastauksen otsikkoa.

Sisällön suojauskäytännön määrityksen esimerkit

Seuraavassa on muutama esimerkki CSP-määrityksistä.

Esimerkki 1 – raportointi pois päältä

CSP-esimerkki 1, mallipohjainen

CSP-esimerkki 1, pohja

Esimerkki:

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

Käytössä olevat otsikot ovat:

  • Mallipohjaiset sovellukset: 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-sovellukset: CSP-otsikkoa ei lähetetä.

Esimerkki 2 – raportointi päällä

CSP-esimerkki 2, mallipohjainen

CSP-esimerkki 2, pohja

Esimerkki:

  • Raportointi on käytössä.
    • Raportoinnin päätepisteeksi on määritetty https://contoso.com/reporting-endpoint
  • 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 on mukautettu muotoon https://www.contoso.com

Tehokkaat CSP-arvot ovat seuraavat:

  • Mallipohjaiset sovellukset: 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;
  • 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.contoso.com; report-uri https://contoso.com/reporting-endpoint;

Organisaation asetuksien muokkaaminen suoraan

Voit määrittää sisällön suojauskäytännön ilman käyttöliittymää muokkaamalla seuraavia organisaatioasetuksia suoraan:

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

  • ContentSecurityPolicyConfiguration määrittää frame-ancestors-osan arvon (kuten aiemmin on nähty, sen asetuksena 'self' on, jos ContentSecurityPolicyConfiguration ei ole määritetty). Määritä tämä asetus käyttämällä JSON-objektia, jolla on seuraava rakenne – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Tämä määritys tarkoittaa seuraavaa: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; 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 määrittää, lähetetäänkö Content-Security-Policy-otsikko pohjaan perustuvissa sovelluksissa.

  • ContentSecurityPolicyConfigurationForCanvas ohjaa kaavion käytäntöä käyttämällä 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.

Sisällön suojauskäytännön määrittäminen ilman käyttöliittymää

Järjestelmänvalvojat saattavat haluta määrittää sisällön suojauskäytännön muokkaamalla asetuksia suoraan komentosarjoilla erityisesti Power Platform -hallintakeskuksen ulkopuolisissa ympäristöissä, kuten paikallisissa määrityksissä.

Sisällön suojauskäytännön ottaminen käyttöön ilman käyttöliittymää

Ota sisällön suojauskäytäntö 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 sisällön suojauskäytännö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!')
}

Sisällön suojauskäytännön poistaminen käytöstä ilman käyttöliittymää

Poista sisällön suojauskäytäntö 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 sisällön suojauskäytännö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!')
}