Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Innholdssikkerhetspolicy (CSP) støttes for øyeblikket i modelldrevne apper og lerretsapper. Administratorer kan kontrollere om CSP-hodet sendes og, i en viss utstrekning, hva det inneholder. Innstillingene er på miljønivå, noe som betyr at det brukes på alle apper i miljøet når de er aktivert.
Notat
Sikkerhetspolicyen for innhold gjelder bare for miljøer som bruker Dataverse.
Hver komponent i CSP-hodeverdien styrer ressursene som kan lastes ned, og er beskrevet mer detaljert i Mozilla Developer Network (MDN): Standardverdiene vises nedenfor:
| Direktiv | Standardverdi | Kan tilpasses |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: data: |
Nei |
| worker-src | 'self' blob: data: |
Nei |
| style-src | * 'unsafe-inline' |
Nei |
| font-src | * data: |
Nei |
| frame-ancestors | 'self' https://*.powerapps.com |
Ja |
Denne konfigurasjonen resulterer i en standard CSP for script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.
Streng modus
Veksleknappen Streng CSP oppretter en policy for innholdssikkerhet som for det meste ikke inneholder jokertegn eller usikre direktiver, for eksempel unsafe-inline. Når streng CSP er aktivert, blir direktivene som er beskrevet i den forrige tabellen, til direktivene som er beskrevet i tabellen nedenfor. Notasjonen <platform> betyr at plattformdomener leveres etter behov av produktet. Domenene i denne delen kan endres over tid etter hvert som produktet vokser.
Notat
Streng CSP er for øyeblikket bare tilgjengelig for modelldrevne apper.
| Direktiv | Standardverdi (modelldrevet) | Kan tilpasses |
|---|---|---|
| script-src | 'self' blob: data: <platform>' |
Ja |
| worker-src | 'self' blob: data: |
Nei |
| style-src | 'self' 'unsafe-inline' <platform> |
Ja |
| font-src | 'self' data: <platform> |
Ja |
| frame-ancestors | 'self' https://*.powerapps.com |
Ja |
| img-src | 'self' blob: data: <platform> |
Ja |
| connect-src | 'self' blob: data: wss: <platform> |
Ja |
| ramme-src | 'self' blob: <platform> |
Ja |
| base-uri | 'none' |
Nei |
| skjemahandling | <platform> |
Ja |
| standard-src | 'self' |
Nei |
Forutsetning
For Dynamics 365-Customer Engagement-apper og andre modelldrevne apper er CSP bare tilgjengelig i nettbaserte miljøer og organisasjoner med Dynamics 365 Customer Engagement (on-premises), versjon 9.1 eller nyere versjon.
Konfigurer CSP
Du kan veksle og konfigurere CSP via administrasjonssenteret Power Platform . Det er viktig å aktivere et utviklings-/testmiljø først , siden aktivering av CSP kan begynne å blokkere scenarier hvis policyen brytes. Vi støtter også en rapportmodus for å tillate enklere opptrapping i produksjonen.
Slik konfigurerer du CSP:
- Logg på Power Platform-administrasjonssenteret.
- I navigasjonsruten velger du Behandle, og deretter velger du Miljøer i Behandle-ruten .
- Velg et miljø på Miljøer-siden .
- Velg Innstillinger på kommandolinjen.
- Utvid Produkt, og velg deretter Personvern + sikkerhet.
Bildet nedenfor viser standardtilstanden for innstillingene:
Rapporterer
Veksleknappen Aktiver rapportering kontrollerer om modelldrevne apper og lerretsapper sender bruddrapporter. Du må angi et endepunkt for å aktivere det. Bruddrapporter sendes til dette endepunktet uavhengig av om CSP håndheves eller ikke (ved bruk av bare rapportmodus hvis CSP ikke håndheves). Hvis du vil ha mer informasjon, kan du se rapportdokumentasjon.
Håndhevelse
Håndhevelse av CSP styres uavhengig av modelldrevne apper og lerretsapper for å gi detaljert kontroll over policyene. Bruk den modelldrevne/lerretspivoten til å endre den tiltenkte apptypen.
Aktiver policy for innholdssikkerhet aktiverer standardpolicyen for håndhevelse av innholdssikkerhet for den angitte apptypen. Hvis du aktiverer denne veksleknappen, endres funksjonaliteten til apper i dette miljøet slik at de overholder policyen. Den foreslåtte aktiveringsflyten vil derfor være følgende:
- Bruk på et dev/test-miljø.
- Aktiver modus for bare rapport i produksjon.
- Bruk i produksjon straks ingen brudd er rapportert.
Konfigurer direktiver
Med delen Konfigurer direktiver kan du kontrollere individuelle direktiver i policyen. For øyeblikket kan frame-ancestors bare tilpasses.
Hvis du lar standarddirektivet være aktivert, brukes standardverdien som er angitt i tabellen. Hvis du deaktiverer veksleknappen, kan administratorer angi egendefinerte verdier for direktivet og legge dem til i standardverdien. Eksemplet nedenfor angir egendefinerte verdier for frame-ancestors. I dette eksemplet hadde frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com blitt angitt for direktivet, som betyr at appen kunne ha blitt driftet i samme opprinnelse, https://*.powerapps.com, https://www.foo.com og https://www.bar.com, men ikke i andre opprinnelser. Bruk Legg til-knappen for å legge til oppføringer i listen og Slett-ikonet for å fjerne dem.
Vanlige konfigurasjoner
For Microsoft Teams-integrering som bruker Dynamics 365-appen legg til følgende i frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Legg til følgende i frame-ancestors for Dynamics 365 App for Outlook:
- Opprinnelsen til startsiden for Outlook Web App
https://outlook.office.comhttps://outlook.office365.com
Hvis du vil bygge inn Power Apps i Power BI-rapporter, legger du til følgende i frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Viktige hensyn
Hvis du deaktiverer standarddirektivet og lagrer med en tom liste, deaktiveres direktivet fullstendig, og det sendes ikke som en del av CSP-svarhodet.
Eksempler på CSP-konfigurasjon
La oss ta en titt på et par eksempler på CSP-konfigurasjoner.
Eksempel 1 – rapportering deaktivert
Se på eksemplet:
- Rapportering er deaktivert.
- Modelldrevet håndhevelse er aktivert.
-
frame-ancestorstilpasses tilhttps://www.foo.comoghttps://www.bar.com
-
- Lerretshåndheving er deaktivert.
De effektive overskriftene vil være følgende:
- Modelldrevne apper:
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.foo.com https://www.bar.com; - Lerretsapper: CSP-overskrift ville ikke bli sendt.
Eksempel 2 – rapportering slått på
Se på eksemplet:
- Rapportering er aktivert.
- Endepunkt for rapportering er satt til
https://www.mysite.com/myreportingendpoint
- Endepunkt for rapportering er satt til
- Modelldrevet håndhevelse er aktivert.
-
frame-ancestorsbeholdes som standard
-
- Lerretshåndheving er deaktivert.
-
frame-ancestorstilpasses tilhttps://www.baz.com
-
De effektive CSP-verdiene vil være følgende:
- Modelldrevne apper:
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 'self' https://*.powerapps.com; report-uri https://www.mysite.com/myreportingendpoint; - Lerretsapper:
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.baz.com; report-uri https://www.mysite.com/myreportingendpoint;
Endre organisasjonsinnstillinger direkte
Du kan konfigurere CSP uten å bruke brukergrensesnittet ved å endre disse organisasjonsinnstillingene direkte:
IsContentSecurityPolicyEnabled styrer om hodet for innholdssikkerhetspolicy sendes i modelldrevne apper.
ContentSecurityPolicyConfiguration kontrollerer verdien for frame-ancestors-delen (som vist ovenfor, den settes til
'self'ifContentSecurityPolicyConfigurationer ikke angitt). Denne innstillingen defineres ved hjelp av et JSON-objekt med følgende struktur –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Denne konfigurasjonen oversettes tilscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';- (Fra MDN) Rammedirektivene for HTTP-innholdssikkerhetspolitikk angir gyldige overordnede som kan bygge inn en side ved hjelp
<frame>,<iframe>,<object>,<embed>eller<applet>.
- (Fra MDN) Rammedirektivene for HTTP-innholdssikkerhetspolitikk angir gyldige overordnede som kan bygge inn en side ved hjelp
IsContentSecurityPolicyEnabledForCanvas styrer om hodet for innholdssikkerhetspolicy sendes i lerretsapper.
ContentSecurityPolicyConfigurationForCanvas kontrollerer policyen for lerret ved hjelp av samme prosess som er beskrevet i
ContentSecurityPolicyConfiguration.ContentSecurityPolicyReportUri styrer om rapportering skal brukes. Denne innstillingen brukes av både modelldrevne apper og lerretsapper. En gyldig streng sender bruddrapporter til det angitte endepunkt ved hjelp av modus for bare rapporter hvis
IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvaser deaktivert. En tom streng deaktiverer rapportering. Hvis du vil ha mer informasjon, kan du se rapportdokumentasjon.
Konfigurere CSP uten grensesnitt
Spesielt for miljøer som ikke er i Power Platform-administrasjonssenteret, for eksempel lokale konfigurasjoner, kan administratorer ønske å konfigurere CSP ved hjelp av skript for å endre innstillingene direkte.
Aktivere CSP uten brukergrensesnitt
Utfør disse trinnene for å aktivere CSP uten brukergrensesnitt:
- Åpne nettleserutviklingsverktøy samtidig som du bruker den modelldrevne appen som en bruker med oppdateringsrettigheter for organisasjonsenheten (systemadministrator er et godt alternativ).
- Lim inn og kjør skriptet nedenfor i konsollen.
- Hvis du vil aktivere CSP, sender du standardkonfigurasjonen –
enableFrameAncestors(["'self'"]) - Som et eksempel på aktivering av ytterligere opprinnelse for å bygge inn appen –
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!')
}
Deaktiver CSP uten brukergrensesnitt
Følg disse trinnene for å deaktivere CSP uten brukergrensesnitt:
- Åpne nettleserutviklingsverktøy samtidig som du bruker den modelldrevne appen som en bruker med oppdateringsrettigheter for organisasjonsenheten (systemadministrator er et godt alternativ).
- Lim inn og kjør skriptet nedenfor i konsollen.
- Hvis du vil deaktivere CSP, limer du inn i konsollen:
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!')
}