Zdieľať cez


Politika zabezpečenia obsahu

Politika bezpečnosti obsahu (CSP) je momentálne podporovaná v modelovo riadených, canvas a kódových aplikáciách. Tento článok vysvetľuje, ako konfigurovať CSP pre modelovo riadené a canvas aplikácie. Pre code apps CSP pozri dokumentáciu k code apps. Správcovia môžu kontrolovať, či sa hlavička CSP odosiela a do určitej miery aj to, čo obsahuje. Nastavenia sú na úrovni prostredia, čo znamená, že sa aplikujú na všetky aplikácie v prostredí po zapnutí.

Poznámka

Zásady zabezpečenia obsahu sa vzťahujú iba na prostredia používajúce Dataverse.

Každá zložka hodnoty hlavičky CSP riadi aktíva, ktoré je možné stiahnuť. Mozilla Developer Network (MDN) poskytuje podrobnejšie popisy. Predvolené hodnoty sú uvedené nižšie:

Direktíva Predvolená hodnota Prispôsobiteľný
zdroj skriptu * 'unsafe-inline' 'unsafe-eval' blob: No
zdroj pracovníka 'self' blob: No
zdroj štýlu * 'unsafe-inline' No
zdroj písma * data: No
predkov rámcov 'self' https://*.powerapps.com Áno

Táto konfigurácia má za následok predvolený CSP s hodnotou script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Prísny režim

Prepínač Strict CSP vytvára CSP, ktorý väčšinou neobsahuje divoké karty ani nebezpečné direktívy, ako napríklad unsafe-inline. Keď zapnete Prísne CSP, predchádzajúce smernice sa stanú nasledujúcimi smernicami podrobne popísanými v tejto sekcii. Zápis <platform> znamená, že domény platformy sú poskytované podľa požiadaviek produktu. Domény v tejto sekcii sa môžu časom meniť, ako produkt rastie.

Direktíva Predvolená hodnota (riadená modelom) Predvolená hodnota (plátno) Prispôsobiteľný
zdroj skriptu 'self' blob: <platform>' 'self' <platform>' Áno
zdroj pracovníka 'self' blob: 'self' blob: No
zdroj štýlu 'self' 'unsafe-inline' <platform> 'self' 'unsafe-inline' <platform> Áno
zdroj písma 'self' data: <platform> 'self' data: <platform> Áno
predkov rámcov 'self' https://*.powerapps.com 'self' https://*.powerapps.com Áno
img-src 'self' blob: data: <platform> 'self' data: <platform> Áno
Pripojiť-SRC 'self' blob: data: wss: <platform> 'self' blob: <platform> Áno
Rám-SRC 'self' blob: <platform> 'self' <platform> Áno
základný identifikátor URI 'none' Nie je k dispozícii No
forma akcie <platform> Nie je k dispozícii Áno
predvolené-src 'self' 'self' No

Požiadavky

Pre aplikácie Dynamics 365 Customer Engagement a ďalšie aplikácie riadené modelom je CSP k dispozícii iba v online prostrediach a v organizáciách s aplikáciou Dynamics 365 Customer Engagement (on-premises) verzie 9.1 alebo novšej.

Konfigurovať CSP

CSP môžete prepínať a konfigurovať prostredníctvom centra spravovania. Power Platform Je dôležité najprv povoliť vývojové/testovacie prostredie, pretože povolenie CSP by mohlo v prípade porušenia pravidiel začať blokovať scenáre. Administratívne centrum tiež podporuje režim iba reportovania , čo umožňuje jednoduchšie rozbehnutie produkcie.

Postupujte podľa týchto krokov na konfiguráciu CSP:

  1. Prihláste sa do centra spravovania Power Platform.
  2. V navigačnej table vyberte položku Spravovať. V table Spravovať vyberte možnosť Prostredia.
  3. Na stránke Prostredia vyberte prostredie.
  4. Na paneli príkazov vyberte položku Nastavenia.
  5. Rozbaľte položku Produkt a potom vyberte položku Súkromie a zabezpečenie.

