Tartalombiztonsági politika

A tartalombiztonsági szabályzat (CSP) jelenleg a modellalapú, vászonalapú és kódalapú alkalmazásokban támogatott. Ez a cikk bemutatja, hogyan konfigurálhatja a CSP-t modellalapú és vászonalapú alkalmazásokhoz. A kódalkalmazások CSP-jének megtekintéséhez tekintse meg a kódalkalmazások dokumentációját. A rendszergazdák szabályozhatják, hogy a rendszer elküldje-e a CSP-fejlécet, és bizonyos mértékig azt is, hogy az mit tartalmazzon. A beállítások a környezeti szinten vannak, ami azt jelenti, hogy a rendszer a környezet összes alkalmazására alkalmazza őket, amint be van kapcsolva.

Megjegyzés:

A tartalomra vonatkozó biztonsági házirend csak a Dataverse szolgáltatást használó környezetekre vonatkozik.

A CSP fejlécértékének minden összetevője szabályozza a letölthető objektumokat. A Mozilla Developer Network (MDN) részletesebb leírást nyújt. Az alapértelmezett értékek a következők:

Irányelv Alapértelmezett érték Testre szabható
script-src * 'unsafe-inline' 'unsafe-eval' blob: No
worker-src 'self' blob: No
style-src * 'unsafe-inline' blob: No
font-src * data: No
frame-ancestors 'self' https://*.powerapps.com Igen

Ez a konfiguráció a következő alapértelmezett CSP-t eredményezi: 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;.

Szigorú mód

A Szigorú CSP kapcsoló olyan CSP-t hoz létre, amely többnyire nem tartalmaz helyettesítő karaktereket vagy nem biztonságos irányelveket, például unsafe-inline. A szigorú CSP bekapcsolásakor az előző irányelvek az ebben a szakaszban részletezett alábbi irányelvekké válnak. A <platform> jelölés azt jelenti, hogy a termék által megkövetelt platformtartományokat kell megadni. A jelen szakaszban szereplő tartományok idővel változhatnak a termék növekedésével.

Irányelv Alapértelmezett érték (modellalapú) Alapértelmezett érték (vászon) Testre szabható
script-src 'self' blob: <platform>' 'self' <platform>' Igen
worker-src 'self' blob: 'self' blob: No
style-src 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Igen
font-src 'self' data: <platform> 'self' data: <platform> Igen
frame-ancestors 'self' https://*.powerapps.com 'self' https://*.powerapps.com Igen
img-src 'self' blob: data: <platform> 'self' data: <platform> Igen
connect-src 'self' blob: data: wss: <platform> 'self' blob: <platform> Igen
frame-src 'self' blob: <platform> 'self' <platform> Igen
base-uri 'none' N/A No
form-action <platform> N/A Igen
default-src 'self' 'self' No

Prerequisites

Az Dynamics 365 ügyfél-előjegyzési alkalmazások és más modellalapú alkalmazások esetében a CSP csak online környezetekben és Dynamics 365 helyszíni ügyfélkapcsolattal rendelkező szervezetekben érhető el, 9.1-es vagy újabb verzióban.

CSP konfigurálása

A CSP-t a Power Platform felügyeleti központjában kapcsolhatja és konfigurálhatja. Fontos, hogy először engedélyezze a fejlesztési/tesztelési környezetet, mivel a CSP engedélyezése megkezdheti a forgatókönyvek blokkolását, ha a szabályzatot megsértik. Emellett a felügyelti központ támogatja a csak jelentés módot is, amely könnyebb felzárkózást tesz lehetővé az éles környezetben.

Végezze el az alábbi lépéseket a CSP konfigurálásához:

  1. Jelentkezzen be a Power Platform felügyeleti központba.
  2. Válassza a navigációs ablakban található Kezelés elemet. A Kezelés panelen válassza a Környezetek lehetőséget.
  3. A Környezetek lapon válasszon ki egy környezetet.
  4. A parancssávon válassza a Beállítások lehetőséget.
  5. Bontsa ki a Termék csomópontot, és válassza az Adatvédelem + biztonság lehetőséget.

Az alábbi képen a beállítások alapértelmezett állapota látható:

