Политика за защита на съдържание

Политиката за сигурност на съдържанието (CSP) в момента се поддържа в приложения, управлявани от модели, canvas и код. Тази статия обяснява как да конфигурирате CSP за моделно управлявани и canvas приложения. За CSP за код приложения, вижте документацията на код приложенията. Администраторите могат да контролират дали заглавката на CSP се изпраща и до известна степен какво съдържа. Настройките са на ниво среда, което означава, че се прилагат към всички приложения в средата, след като са включени.

Бележка

Правилата за защита на съдържанието се прилагат само за среди, които използват Dataverse.

Всеки компонент на стойността на заглавието на CSP контролира активите, които могат да бъдат изтеглени. Mozilla Developer Network (MDN) предоставя по-подробни описания. Стойностите по подразбиране са, както следва:

Директива Стойност по подразбиране С възможност за персонализиране
скрипт-src * 'unsafe-inline' 'unsafe-eval' blob: Не
работник-src 'self' blob: Не
style-src * 'unsafe-inline' blob: Не
font-src * data: Не
Рамки-предци 'self' https://*.powerapps.com Да

Тази конфигурация води до 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;.

Строг режим

Превключвателят Strict CSP създава CSP, който обикновено не включва жокери или опасни директиви, като unsafe-inline. Когато включите Strict CSP, предходните директиви стават следните директиви, описани в този раздел. Обозначението <platform> означава, че домейните на платформата се предоставят според изискванията на продукта. Домейните в този раздел могат да се променят с времето, докато продуктът расте.

Директива Стойност по подразбиране (управлявана от модела) Стойност по подразбиране (платно) С възможност за персонализиране
скрипт-src 'self' blob: <platform>' 'self' <platform>' Да
работник-src 'self' blob: 'self' blob: Не
style-src 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> Да
font-src 'self' data: <platform> 'self' data: <platform> Да
Рамки-предци 'self' https://*.powerapps.com 'self' https://*.powerapps.com Да
IMG-SRC 'self' blob: data: <platform> 'self' data: <platform> Да
Свързване-src 'self' blob: data: wss: <platform> 'self' blob: <platform> Да
Рамка-SRC 'self' blob: <platform> 'self' <platform> Да
base-uri 'none' Не е приложимо Не
Формулярно действие <platform> Не е приложимо Да
default-src 'self' 'self' Не

Предварителни изисквания

За приложения за ангажиране на клиенти Dynamics 365 и други приложения, базирани на модели, CSP е достъпен само в онлайн среди и в организации с Dynamics 365 клиентска ангажираност (локално), версия 9.1 или по-късна версия.

Конфигуриране на CSP

Можете да превключвате и конфигурирате CSP чрез центъра за администриране Power Platform . Важно е първо да активирате среда за разработка/тестване, тъй като активирането на CSP може да започне да блокира сценарии, ако правилата бъдат нарушени. Административният център поддържа и режим само за доклади , за да се улесни увеличаването на продукцията.

Направете следните стъпки за конфигуриране на CSP:

  1. Влезте в центъра за администриране на Power Platform.
  2. В навигационния екран изберете Управление. В екрана Управление изберете Среди.
  3. На страницата Среди изберете среда.
  4. В командната лента изберете Настройки.
  5. Разгънете Продукт и след това изберете Поверителност + Защита.

Следното изображение показва състоянието по подразбиране на настройките:

Настройки по подразбиране на правилата за защита на съдържанието.

Отчитане

Превключвателят Разрешаване на отчитане контролира дали приложенията, управлявани от модел и платно, изпращат отчети за нарушения. За да го активирате, посочете крайна точка. Приложението изпраща доклади за нарушения към тази крайна точка, независимо дали CSP се прилага или не. Ако CSP не се прилага, приложението използва режим само за доклади. За повече информация вижте документацията за отчитане.

Активирайте превключвателя за отчитане на включено.

Налагане

Прилагането на CSP се контролира независимо за управлявани от модели и платно приложения, за да се осигури детайлен контрол върху политиките. Използвайте управлявания от модела/платното ос, за да промените желания тип приложение.

Превключвателят Налагане на правилата за защита на съдържанието включва стандартните правила за прилагане за дадения тип приложение. Включването на този превключвател променя поведението на приложенията в тази среда, за да се придържат към правилата. Затова следвайте този предложен поток на активиране:

  1. Прилагайте политиката в среда за разработка или тестове.
  2. Активирайте режима само за отчети в производствения процес.
  3. Прилагайте политиката в производство, след като не бъдат докладвани нарушения.

Конфигуриране на директиви

Разделът Конфигуриране на директиви ви позволява да контролирате отделни директиви в правилата. В момента можете да персонализирате само директивата frame-ancestors .

Конфигурирайте CSP директиви.