Nasledujúci obrázok zobrazuje predvolený stav nastavení:

Predvolené nastavenia politiky zabezpečenia obsahu.

Nahlasuje sa

Prepínač Povoliť hlásenie ovláda, či aplikácie riadené modelom a aplikácie plátna odosielajú hlásenia o porušeniach. Na jeho povolenie zadajte koncový bod. Aplikácia posiela na tento koncový bod hlásenia o porušení bez ohľadu na to, či je CSP vynucované alebo nie. Ak CSP nie je vynucované, aplikácia používa režim iba hlásenia. Ďalšie informácie nájdete v dokumentácii k vykazovaniu.

Zapnite prepínač hlásení.

Presadzovanie

Presadzovanie CSP je riadené nezávisle pre modelom riadené aplikácie a aplikácie plátna, aby sa zabezpečila podrobná kontrola nad politikami. Na úpravu zamýšľaného typu aplikácie použite modelom riadený kontingenčný ovládací prvok/kontingenčný ovládací prvok plátna.

Prepínač Vynútiť politiku zabezpečenia obsahu zapne predvolené pravidlo na presadzovanie pre daný typ aplikácie. Zapnutím tohto prepínača sa správanie aplikácií v tomto prostredí zmení tak, aby boli v súlade s pravidlami. Preto postupujte podľa navrhovaného procesu umožnenia:

  1. Vynuťte túto politiku v vývojárskom alebo testovacom prostredí.
  2. V produkčnom prostredí povoliť „režim iba pre zostavy“.
  3. Dodržiavajte túto politiku v produkcii, keď nebudú nahlásené žiadne porušenia.

Konfigurovať nariadenia

Sekcia Konfigurovať smernice umožňuje ovládať jednotlivé smernice v rámci politiky. Momentálne si môžete prispôsobiť frame-ancestors iba túto direktívu.

Konfigurácia direktív CSP.

Ak necháte predvolenú direktívu zapnutú, použijete predvolenú hodnotu uvedenú v tabuľke. Ak vypnete prepínač, môžete nastaviť vlastné hodnoty pre direktívu a pridať ich k predvolenej hodnote. Nasledujúci príklad nastavuje vlastné hodnoty pre frame-ancestors. Smernica je nastavená v tomto príklade frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com . Toto nastavenie znamená, že aplikácia môže byť hostovaná v tom istom pôvode, https://*.powerapps.com, https://www.foo.coma , https://www.bar.comale nie v iných zdrojoch. Pomocou tlačidla Pridať pridáte položky do zoznamu a pomocou ikony Odstrániť ich odstránite.

Nastavenie vlastných direktív CSP.

Bežné konfigurácie

Pre integráciu pomocou aplikácie Dynamics 365 pridajte do priečinka Microsoft Teams nasledujúci kód: ...frame-ancestors

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

Pre Dynamics 365 App for Outlook pridajte k frame-ancestors nasledovné:

  • Pôvod domovskej stránky aplikácie Outlook Web App
  • https://outlook.office.com
  • https://outlook.office365.com

Pre vkladanie do správ pridajte do prehľadu Power Apps nasledujúci kód: Power BI frame-ancestors

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

Dôležité aspekty

Vypnutím predvolenej direktívy a uložením s prázdnym zoznamom sa direktíva úplne vypne a neodošle sa ako súčasť hlavičky odpovede CSP.

Príklady konfigurácie CSP

Tu je niekoľko príkladov konfigurácií CSP.

Príklad 1 – hlásenie vypnuté

CSP príklad 1, modelovo riadený

CSP príklad 1, canvas

V príklade:

  • Vykazovanie je vypnuté.
  • Modelom riadené presadzovanie je povolené.
    • frame-ancestors je prispôsobený na https://www.contoso.com a https://www.fabrikam.com.
  • Vynucovanie na plátne je zakázané.