Tartalomra vonatkozó biztonsági házirend alapértelmezett beállításai.

Jelentéskészítés

A Jelentéskészítés engedélyezése váltógomb szabályozza, hogy a modellvezérelt és vászonalapú alkalmazások küldenek-e szabálysértési jelentéseket. Az engedélyezéshez adjon meg egy végpontot. Az alkalmazás szabálysértési jelentéseket küld ennek a végpontnak, függetlenül attól, hogy a CSP kényszerítve van-e. Ha a CSP nincs kényszerítve, az alkalmazás csak jelentéskészítési módot használ. További információért lásd: jelentéskészítési dokumentáció.

Engedélyezze a jelentéskészítési kapcsolót bekapcsolásra.

Kényszerítés

A CSP alkalmazásának irányítása független a modellvezérelt és a vászonalapú alkalmazások esetében, hogy ezáltal részletesebben szabályozhatók legyenek a házirendek. A kívánt alkalmazástípus módosításához használja a modellvezérelt/vászonalapú pivot vezérlőt.

A Tartalomvédelmi szabályzat kényszerítése kapcsoló bekapcsolja az alapértelmezett házirendet az adott alkalmazástípus kényszerítéséhez. A kapcsoló bekapcsolása módosítja az alkalmazások viselkedését ebben a környezetben, hogy megfeleljen a szabályzatnak. Ezért kövesse a javasolt engedélyezési folyamatot:

  1. A szabályzat kényszerítése fejlesztői vagy tesztelési környezetben.
  2. Csak jelentés mód engedélyezése működési környezetben.
  3. A szabályzat kényszerítése működési környezetben, ha a rendszer nem jelent szabálysértést.

Iránymutatások konfigurálása

Az Irányelvek konfigurálása szakasz lehetővé teszi az egyes irányelvek szabályozását a szabályzaton belül. Jelenleg csak testre szabhatja az frame-ancestors irányelvet.

CSP-iránymutatások konfigurálása.

Ha az alapértelmezett direktívát bekapcsolva hagyja, a táblában megadott alapértelmezett értéket használja. Ha kikapcsolja a kapcsolót, megadhatja az irányelv egyéni értékeit, és hozzáfűzheti őket az alapértelmezett értékhez. Az alábbi példa egyéni értékeket állít be a következőhöz frame-ancestors: . Ebben a példában az irányelv frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com értékre van beállítva. Ez a beállítás azt jelenti, hogy az alkalmazás ugyanabban a forrásban üzemeltethető, https://*.powerapps.comhttps://www.foo.comés https://www.bar.commás forrásokban nem. A Hozzáadás gombbal bejegyzéseket adhat hozzá a listához, a Törlés ikonnal pedig eltávolíthatja azokat.

Egyéni CSP-irányelvek beállítása.

Gyakori konfigurációk

Ha Microsoft Teams integrációt szeretne Dynamics 365 alkalmazással, adja hozzá a következőket frame-ancestors:

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

A Dynamics 365 App for Outlook esetében adja hozzá a következőket (ehhez: frame-ancestors):

  • Az Outlook Web App kezdőlapja
  • https://outlook.office.com
  • https://outlook.office365.com

A Power Apps Power BI jelentésekbe való beágyazásához adja hozzá a következőket frame-ancestors:

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

Fontos tényezők

Az alapértelmezett irányelv kikapcsolása és az üres listával történő mentés teljesen kikapcsolja az irányelvet, és nem küldi el azt a CSP-válasz fejlécének részeként.

Példa CSP-konfigurációra

Íme néhány példa a CSP-konfigurációkra.

1. példa – a jelentéskészítés ki van kapcsolva

1. példa a CSP-re, modellvezérelt

CSP 1. példa, vászon

A példában:

  • A jelentéskészítés ki van kapcsolva.
  • A modellvezérelt kényszerítés engedélyezve van.
    • frame-ancestors a https://www.contoso.com és https://www.fabrikam.com számára van testreszabva.
  • A vászon kényszerítése le van tiltva.

A hatályos fejlécek a következőek:

  • Modellvezérelt alkalmazások: 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;
  • Vászonalapú alkalmazások: A CSP-fejléc nincs elküldve.

