Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zasady zabezpieczeń zawartości (CSP) są obecnie obsługiwane w aplikacjach opartych na modelu, kanwie i kodzie. W tym artykule wyjaśniono, jak skonfigurować CSP dla aplikacji model-driven i canvas. Aby uzyskać informacje o aplikacjach kodu CSP, zobacz dokumentację aplikacji kodu. Administratorzy mogą kontrolować, czy ma być wysyłany nagłówek CSP i, do pewnego stopnia, jego treści. Ustawienia są na poziomie środowiska, co oznacza, że są one stosowane do wszystkich aplikacji w środowisku po włączeniu.
Uwaga
Zasady zabezpieczeń zawartości mają zastosowanie tylko do środowisk korzystających z Dataverse.
Każdy składnik wartości nagłówka CSP kontroluje zasoby, które można pobrać. Program Mozilla Developer Network (MDN) zawiera bardziej szczegółowe opisy. Wartości domyślne ukazano poniżej:
| Dyrektywa | Domyślna wartość | Można dostosowywać |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: |
Nie |
| worker-src | 'self' blob: |
Nie |
| style-src | * 'unsafe-inline' |
Nie |
| font-src | * data: |
Nie |
| frame-ancestors | 'self' https://*.powerapps.com |
Tak |
Ta konfiguracja powoduje domyślną wartość dostawcy CSP wynoszącego script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.
Tryb ścisły
Przełącznik Ścisłe zasady CSP tworzy zasady CSP, które w większości nie zawierają symboli wieloznacznych ani niebezpiecznych dyrektyw, takich jak unsafe-inline. Po włączeniu programu Strict CSP powyższe dyrektywy staną się następującymi dyrektywami opisanymi w tej sekcji. Notacja <platform> oznacza, że domeny platformy są dostarczane zgodnie z wymaganiami produktu. Domeny w tej sekcji mogą się zmieniać wraz z upływem czasu w miarę rozwoju produktu.
| Dyrektywa | Wartość domyślna (oparta na modelu) | Wartość domyślna (kanwa) | Można dostosowywać |
|---|---|---|---|
| script-src | 'self' blob: <platform>' |
'self' <platform>' |
Tak |
| worker-src | 'self' blob: |
'self' blob: |
Nie |
| style-src | 'self' 'unsafe-inline' <platform> |
'self' 'unsafe-inline' <platform> |
Tak |
| font-src | 'self' data: <platform> |
'self' data: <platform> |
Tak |
| frame-ancestors | 'self' https://*.powerapps.com |
'self' https://*.powerapps.com |
Tak |
| img-src | 'self' blob: data: <platform> |
'self' data: <platform> |
Tak |
| connect-src | 'self' blob: data: wss: <platform> |
'self' blob: <platform> |
Tak |
| frame-src | 'self' blob: <platform> |
'self' <platform> |
Tak |
| base-uri | 'none' |
N/A | Nie |
| form-action | <platform> |
N/A | Tak |
| default-src | 'self' |
'self' |
Nie |
Wymagania wstępne
W przypadku aplikacji platformy Dynamics 365 Customer Engagement i innych aplikacji opartych na modelu dostawca CSP jest dostępny tylko w środowiskach online i w organizacjach z Dynamics 365 Customer Engagement (on-premises) w wersji 9.1 lub nowszej.
Konfiguruj CSP
Dostawcę CSP można przełączać i konfigurować za pomocą centrum administracyjnego Power Platform. Ważne jest, aby najpierw włączyć środowisko deweloperskie/testowe, ponieważ włączenie dostawcy CSP może rozpocząć blokowanie scenariuszy, jeśli zasady zostaną naruszone. Centrum administracyjne obsługuje również tryb tylko raportowania, aby umożliwić łatwiejsze wdrożenie w środowisku produkcyjnym.
Wykonaj następujące kroki, aby skonfigurować CSP:
- Zaloguj się do centrum administracyjnego Power Platform.
- W okienku nawigacji wybierz pozycję Zarządzaj. W okienku Zarządzaj, wybierz Środowiska.
- Na stronie Środowiska wybierz swoje środowisko.
- Wybierz Ustawienia na pasku poleceń.
- Rozwiń Produkt, a następnie kliknij opcję Prywatność + Bezpieczeństwo.
Na poniższym obrazie przedstawiono domyślny stan ustawień:
Zgłaszanie
Przełączając funkcję "Włączanie raportowania", można określić, czy aplikacje oparte na modelu i aplikacje kanwy wysyłają raporty o naruszeniach. Aby ją włączyć, określ punkt końcowy. Aplikacja wysyła raporty o naruszeniach do tego punktu końcowego niezależnie od tego, czy polityka CSP jest egzekwowana, czy nie. Jeśli CSP nie jest egzekwowane, aplikacja używa trybu raportowania. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą raportowania.
Egzekwowanie
Wymuszanie CSP jest kontrolowane niezależnie w przypadku aplikacji opartych na modelu i aplikacji kanwy, aby zapewnić szczegółową kontrolę nad zasadami. Użyj elementu pivot „oparta na modelu/kanwy”, aby zmodyfikować zamierzony typ aplikacji.
Przełącznik Wymuszaj zasady zabezpieczeń zawartości włącza domyślne zasady wymuszania dla danego typu aplikacji. Włączenie tego przełączania spowoduje zmianę zachowania aplikacji w tym środowisku w celu przestrzegania zasad. W związku z tym postępuj zgodnie z sugerowanym procesem włączania:
- Wymuszanie zasad w środowisku deweloperskim lub testowym.
- Włącz tryb tylko do raportu w środowisku produkcyjnym.
- Wymuszaj zasady w środowisku produkcyjnym, gdy nie są zgłaszane żadne naruszenia.
Konfiguruj dyrektywy
Sekcja Konfigurowanie dyrektyw umożliwia kontrolowanie poszczególnych dyrektyw w ramach zasad. Obecnie można dostosować tylko dyrektywę frame-ancestors .
Jeśli pozostawisz domyślną dyrektywę włączoną, używasz wartości domyślnej podanej w tabeli. Jeśli wyłączysz przełącznik, możesz określić niestandardowe wartości dla dyrektywy i dołączyć je do wartości domyślnej. W poniższym przykładzie ustawiono wartości niestandardowe dla elementu frame-ancestors. Dyrektywa jest ustawiona na frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com w tym przykładzie. To ustawienie oznacza, że aplikacja może być hostowana w tym samym miejscu pochodzenia, https://*.powerapps.com, https://www.foo.comi https://www.bar.com, ale nie w innych źródłach. Aby dodać pozycje do listy i usunąć ikony usuwania, użyj przycisku Dodaj.
Typowe konfiguracje
Dla integracji Microsoft Teams korzystającej z aplikacji Dynamics 365 dodaj następujące elementy do frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Dla Dynamics 365 App for Outlook, dodaj następujące elementy do frame-ancestors:
- Pochodzenie strony głównej aplikacji Outlook Web App
https://outlook.office.comhttps://outlook.office365.com
Aby osadzić Power Apps w raportach Power BI, dodaj następujące elementy do frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Ważne uwagi
Wyłączenie dyrektywy domyślnej i zapisanie pustej listy powoduje całkowite wyłączenie dyrektywy i nie jest wysyłana jako część nagłówka odpowiedzi CSP.
Przykłady konfiguracji CSP
Oto kilka przykładów konfiguracji programu CSP.
Przykład 1 – raportowanie wyłączone
W przykładzie:
- Raportowanie jest wyłączone.
- Włączono funkcję wymuszania opartego na modelu.
-
frame-ancestorsjest dostosowany dohttps://www.contoso.comihttps://www.fabrikam.com.
-
- Wykonanie kanw jest wyłączone.
Skuteczne nagłówki to:
- Aplikacje oparte na modelu:
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; - Aplikacje kanwy: nagłówek CSP nie jest wysyłany.
Przykład 2 – raportowanie włączone
W przykładzie:
- Raportowanie jest włączone.
- Punkt końcowy raportowania ustawiony na
https://contoso.com/reporting-endpoint
- Punkt końcowy raportowania ustawiony na
- Włączono funkcję wymuszania opartego na modelu.
-
frame-ancestorsjest zachowywana jako domyślna
-
- Wykonanie kanw jest wyłączone.
-
frame-ancestorsjest dostosowany dohttps://www.contoso.com
-
Obowiązujące wartości CSP to:
- Aplikacje oparte na modelu:
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; - Aplikacje kanwy:
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;
Bezpośrednie modyfikowanie ustawień organizacji
Dostawcę CSP można skonfigurować bez korzystania z interfejsu użytkownika, modyfikując bezpośrednio następujące ustawienia organizacji:
IsContentSecurityPolicyEnabled określa, czy nagłówek zasad zabezpieczeń zawartości jest wysyłany na stronie aplikacji opartych na modelu.
ContentSecurityPolicyConfiguration kontroluje wartość części 'frame-ancestors' (jak pokazano wcześniej, ustawia ją na
'self', jeśliContentSecurityPolicyConfigurationnie jest ustawione). Zdefiniuj to ustawienie przy użyciu obiektu JSON z następującą strukturą —{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Taka konfiguracja przekłada się nascript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';- (Z MDN) Dyrektywa HTTP Content-Security-Policy (CSP) frame-ancestors określa prawidłowych rodziców, którzy mogą osadzić stronę za pomocą
<frame>,<iframe>,<object>,<embed>, lub<applet>.
- (Z MDN) Dyrektywa HTTP Content-Security-Policy (CSP) frame-ancestors określa prawidłowych rodziców, którzy mogą osadzić stronę za pomocą
IsContentSecurityPolicyEnabledForCanvas określa, czy nagłówek zasad zabezpieczeń zawartości jest wysyłany na stronie aplikacji kanwy.
ContentSecurityPolicyConfigurationForCanvas kontroluje zasady dla kanwy przy użyciu tego samego procesu, który opisano w temacie
ContentSecurityPolicyConfiguration.Formant ContentSecurityPolicyReportUri określa, czy raportowanie ma być używane. To ustawienie jest używane zarówno przez aplikacje oparte na modelu, jak i aplikacje kanwy. Prawidłowy ciąg wyśle raporty naruszeń do określonego punktu końcowego przy użyciu trybu tylko raportów, jeśli opcja
IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvasjest wyłączona. Pusty ciąg powoduje wyłączenie raportowania. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą raportowania.
Konfiguracja CSP bez interfejsu użytkownika
W szczególności w środowiskach Power Platform, które nie są dostępne w centrum administracyjnym, lokalny konfiguracji, administratorzy mogą chcieć skonfigurować program CSP za pomocą skryptów w celu bezpośredniej modyfikacji ustawień.
Włączanie dostawcy CSP bez interfejsu użytkownika
Wykonaj następujące kroki, aby włączyć dostawcę CSP bez interfejsu użytkownika:
- Otwórz narzędzia deweloperskie dla przeglądarek, używając aplikacji opartej na modelu jako użytkownika z uprawnieniami do aktualizowania encji organizacji (Administrator systemu jest dobrym rozwiązaniem).
- Wklej i wykonaj poniższy skrypt do konsoli.
- Aby włączyć CSP, należy przekazać konfigurację domyślną —
enableFrameAncestors(["'self'"]) - Przykład włączania innych źródeł pochodzenia w celu osadzenia aplikacji —
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!')
}
Wyłącz dostawcę CSP bez interfejsu użytkownika
Wykonaj następujące kroki, aby wyłączyć dostawcę CSP bez interfejsu użytkownika:
- Otwórz narzędzia deweloperskie dla przeglądarek, używając aplikacji opartej na modelu jako użytkownika z uprawnieniami do aktualizowania encji organizacji (Administrator systemu jest dobrym rozwiązaniem).
- Wklej i wykonaj poniższy skrypt do konsoli.
- Aby wyłączyć CSP, wklej go do konsoli:
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!')
}