Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I criteri di sicurezza del contenuto (CSP) sono attualmente supportati nelle app basate su modello, canvas e codice. Questo articolo illustra come configurare CSP per le app basate su modello e canvas. Per le app di codice CSP, vedere la documentazione relativa alle app di codice. Gli amministratori possono controllare se l'intestazione CSP viene inviata e, in una certa misura, cosa contiene. Le impostazioni sono a livello di ambiente, il che significa che vengono applicate a tutte le app nell'ambiente dopo l'attivazione.
Nota
I criteri di sicurezza contenuto si applicano solo agli ambienti che utilizzano Dataverse.
Ogni componente del valore dell'intestazione CSP controlla gli asset che possono essere scaricati. Mozilla Developer Network (MDN) fornisce descrizioni più dettagliate. I valori predefiniti sono i seguenti:
| Direttiva | Valore predefinito | Personalizzabile |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: |
No |
| worker-src | 'self' blob: |
No |
| style-src | * 'unsafe-inline' |
No |
| font-src | * data: |
No |
| frame-ancestors | 'self' https://*.powerapps.com |
Sì |
Questa configurazione determina un CSP predefinito di script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.
Modalità strict
Il toggle Strict CSP crea criteri di sicurezza contenuto che per lo più non includono caratteri jolly o direttive non sicure, ad esempio unsafe-inline. Quando si attiva Strict CSP, le direttive precedenti diventano le direttive seguenti descritte in questa sezione. La <platform> notazione indica che i domini della piattaforma vengono forniti come richiesto dal prodotto. I domini in questa sezione potrebbero cambiare nel tempo man mano che il prodotto cresce.
| Direttiva | Valore predefinito (basato su modello) | Impostazione predefinita (canvas) | Personalizzabile |
|---|---|---|---|
| script-src | 'self' blob: <platform>' |
'self' <platform>' |
Sì |
| worker-src | 'self' blob: |
'self' blob: |
No |
| style-src | 'self' 'unsafe-inline' <platform> |
'self' 'unsafe-inline' <platform> |
Sì |
| font-src | 'self' data: <platform> |
'self' data: <platform> |
Sì |
| frame-ancestors | 'self' https://*.powerapps.com |
'self' https://*.powerapps.com |
Sì |
| img-src | 'self' blob: data: <platform> |
'self' data: <platform> |
Sì |
| connect-src | 'self' blob: data: wss: <platform> |
'self' blob: <platform> |
Sì |
| frame-src | 'self' blob: <platform> |
'self' <platform> |
Sì |
| base-uri | 'none' |
N/A | No |
| form-action | <platform> |
N/A | Sì |
| default-src | 'self' |
'self' |
No |
Prerequisiti
Per le app Dynamics 365 Customer Engagement e altre app basate su modello, CSP è disponibile solo negli ambienti online e nelle organizzazioni con Dynamics 365 Customer Engagement (on-premises), versione 9.1 o versione successiva.
Configura CSP
È possibile attivare e configurare CSP tramite l'interfaccia di amministrazione di Power Platform. È importante abilitare un ambiente di sviluppo/test perché l'abilitazione di CSP potrebbe avviare scenari di blocco in caso di violazione dei criteri. L'interfaccia di amministrazione supporta anche una modalità di sola creazione di report per consentire una maggiore espansione nell'ambiente di produzione.
Per configurare CSP, seguire questa procedura:
- Accedi all'interfaccia di amministrazione di Power Platform.
- Nel riquadro di spostamento seleziona Gestisci. Nel riquadro Gestisci, seleziona Ambienti.
- Nella pagina Ambienti seleziona un ambiente.
- Seleziona Impostazioni nella barra dei comandi.
- Espandi Prodotto, quindi seleziona Privacy + Sicurezza.
L'immagine seguente mostra lo stato predefinito delle impostazioni:
Report
L'interruttore Abilita creazione report controlla se le app basate su modello e canvas inviano segnalazioni di violazione. Per abilitarla, specificare un endpoint. L'app invia segnalazioni di violazioni a questo endpoint indipendentemente dal fatto che la CSP sia applicata o meno. Se CSP non viene applicato, l'app usa la modalità di sola segnalazione. Per altre informazioni, vedi la documentazione sulla creazione di report.
Applicazione
L'applicazione del CSP è controllata in modo indipendente per le app basate su modello e canvas per fornire un controllo granulare sui criteri. Usa il pivot basato su modello/canvas per modificare il tipo di app previsto.
L'interruttore Abilita criteri di sicurezza contenuto attiva i criteri predefiniti per l'applicazione per il tipo di app specificato. L'attivazione di questo interruttore cambia il comportamento delle app in questo ambiente per aderire alle norme. Di conseguenza, seguire questo flusso di abilitazione suggerito:
- Applicare i criteri in un ambiente di sviluppo o test.
- Abilita la modalità solo report in produzione.
- Applicare i criteri nell'ambiente di produzione una volta che non vengono segnalate violazioni.
Configura direttive
La sezione Configura direttive consente di controllare le singole direttive all'interno dei criteri. Attualmente, è possibile personalizzare solo la frame-ancestors direttiva .
Se si lascia attiva la direttiva predefinita, si utilizza il valore predefinito specificato nella tabella. Se si disattiva l'interruttore, è possibile specificare valori personalizzati per la direttiva e aggiungerli al valore predefinito. Nell'esempio seguente vengono impostati valori personalizzati per frame-ancestors. La direttiva è impostata su frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com in questo esempio. Questa impostazione indica che l'app può essere ospitata nella stessa origine, https://*.powerapps.com, https://www.foo.com, e https://www.bar.com, ma non in altre origini. Utilizza il pulsante Aggiungi per aggiungere voci all'elenco e l'icona Elimina per rimuoverle.
Configurazioni comuni
Per l'integrazione di Microsoft Teams tramite l'app Dynamics 365, aggiungi quanto segue a frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Per Dynamics 365 App for Outlook, aggiungi quanto segue a frame-ancestors:
- Origine della home page di Outlook Web App
https://outlook.office.comhttps://outlook.office365.com
Per l'integrazione di Power Apps nei report Power BI, aggiungi quanto segue a frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Considerazioni importanti
La disattivazione della direttiva predefinita e il salvataggio con un elenco vuoto disattiva completamente la direttiva e non la invia come parte dell'intestazione della risposta CSP.
Esempi di configurazioni CSP
Ecco alcuni esempi di configurazioni CSP.
Esempio 1 - creazione di report disattivata
Nell'esempio:
- La creazione di report è disattivata.
- L'applicazione basata su modello è abilitata.
-
frame-ancestorsè personalizzato inhttps://www.contoso.comehttps://www.fabrikam.com.
-
- L'applicazione canvas è disabilitata.
Le intestazioni valide sono:
- App basate su modello:
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; - Canvas apps: l'intestazione CSP non viene inviata.
Esempio 2 - creazione di report attivata
Nell'esempio:
- La creazione di report è attivata.
- L'endpoint di creazione di report è impostato su
https://contoso.com/reporting-endpoint
- L'endpoint di creazione di report è impostato su
- L'applicazione basata su modello è abilitata.
-
frame-ancestorsviene mantenuto come impostazione predefinita
-
- L'applicazione canvas è disabilitata.
-
frame-ancestorsè personalizzato perhttps://www.contoso.com
-
I valori CSP effettivi sono:
- App basate su modello:
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; - App canvas:
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;
Modificare direttamente le impostazioni dell'organizzazione
È possibile configurare CSP senza utilizzare l'interfaccia utente modificando direttamente queste impostazioni dell'organizzazione:
IsContentSecurityPolicyEnabled controlla se l'intestazione Content-Security-Policy viene inviata nelle app basate su modello.
ContentSecurityPolicyConfiguration controlla il valore della parte frame-ancestors (come illustrato in precedenza, lo imposta su
'self'seContentSecurityPolicyConfigurationnon è impostato). Definire questa impostazione usando un oggetto JSON con la struttura seguente:{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Questa configurazione si traduce inscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';- (Da MDN) La direttiva frame-ancestors HTTP Content-Security-Policy (CSP) specifica i genitori validi che possono incorporare una pagina utilizzando
<frame>,<iframe>,<object>,<embed>, o<applet>.
- (Da MDN) La direttiva frame-ancestors HTTP Content-Security-Policy (CSP) specifica i genitori validi che possono incorporare una pagina utilizzando
IsContentSecurityPolicyEnabledForCanvas controlla se l'intestazione Content-Security-Policy viene inviata nelle app canvas.
ContentSecurityPolicyConfigurationForCanvas controlla i criteri per canvas utilizzando lo stesso processo descritto in
ContentSecurityPolicyConfiguration.ContentSecurityPolicyReportUri controlla se la creazione di report deve essere utilizzata. Questa impostazione viene utilizzata sia dalle app basate su modello che da quelle canvas. Una stringa valida invia i report di violazione al endpoint specificato, utilizzando la modalità solo report se
IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvasè disattivato. Una stringa vuota disabilita la creazione di report. Per altre informazioni, vedi la documentazione sulla creazione di report.
Configurazione di CSP senza interfaccia utente
Soprattutto per ambienti fuori dall'interfaccia di amministrazione di Power Platform come le configurazioni locali, gli amministratori potrebbero voler configurare CSP utilizzando gli script per modificare direttamente le impostazioni.
Abilitare CSP senza interfaccia utente
Per abilitare CSP senza interfaccia utente, segui questi passaggi:
- Apri gli strumenti di sviluppo del browser mentre utilizzi l'app basata su modello come utente con privilegi di aggiornamento dell'entità dell'organizzazione (Amministratore di sistema è una buona opzione).
- Incolla ed esegui lo script seguente nella console.
- Per abilitare la funzionalità CSP, passa la configurazione predefinita -
enableFrameAncestors(["'self'"]) - Come esempio di abilitazione di origini aggiuntive per incorporare l'app -
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!')
}
Disabilitare CSP senza interfaccia utente
Per disabilitare CSP senza interfaccia utente, segui questi passaggi:
- Apri gli strumenti di sviluppo del browser mentre utilizzi l'app basata su modello come utente con privilegi di aggiornamento dell'entità dell'organizzazione (Amministratore di sistema è una buona opzione).
- Incolla ed esegui lo script seguente nella console.
- Per disabilitare CSP, incolla nella console:
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!')
}