Нотатка
Доступ до цієї сторінки потребує авторизації. Можна спробувати ввійти або змінити каталоги.
Доступ до цієї сторінки потребує авторизації. Можна спробувати змінити каталоги.
Політика безпеки контенту (CSP) наразі підтримується в модельно-керованих, canvas-додатках та коді. У цій статті пояснюється, як налаштувати CSP для модельно-керованих і canvas-додатків. Для CSP програм для кодування дивіться документацію програм код-додатків. Адміністратори можуть керувати надсиланням заголовка CSP і, за мірою, те, що в ньому міститься. Налаштування розташовані на рівні середовища, тобто вони застосовуються до всіх додатків у цьому оточенні після увімкнення.
Нотатка
Політика безпеки вмісту застосовується лише до середовищ, які використовують Dataverse.
Кожен компонент значення заголовка CSP керує активами, які можна завантажити. Мережа розробників Mozilla (MDN) надає більш детальні описи. Значення за замовчуванням вказані нижче
| Директива | Стандартне значення | Настроювані |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: |
Ні |
| Робітник-СРС | '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> означає, що домени платформи надаються відповідно до вимог продукту. Домени в цьому розділі можуть змінюватися з часом у міру зростання продукту.
| Директива | Значення за замовчуванням (на основі моделі) | Значення за замовчуванням (полотно) | Настроювані |
|---|---|---|---|
| script-src | 'self' blob: <platform>' |
'self' <platform>' |
Так |
| Робітник-СРС | '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> |
Так |
| connect-src | 'self' blob: data: wss: <platform> |
'self' blob: <platform> |
Так |
| frame-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:
- Увійдіть у Центр адміністрування Power Platform.
- В області переходів виберіть Керування . В області «Керування » виберіть «Середовища».
- На сторінці Середовища виберіть середовище.
- На панелі команд виберіть Налаштування.
- Розгорніть розділ Продукт, а потім виберіть Конфіденційність + Безпека.
На наступному зображенні показаний стан налаштувань за замовчуванням:
Звітування
Перемикач Увімкнути звітування визначає, чи надсилають програми на основі моделі та полотна звіти про порушення. Щоб увімкнути його, вкажіть кінцеву точку. Додаток надсилає звіти про порушення на цю кінцеву точку незалежно від того, чи застосовується CSP чи ні. Якщо CSP не застосовується, додаток використовує режим лише звітів. Для отримання додаткової інформації див. документацію про звітування.
Правозастосування
Застосування CSP контролюється незалежно для модельних і компонованих програм, що забезпечує детальний контроль над політиками. Щоб змінити тип програми, скористайтеся зведеною таблицею на основі модельної або компонованої програми.
Перемикач Забезпечити дотримання політики безпеки контенту вмикає політику за умовчанням для примусового виконання для певного типу додатків. Увімкнення цього перемикача змінює поведінку програм у цьому середовищі для дотримання політики. Отже, дотримуйтесь цього запропонованого потоку активації:
- Впровадити політику в розробницькому або тестовому середовищі.
- Увімкніть у виробництві режим лише для звітів.
- Застосовуйте політику у виробництві, коли порушення не будуть зареєстровані.
Налаштувати директиви
За допомогою розділу «Налаштувати директиви» можна керувати окремими директивами в межах політики. Наразі ви можете налаштувати лише директиву frame-ancestors .
Якщо залишити стандартну директиву увімкненою, ви використовуєте значення за замовчуванням, вказане в таблиці. Якщо вимкнути перемикач, можна вказати власні значення для директиви і додати їх до значення за замовчуванням. Наступний приклад встановлює власні значення для 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, але не в інших джерелах. Використовуйте кнопку Додати , щоб додати записи до списку, і піктограму Видалити , щоб видалити їх.
Поширені конфігурації
Для Microsoft Teams інтеграції за допомогою додатку Dynamics 365 додайте наступне до frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Для додатку Dynamics 365 для Outlook додайте наступне до frame-ancestors:
- Походження вашої головної сторінки Outlook Web App
https://outlook.office.comhttps://outlook.office365.com
Для вбудови Power Apps у Power BI звіти додайте наступне до frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Важливі міркування
Вимкнення директиви за замовчуванням і збереження з пустим списком повністю вимикає директиву й не надсилає її як частину заголовка відповіді на CSP.
Приклади конфігурації CSP
Ось кілька прикладів конфігурацій 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 - звітність включена
У прикладі:
- Звітування ввімкнуто.
- Кінцева точка звітування налаштована на
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-ancestors визначає дійсні батьківські одиниці, що можуть вбудовувати сторінку за допомогою
<frame>,<iframe>,<object>,<embed>, або<applet>.
- (З MDN) Директива HTTP Content-Security-Policy (CSP) frame-ancestors визначає дійсні батьківські одиниці, що можуть вбудовувати сторінку за допомогою
IsContentSecurityPolicyEnabledForCanvas визначає, чи надсилається заголовок Content-Security-Policy у програмах canvas.
ContentSecurityPolicyConfigurationForCanvas керує політикою для canvas за допомогою того самого процесу, що описано в.
ContentSecurityPolicyConfigurationContentSecurityPolicyReportUri визначає, чи слід використовувати звітування. Ця настройка використовується компонованими та модельними програмами. Допустимий рядок надсилає звіти про порушення на вказану кінцеву точку, використовуючи режим лише звіту, якщо
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!')
}