Sikkerhedspolitik for indhold
sikkerhedspolitik for indhold (CSP) understøttes i øjeblikket i modelbaseret og lærred Power Apps. Administratorer kan styre, om CSP-headeren sendes og i et omfang, hvad den indeholder. Indstillingerne er på miljøniveau, hvilket betyder, at de vil blive anvendt på alle apps i miljøet, når de er slået til.
Alle komponenter i denne CSP-headerværdi styrer de aktiver, der kan hentes og beskrives mere detaljeret på Mozilla Developer Network (MDN). Standardværdierne vises nedenfor:
Direktiv | Standardværdi | Kan tilpasses |
---|---|---|
script-src | * 'unsafe-inline' 'unsafe-eval' |
Nej |
arbejder-SRC | 'self' blob: |
Nej |
stil-src | * 'unsafe-inline' |
Nej |
skrifttype-src | * data: |
Nej |
ramme-forfædre | 'self' https://*.powerapps.com |
Ja |
Dette resulterer i et standard-CSP for script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;
. I oversigten kan du redigere sidehoveder, der ikke kan tilpasses i øjeblikket.
- For Dynamics 365 kundeengagementsapps og andre modelbaserede apps er CSP kun tilgængelig i onlinemiljøer og i organisationer med Dynamics 365 Customer Engagement (det lokale miljø), version 9.1 eller nyere version.
CSP kan skiftes og konfigureres i Power Platform Administration. Det er vigtigt at aktivere i et udviklings-/testmiljø først , da aktivering af CSP kan begynde at blokere scenarier, hvis politikken overtrædes. Vi understøtter også "kun rapporttilstand", så det bliver nemmere at øge produktionen.
Hvis du vil konfigurere CSP, skal du gå til Power Platform Administration ->Miljøer ->Indstillinger ->Beskyttelse af personlige oplysninger + Sikkerhed. I følgende billede vises standardtilstanden for indstillingerne:
Skift mellem "Aktiver rapportering" styrer, om modelbaserede apps og lærred-apps sender rapporter om overtrædelse. Aktivering af den kræver, slutpunkt angives en værdi. Der sendes overtrædelsesrapporter til denne slutpunkt, uanset om CSP håndhæves eller ej (kun bruge rapporttilstand, hvis CSP ikke håndhæves). Du kan finde flere oplysninger i rapporteringsdokumentationen.
Håndhævelse af CSP styres uafhængigt for modelbaserede apps og lærredsapps for at give detaljeret kontrol over politikker. Brug den modelbaserede pivot/kant pivot til at ændre den tilsigtet apptype.
Skift mellem "Gennemtving indholdssikkerhedspolitik" og standardpolitik for håndhævelse for den angivne apptype. Hvis du slår denne ændring til eller fra, ændres funktionsmåden for apps i dette miljø, så den overholder politikken. Den foreslåede aktiveringsflow vil derfor være:
- Gennemtvinge i et dev/test-miljø.
- Aktivér kun rapporttilstand i produktionen.
- Gennemtvinge i produktion, når der ikke er rapporteret nogen overtrædelse.
I dette afsnit kan du styre, hvad de enkelte personer skal bruge i politikken. I øjeblikket kan frame-ancestors
kun tilpasses.
Når standard direktivet ændres, bruges den standardværdi, der er angivet i tabellen, som er vist tidligere i artiklen. Hvis du slår til/fra,kan administratorer angive brugerdefinerede værdier for direktivet og føje dem til standardværdien. I eksemplet nedenfor angives brugerdefinerede værdier for frame-ancestors
. Direktivet ville være angivet til frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com
i dette eksempel, hvilket vil sige, at appen kan være vært for den samme oprindelse https://*.powerapps.com
, https://www.foo.com
og https://www.bar.com
, men ikke af andre oprindelser. Brug knappen Tilføj til at føje poster til listen og sletteikonet for at fjerne dem.
Ved Microsoft Teams-integration skal du bruge Dynamics 365-appen for at tilføje følgende til frame-ancestors
:
https://teams.microsoft.com/
https://teams.cloud.microsoft/
https://msteamstabintegration.dynamics.com/
Tilføj følgende til frame-ancestors
for Dynamics 365 App for Outlook:
- Startsiden i Outlook Web App
https://outlook.office.com
https://outlook.office365.com
Du kan indlejre Power Apps i Power BI-rapporter ved at føje følgende til frame-ancestors
:
https://app.powerbi.com
https://ms-pbi.pbi.microsoft.com
Hvis du slår standard direktivet fra og gemmer med en tom liste, deaktiveres direktivet fuldstændigt, og det sendes ikke som en del af CSP-svarheaderen.
Lad os se på et par eksempler på konfiguration af CSP:
I eksemplet:
- Rapportering er deaktiveret.
- Modelbaseret håndhævelse er aktiveret.
frame-ancestors
er tilpassethttps://www.foo.com
oghttps://www.bar.com
- Lærred-håndhævelse er deaktiveret.
De effektive overskrifter er:
- Modelbaserede apps:
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;
- Lærred-apps: CSP-header ville ikke blive sendt.
I eksemplet:
- Rapportering er aktiveret.
- Slutpunkt for rapportering er angivet til
https://www.mysite.com/myreportingendpoint
- Slutpunkt for rapportering er angivet til
- Modelbaseret håndhævelse er aktiveret.
frame-ancestors
bevares som standard
- Lærred-håndhævelse er deaktiveret.
frame-ancestors
er tilpasset tilhttps://www.baz.com
De effektive CSP-værdier er:
- Modelbaserede apps:
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;
- Lærredapps:
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;
CSP kan konfigureres uden brug af brugergrænsefladen ved at ændre følgende organisationsindstillinger direkte:
IsContentSecurityPolicyEnabled styrer, om Content-Security-Policy-headeren sendes i modelbaserede apps.
ContentSecurityPolicyConfiguration styrer værdien af frame-ancestors-delen (som vist ovenfor er den angivet til
'self'
ifContentSecurityPolicyConfiguration
not set). Denne indstilling repræsenteres af et JSON-objekt med følgende struktur –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }
. Dette ville oversættes tilscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';
- (Fra MDN) Rammedirektiverne for HTTP-indholdssikkerhedspolitik angiver gyldige overordnede, der kan indlejre en side ved hjælp af
<frame>
,<iframe>
,<object>
,<embed>
eller<applet>
.
- (Fra MDN) Rammedirektiverne for HTTP-indholdssikkerhedspolitik angiver gyldige overordnede, der kan indlejre en side ved hjælp af
IsContentSecurityPolicyEnabledForCanvas styrer, om Content-Security-Policy-headeren sendes i lærredapps.
ContentSecurityPolicyConfigurationForCanvas styrer politikken for lærred ved hjælp af den samme proces, der er beskrevet ovenfor
ContentSecurityPolicyConfiguration
.ContentSecurityPolicyReportUri styrer, om rapportering skal bruges. Denne indstilling bruges af både modelbaserede apps og lærredsapps. En gyldig streng sender rapporter om overtrædelse til den angivne slutpunkt kun at bruge rapporttilstand, hvis
IsContentSecurityPolicyEnabled
/IsContentSecurityPolicyEnabledForCanvas
er deaktiveret. En tom streng deaktiverer rapportering. Du kan finde flere oplysninger i rapporteringsdokumentationen.
Især i forbindelse med miljøer, der ikke er i Power Platform-administration, f.eks. det lokale miljø konfigurationer, kan det være en god ide at konfigurere CSP ved hjælp af scripts for at ændre indstillingerne direkte.
Trin:
- Åbn browser dev-værktøjer, mens du bruger den modelbaserede app som bruger med rettigheder til at opdatere organisationsobjektet (System administrator er en god indstilling).
- Indsæt og udfør scriptet nedenfor i konsollen.
- Hvis du vil aktivere CSP, skal du overføre standardkonfigurationen -
enableFrameAncestors(["'self'"])
- Som et eksempel på at aktivere andre oprindelser til at integrere 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!')
}
Trin:
- Åbn browser dev-værktøjer, mens du bruger den modelbaserede app som bruger med rettigheder til at opdatere organisationsobjektet (System administrator er en god indstilling).
- Indsæt og udfør følgende script i konsollen.
- Indsæt følgende i konsollen for at deaktivere 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!')
}