Efektívne hlavičky sú:

  • Modelom riadené aplikácie: 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.contoso.com https://www.fabrikam.com;
  • Canvas aplikácie: CSP hlavička nie je odoslaná.

Príklad 2 – hlásenie zapnuté

CSP príklad 2, modelovo riadený

CSP príklad 2, canvas

V príklade:

  • Vykazovanie je zapnuté.
    • Koncový bod vykazovania je nastavený na https://contoso.com/reporting-endpoint
  • Modelom riadené presadzovanie je povolené.
    • frame-ancestors je ponechané ako predvolené
  • Vynucovanie na plátne je zakázané.
    • frame-ancestors je prispôsobený https://www.contoso.com

Efektívne hodnoty CSP sú:

  • Modelom riadené aplikácie: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; report-uri https://contoso.com/reporting-endpoint;
  • Aplikácie plátna: 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;

Priama úprava nastavení organizácie

CSP môžete nakonfigurovať bez použitia používateľského rozhrania priamou úpravou týchto nastavení organizácie:

  • IsContentSecurityPolicyEnabled ovláda, či sa hlavička Content-Security-Policy odosiela v aplikáciách riadených modelom.

  • ContentSecurityPolicyConfiguration riadi hodnotu časti predkov rámca (ako už bolo vidieť, nastaví sa na 'self' , ak ContentSecurityPolicyConfiguration nie je nastavená). Definujte toto nastavenie pomocou JSON objektu s nasledujúcou štruktúrou – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Táto konfigurácia sa premieta do script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Z MDN) Direktíva frame-ancestors HTTP Content-Security-Policy (CSP) špecifikuje platných nadradených prvkov, ktoré môžu vložiť stránku pomocou <frame>, <iframe>, <object>, <embed> alebo <applet>.
  • IsContentSecurityPolicyEnabledForCanvas ovláda, či sa v aplikáciách plátna odosiela hlavička Content-Security-Policy.

  • ContentSecurityPolicyConfigurationForCanvas riadi politiku pre plátno pomocou rovnakého postupu, aký je opísaný v ContentSecurityPolicyConfiguration.

  • Parameter ContentSecurityPolicyReportUri určuje, či sa má použiť generovanie prehľadov. Toto nastavenie používajú modelom riadené aplikácie aj aplikácie plátna. Platný reťazec odosiela hlásenia o porušení do zadaného koncového bodu pomocou režimu iba hlásenia, ak je parameter IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas vypnutý. Prázdny reťazec zakáže vytváranie zostáv. Ďalšie informácie nájdete v dokumentácii k vykazovaniu.

Konfigurácia CSP bez používateľského rozhrania

Najmä v prostrediach, ktoré nie sú v centre spravovania Power Platform, ako sú napríklad lokálne konfigurácie, môžu správcovia chcieť nakonfigurovať CSP pomocou skriptov na priamu úpravu nastavení.

Povoliť CSP bez používateľského rozhrania

Ak chcete povoliť CSP bez používateľského rozhrania, postupujte podľa týchto krokov:

  • Otvorte vývojárske nástroje prehliadača pri používaní modelom riadenej aplikácie ako používateľ s oprávneniami na aktualizáciu entity organizácie (dobrou možnosťou je správca systému).
  • Vložte a spustite nasledujúci skript do konzoly.
  • Ak chcete povoliť CSP, zadajte predvolenú konfiguráciu - enableFrameAncestors(["'self'"])
  • Ako príklad umožnenia vloženia aplikácie do iných zdrojov - 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!')
}

Zakázať CSP bez používateľského rozhrania

Ak chcete deaktivovať CSP bez používateľského rozhrania, postupujte takto:

  • Otvorte vývojárske nástroje prehliadača pri používaní modelom riadenej aplikácie ako používateľ s oprávneniami na aktualizáciu entity organizácie (dobrou možnosťou je správca systému).
  • Vložte a spustite nasledujúci skript do konzoly.
  • Ak chcete zakázať CSP, prilepte do konzoly: 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!')
}