Condividi tramite


Criteri di sicurezza contenuto

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

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>'
worker-src 'self' blob: 'self' blob: No
style-src 'self' 'unsafe-inline' <platform> 'self' 'unsafe-inline' <platform>
font-src 'self' data: <platform> 'self' data: <platform>
frame-ancestors 'self' https://*.powerapps.com 'self' https://*.powerapps.com
img-src 'self' blob: data: <platform> 'self' data: <platform>
connect-src 'self' blob: data: wss: <platform> 'self' blob: <platform>
frame-src 'self' blob: <platform> 'self' <platform>
base-uri 'none' N/A No
form-action <platform> N/A
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:

  1. Accedi all'interfaccia di amministrazione di Power Platform.
  2. Nel riquadro di spostamento seleziona Gestisci. Nel riquadro Gestisci, seleziona Ambienti.
  3. Nella pagina Ambienti seleziona un ambiente.
  4. Seleziona Impostazioni nella barra dei comandi.
  5. Espandi Prodotto, quindi seleziona Privacy + Sicurezza.

L'immagine seguente mostra lo stato predefinito delle impostazioni:

Impostazioni predefinite dei criteri di sicurezza contenuto.

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.

L'interruttore Abilita creazione report attivato.

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:

  1. Applicare i criteri in un ambiente di sviluppo o test.
  2. Abilita la modalità solo report in produzione.
  3. 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 .

Configura direttive CSP.

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.

Impostazione delle direttive CSP personalizzate.

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.com
  • https://outlook.office365.com

Per l'integrazione di Power Apps nei report Power BI, aggiungi quanto segue a frame-ancestors:

  • https://app.powerbi.com
  • https://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

Esempio CSP 1, basato su modello

Esempio CSP 1, canvas

Nell'esempio:

  • La creazione di report è disattivata.
  • L'applicazione basata su modello è abilitata.
    • frame-ancestors è personalizzato in https://www.contoso.com e https://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

Esempio CSP 2, basato su modello

Esempio CSP 2, canvas

Nell'esempio:

  • La creazione di report è attivata.
    • L'endpoint di creazione di report è impostato su https://contoso.com/reporting-endpoint
  • L'applicazione basata su modello è abilitata.
    • frame-ancestors viene mantenuto come impostazione predefinita
  • L'applicazione canvas è disabilitata.
    • frame-ancestors è personalizzato per https://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' se ContentSecurityPolicyConfiguration non è impostato). Definire questa impostazione usando un oggetto JSON con la struttura seguente: { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Questa configurazione si traduce in script-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>.
  • 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!')
}