Sikkerhetspolicy for innhold
sikkerhetspolicy for innhold (CSP) støttes for øyeblikket i modelldrevet og lerret Power Apps. Administratorer kan kontrollere om CSP-hodet sendes og, i en viss utstrekning, hva det inneholder. Innstillingene er på miljønivå, noe som betyr at de vil bli brukt på alle apper i miljøet når de er slått på.
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 |
---|---|---|
skript-src | * 'unsafe-inline' 'unsafe-eval' |
Nei |
arbeider-src | 'self' blob: |
Nei |
stil-src | * 'unsafe-inline' |
Nei |
font-src | * data: |
Nei |
ramme-forfedre | 'self' https://*.powerapps.com |
Ja |
Dette fører til en standard CSP på script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;
. Vi har muligheten til å endre hoder som for øyeblikket ikke kan tilpasses, i veikartet vårt.
Forutsetning
- For Dynamics 365 Customer Engagement-apper og andre modelldrevne apper er CSP bare tilgjengelig i nettbaserte miljøer og i organisasjoner med Dynamics 365 Customer Engagement (lokal), versjon 9.1 eller nyere versjon.
Konfigurere CSP
CSP kan byttes mellom og konfigureres via administrasjonssenteret for Power Platform. Det er viktig å aktivere i et utviklings-/testmiljø først , siden aktivering av CSP kan begynne å blokkere scenarioer hvis policyen brytes. Vi støtter også en "bare rapportmodus" for å muliggjøre enklere opptrapping i produksjonsmiljøet.
Hvis du vil konfigurere CSP, går du til Power Platform-administrasjonssenteret ->Miljøer ->Innstillinger ->Personvern + Sikkerhet. Bildet nedenfor viser standardtilstanden for innstillingene:
Rapporterer
Aktiver rapportering styrer om modelldrevne apper og lerretsapper sender bruddrapporter. Aktivering av den krever at endepunkt må angis. 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.
Veksleknappen Håndhev sikkerhetspolicy for innhold aktiverer standardpolicyen for håndhevelse for den gitte 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
I denne delen kan du styre individuelle direktiver innenfor policyen. For øyeblikket kan frame-ancestors
bare tilpasses.
Hvis du lar standarddirektivet være aktivert, brukes standardverdien angitt i tabellen vist tidligere i denne artikkelen. 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 til å legge til oppføringer i listen og sletteikonet 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.com
https://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.com
https://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
La oss se på et par eksempler på CSP-konfigurasjon:
Eksempel 1
I eksemplet:
- Rapportering er deaktivert.
- Modelldrevet håndhevelse er aktivert.
frame-ancestors
er tilpassethttps://www.foo.com
oghttps://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'; worker-src 'self' blob:; 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
I 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-ancestors
beholdes som standard
- Lerretshåndheving er deaktivert.
frame-ancestors
er tilpassethttps://www.baz.com
De effektive CSP-verdiene vil være følgende:
- Modelldrevne apper:
Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; 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;
Organisasjonsinnstillinger
CSP kan konfigureres uten å bruke brukergrensesnittet ved å endre følgende organisasjonsinnstillinger direkte:
IsContentSecurityPolicyEnabled kontrollerer om Content-Security-Policy-hodet sendes i modelldrevne apper.
ContentSecurityPolicyConfiguration kontrollerer verdien for frame-ancestors-delen (som vist ovenfor, den er satt til
'self'
hvisContentSecurityPolicyConfiguration
er ikke angitt). Denne innstillingen representeres av et JSON-objekt med følgende struktur –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }
. Dette kan 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 kontrollerer om Content-Security-Policy-hodet sendes i lerretsapper.
ContentSecurityPolicyConfigurationForCanvas kontrollerer policyen for lerret ved hjelp av samme prosess som er beskrevet ovenfor
ContentSecurityPolicyConfiguration
.ContentSecurityPolicyReportUri kontrollerer 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
/IsContentSecurityPolicyEnabledForCanvas
er 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
Trinn:
- Å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å hvordan du aktiverer andre opprinnelser 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!')
}
Deaktivere CSP uten brukergrensesnitt
Trinn:
- Å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 følgende skript 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!')
}