2. példa – a jelentéskészítés be van kapcsolva

2. CSP-példa, modellvezérelt

CSP 2. példa, vászon

A példában:

  • A jelentéskészítés be van kapcsolva.
    • A jelentési végpont értéke a következőre van állítva: https://contoso.com/reporting-endpoint
  • A modellvezérelt kényszerítés engedélyezve van.
    • frame-ancestors értéke alapértelmezett
  • A vászon kényszerítése le van tiltva.
    • frame-ancestors személyre van szabva a következőhöz: https://www.contoso.com

Az érvényes CSP-értékek a következők:

  • Modellvezérelt alkalmazások: 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;
  • Vászonalapú alkalmazások: 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;

Szervezeti beállítások módosítása közvetlenül

A CSP-t a felhasználói felület használata nélkül is konfigurálhatja a szervezeti beállítások közvetlen módosításával:

  • IsContentSecurityPolicyEnabled azt irányítja, hogy a Tartalomra-vonatkozó-biztonsági-házirend fejlécet a rendszer elküldi-e a modellvezérelt alkalmazásokban.

  • A ContentSecurityPolicyConfiguration szabályozza a frame-ancestors rész értékét (ahogy korábban látható, 'self' értéket állít be, ha a(z) ContentSecurityPolicyConfiguration beállítás nincs megadva). Ezt a beállítást egy JSON-objektummal definiálhatja a következő struktúrával – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Ez a konfiguráció a következőket jelenti: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Az MDN felületéről) A HTTP Tartalomra-vonatkozó-biztonsági-házirend (CSP) frame-ancestors irányelv olyan érvényes szülőket határoz meg, amelyek beágyazhatnak egy oldalt a következők használatával: <frame>, <iframe>, <object>, <embed> vagy <applet>.
  • IsContentSecurityPolicyEnabledForCanvas azt irányítja, hogy a Tartalomra-vonatkozó-biztonsági-házirend fejlécet a rendszer elküldi-e a vászonalapú alkalmazásokban.

  • AContentSecurityPolicyConfigurationForCanvas a vászon szabályzatát a következő részben (ContentSecurityPolicyConfiguration) leírt eljárással szabályozza.

  • ContentSecurityPolicyReportUri határozza meg, hogy a jelentéskészítést használni kell-e. Ezt a beállítást a modellvezérelt és a vászonalapú alkalmazások is használják. Az érvényes sztring szabálysértési jelentéseket küld a megadott végpontra, csak jelentési módban, ha a(z) IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas ki van kapcsolva. Az üres sztring letiltja a jelentéskészítést. További információért lásd: jelentéskészítési dokumentáció.

CSP konfigurálása felhasználói felület nélkül

Különösen a Power Platform felügyeleti központjában nem jelenlévő környezetek (például helyszíni konfigurációk) esetében a rendszergazdák a beállítások közvetlen módosítása érdekében szkriptek használatával is konfigurálhatják a CSP-t.

CSP engedélyezése felhasználói felület nélkül

Az alábbi lépésekkel engedélyezheti a CSP-t felhasználói felület nélkül:

  • Nyissa meg a böngésző fejlesztői eszközeit, miközben a modellvezérelt alkalmazást szervezeti entitás frissítési jogosultsággal rendelkező felhasználóként használja (a rendszergazdaként való használat jó lehetőség).
  • Illessze be a következő szkriptet a konzolba, majd hajtsa végre.
  • A CSP engedélyezéséhez adja át az alapértelmezett konfigurációt: enableFrameAncestors(["'self'"])
  • Példa arra, hogy más források is beágyazzák az alkalmazást: 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!')
}

A CSP letiltása felhasználói felület nélkül

Az alábbi lépésekkel tilthatja le a CSP-t felhasználói felület nélkül:

  • Nyissa meg a böngésző fejlesztői eszközeit, miközben a modellvezérelt alkalmazást szervezeti entitás frissítési jogosultsággal rendelkező felhasználóként használja (a rendszergazdaként való használat jó lehetőség).
  • Illessze be a következő szkriptet a konzolba, majd hajtsa végre.
  • A CSP letiltásához illessze be a konzolba a következőt: 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!')
}