Ако оставиш включена стандартната директива, използваш стойността по подразбиране, посочена в таблицата. Ако изключите превключвателя, можете да зададете персонализирани стойности за директивата и да ги добавите към стандартната стойност. Следващият пример задава персонализирани стойности за frame-ancestors. Директивата е зададена в frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com този пример. Тази настройка означава, че приложението може да бъде хоствано в същия произход, https://*.powerapps.com, https://www.foo.comи https://www.bar.com, но не и в други origins. Използвайте бутона Добавяне , за да добавите записи към списъка, и иконата Изтриване , за да ги премахнете.

Задаване на персонализирани CSP директиви.

Общи конфигурации

За Microsoft Teams интеграция чрез приложението Dynamics 365, добавете следното към frame-ancestors:

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

За приложението Dynamics 365 за Outlook добавете следното към frame-ancestors:

  • Произход на началната страница на вашето Outlook уеб приложение
  • https://outlook.office.com
  • https://outlook.office365.com

За вграждане на Power Apps в Power BI отчети, добавете следното към frame-ancestors:

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

Важни съображения

Изключването на директивата по подразбиране и запазването с празен списък изключва директивата напълно и не я изпраща като част от заглавката на отговора на CSP.

Примери за конфигурация на CSP

Ето няколко примера за конфигурации на CSP.

Пример 1 - отчитането е изключено

Пример за CSP 1, моделно управляван

CSP пример 1, платно

В примера:

  • Отчитането е изключено.
  • Налагането, управлявано от модел, е активирано.
    • frame-ancestors е персонализиран към https://www.contoso.com и https://www.fabrikam.com.
  • Налагането на платно е деактивирано.

Ефективните заглавия са:

  • Приложения, управлявани от модел: 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 приложения: CSP заглавието не се изпраща.

Пример 2 – отчитането е включено

CSP пример 2, моделно управляван

CSP пример 2, платно

В примера:

  • Отчитането е включено.
    • Отчетна крайна точка е зададена на https://contoso.com/reporting-endpoint
  • Налагането, управлявано от модел, е активирано.
    • frame-ancestors се запазва по подразбиране
  • Налагането на платно е деактивирано.
    • frame-ancestors е персонализиран за https://www.contoso.com

Ефективните стойности на CSP са:

  • Приложения, управлявани от модел: 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;
  • Приложения за платно: 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;

Директно промяна на настройките на организацията

Можете да конфигурирате CSP, без да използвате потребителския интерфейс, като промените директно тези настройки на организацията:

  • IsContentSecurityPolicyEnabled контролира дали заглавката Content-Security-Policy да се изпраща в приложения, управлявани от модел.

  • ContentSecurityPolicyConfiguration контролира стойността на частта frame-ancestors (както беше видно по-рано, 'self' ако ContentSecurityPolicyConfiguration не е зададено). Дефинирайте тази настройка чрез използване на JSON обект със следната структура – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Тази конфигурация се изразява в script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (От MDN) HTTP Content-Security-Policy (CSP) директивата за рамки-предци определя валидни родители, които могат да вграждат страница, използвайки <frame>, <iframe>, <object>, <embed> или <applet>.
  • IsContentSecurityPolicyEnabledForCanvas контролира дали заглавката Content-Security-Policy да се изпраща в приложенията за платно.

  • ContentSecurityPolicyConfigurationForCanvas контролира правилата за платно, като използва същия процес, описан в ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri контролира дали трябва да се използва отчитане. Тази настройка се използва както от приложения, управлявани от модел, така и от платно. Валиден низ изпраща отчети за нарушения до посочената крайна точка, като използва режим само за отчет, ако IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas е изключен. Празен низ деактивира отчитането. За повече информация вижте документацията за отчитане.

Конфигуриране на CSP без потребителски интерфейс

Особено за среди извън Power Platform административния център, като локален конфигурации, администраторите може да искат да конфигурират CSP с помощта на скриптове за директно модифициране на настройките.

Активиране на CSP без потребителски интерфейс

Изпълнете следните стъпки, за да активирате CSP без потребителски интерфейс:

  • Отворете инструментите за разработка на браузъра, докато използвате управляваното от модела приложение като потребител с привилегии за актуализиране на организационен обект (системният администратор е добра опция).
  • Поставете и изпълнете следния скрипт в конзолата.
  • За да активирате CSP, предайте конфигурацията по подразбиране - enableFrameAncestors(["'self'"])
  • Като пример за разрешаване на други източници да вграждат приложението - 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!')
}

Деактивирайте CSP без потребителски интерфейс

Предприемете тези стъпки, за да деактивирате CSP без потребителски интерфейс:

  • Отворете инструментите за разработка на браузъра, докато използвате управляваното от модела приложение като потребител с привилегии за актуализиране на организационен обект (системният администратор е добра опция).
  • Поставете и изпълнете следния скрипт в конзолата.
  • За да деактивирате CSP, поставете в конзолата: 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!')
}