Κοινοποίηση μέσω


Πολιτική ασφάλειας περιεχομένου

Η Πολιτική ασφάλειας περιεχομένου (CSP) υποστηρίζεται προς το παρόν σε εφαρμογές βάσει μοντέλου, καμβά και κώδικα. Αυτό το άρθρο εξηγεί πώς μπορείτε να ρυθμίσετε τις παραμέτρους CSP για εφαρμογές βάσει μοντέλου και καμβά. Για εφαρμογές κώδικα CSP, ανατρέξτε στην τεκμηρίωση για εφαρμογές κώδικα. Οι διαχειριστές μπορούν να ελέγχουν εάν αποστέλλεται η κεφαλίδα CSP και, ως ένα βαθμό, τι περιέχει. Οι ρυθμίσεις βρίσκονται στο επίπεδο περιβάλλοντος, το οποίο σημαίνει ότι εφαρμόζονται σε όλες τις εφαρμογές στο περιβάλλον αφού ενεργοποιηθούν.

Σημείωμα

Η πολιτική ασφάλειας περιεχομένου ισχύει μόνο για περιβάλλοντα που χρησιμοποιούν Dataverse.

Κάθε συστατικό της τιμής κεφαλίδας CSP ελέγχει τα στοιχεία που μπορούν να ληφθούν. Το Δίκτυο προγραμματιστών Mozilla (MDN) παρέχει πιο λεπτομερείς περιγραφές. Οι προεπιλεγμένες τιμές είναι οι εξής:

Οδηγία Προεπιλεγμένη τιμή Προσαρμόσιμα
script-src * 'unsafe-inline' 'unsafe-eval' blob: Όχι
worker-src 'self' blob: Όχι
style-src * 'unsafe-inline' Όχι
font-src * data: Όχι
frame-ancestors 'self' https://*.powerapps.com Ναι

Αυτή η ρύθμιση παραμέτρων έχει ως αποτέλεσμα μια προεπιλεγμένη CSP του script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Αυστηρή λειτουργία

Η αυστηρή εναλλαγή CSP δημιουργεί ένα CSP που ως επί το πλείστον δεν περιλαμβάνει χαρακτήρες μπαλαντέρ ή μη ασφαλείς οδηγίες, όπως unsafe-inline. Όταν ενεργοποιείτε την αυστηρή CSP, οι προηγούμενες οδηγίες γίνονται οι ακόλουθες οδηγίες που περιγράφονται στην παρούσα ενότητα. Η <platform> σημείωση σημαίνει ότι οι τομείς πλατφόρμας παρέχονται όπως απαιτείται από το προϊόν. Οι τομείς σε αυτή την ενότητα μπορεί να αλλάξουν με την πάροδο του χρόνου καθώς μεγαλώνει το προϊόν.

Οδηγία Προεπιλεγμένη τιμή (βάσει μοντέλου) Προεπιλεγμένη τιμή (καμβάς) Προσαρμόσιμα
script-src 'self' blob: <platform>' 'self' <platform>' Ναι
worker-src 'self' blob: 'self' blob: Όχι
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' ΔΙ Όχι
form-action <platform> ΔΙ Ναι
default-src 'self' 'self' Όχι

Προαπαιτούμενα στοιχεία

Για Dynamics 365 εφαρμογές δέσμευσης πελατών και άλλες εφαρμογές βάσει μοντέλου, η CSP είναι διαθέσιμη μόνο σε online περιβάλλοντα και σε οργανισμούς με Dynamics 365 customer engagement (on-premises), έκδοση 9.1 ή νεότερη έκδοση.

Ρυθμίστε τις παραμέτρους CSP

Μπορείτε να αλλάξετε και να ρυθμίσετε τις παραμέτρους CSP μέσω του κέντρου διαχείρισης Power Platform. Είναι σημαντικό να ενεργοποιήσετε πρώτα ένα περιβάλλον ανάπτυξης/δοκιμής, καθώς η ενεργοποίηση του CSP θα μπορούσε να ξεκινήσει τον αποκλεισμό σεναρίων εάν παραβιαστεί η πολιτική. Το κέντρο διαχείρισης υποστηρίζει επίσης μια λειτουργία μόνο για αναφορές , ώστε να διευκολύνεται η αύξηση της παραγωγής.

Ακολουθήστε αυτά τα βήματα για να ρυθμίσετε τις παραμέτρους CSP:

  1. Εισέλθετε στο Κέντρο διαχείρισης του Power Platform.
  2. Στο παράθυρο περιήγησης, επιλέξτε Διαχείριση. Στο τμήμα παραθύρου Διαχείριση, επιλέξτε Περιβάλλοντα.
  3. Στη σελίδα Περιβάλλοντα, επιλέξτε ένα περιβάλλον.
  4. Στη γραμμή εντολών επιλέξτε Ρυθμίσεις.
  5. Αναπτύξτε το Προϊόν, κι, έπειτα, επιλέξτε Ιδιωτικό απόρρητο + Ασφάλεια.

Η εικόνα που ακολουθεί εμφανίζει την προεπιλεγμένη κατάσταση των ρυθμίσεων:

Προεπιλεγμένες ρυθμίσεις της πολιτικής ασφαλείας περιεχομένου.

Υποβολή αναφοράς

Η εναλλαγή Ενεργοποίηση αναφοράς ελέγχει αν οι εφαρμογές βάσει μοντέλου και οι εφαρμογές καμβά στέλνουν αναφορές παραβίασης. Για να την ενεργοποιήσετε, καθορίστε ένα τελικό σημείο. Η εφαρμογή στέλνει αναφορές παραβίασης σε αυτό το τελικό σημείο, ανεξάρτητα από το αν επιβάλλεται το CSP ή όχι. Εάν δεν επιβληθεί CSP, η εφαρμογή χρησιμοποιεί λειτουργία μόνο αναφοράς. Για περισσότερες πληροφορίες, δείτε τεκμηρίωση υποβολής αναφορών.

Ενεργοποιήστε την εναλλαγή αναφορών.

Επιβολή

Η εφαρμογή του CSP ελέγχεται ανεξάρτητα για εφαρμογές βάσει μοντέλου και εφαρμογές καμβά, ώστε να παρέχει λεπτομερή έλεγχο στις πολιτικές. Χρησιμοποιήστε τη συγκεντρωτική προβολή βάσει μοντέλου/καμβά για να τροποποιήσετε τον προβλεπόμενο τύπο εφαρμογής.

Το κουμπί εναλλαγής Επιβολή πολιτικής ασφάλειας περιεχομένου ενεργοποιεί την προεπιλεγμένη πολιτική για επιβολή για τον δεδομένο τύπο εφαρμογής. Με την ενεργοποίηση αυτής της εναλλαγής αλλάζει η συμπεριφορά των εφαρμογών σε αυτό το περιβάλλον ώστε να συμμορφώνεται με την πολιτική. Επομένως, ακολουθήστε αυτήν την προτεινόμενη ροή ενεργοποίησης:

  1. Επιβάλλετε την πολιτική σε ένα περιβάλλον ανάπτυξης ή δοκιμής.
  2. Ενεργοποίηση λειτουργίας μόνο αναφοράς στην παραγωγή.
  3. Επιβάλλετε την πολιτική στην παραγωγή όταν δεν αναφέρονται παραβιάσεις.

Ρύθμιση παραμέτρων για οδηγίες

Η ενότητα Ρύθμιση οδηγιών σάς επιτρέπει να ελέγχετε τις μεμονωμένες οδηγίες εντός της πολιτικής. Προς το παρόν, μπορείτε μόνο να προσαρμόσετε την frame-ancestors οδηγία.

Ρύθμιση παραμέτρων οδηγιών CSP.

Εάν αφήσετε ενεργοποιημένη την προεπιλεγμένη οδηγία, χρησιμοποιήστε την προεπιλεγμένη τιμή που καθορίζεται στον πίνακα. Εάν απενεργοποιήσετε το κουμπί εναλλαγής, μπορείτε να καθορίσετε προσαρμοσμένες τιμές για την οδηγία και να τις προσαρτήσετε στην προεπιλεγμένη τιμή. Το παρακάτω παράδειγμα ορίζει προσαρμοσμένες τιμές για frame-ancestors. Σε αυτό το παράδειγμα, η οδηγία καθορίζεται σε frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com. Αυτή η ρύθμιση σημαίνει ότι η εφαρμογή μπορεί να φιλοξενείται στην ίδια προέλευση, , https://*.powerapps.comhttps://www.foo.comκαι https://www.bar.com, αλλά όχι σε άλλη προέλευση. Χρησιμοποιήστε το κουμπί Προσθήκη για να προσθέσετε καταχωρήσεις στη λίστα και το εικονίδιο Διαγραφή για να τις καταργήσετε.

Ρύθμιση προσαρμοσμένων οδηγιών CSP.

Συνήθεις ρυθμίσεις παραμέτρων

Για ενοποίηση του Microsoft Teams με χρήση της εφαρμογής Dynamics 365, προσθέστε τα εξής: frame-ancestors

  • https://teams.microsoft.com/
  • https://teams.cloud.microsoft/
  • https://msteamstabintegration.dynamics.com/

Για το Dynamics 365 App for Outlook, προσθέστε τα παρακάτω στο frame-ancestors:

  • Προέλευση αρχικής σελίδας της εφαρμογής Web του Outlook
  • https://outlook.office.com
  • https://outlook.office365.com

Για ενσωμάτωση του Power Apps σε αναφορές Power BI, προσθέστε τα εξής στο frame-ancestors:

  • https://app.powerbi.com
  • https://ms-pbi.pbi.microsoft.com

Σημαντικές επισημάνσεις

Εάν απενεργοποιήσετε την προεπιλεγμένη οδηγία και την αποθηκεύσετε με μια κενή λίστα απενεργοποιεί την οδηγία πλήρως και δεν την αποστέλλει ως μέρος της κεφαλίδας απόκρισης CSP.

Παραδείγματα ρύθμισης CSP

Ακολουθούν μερικά παραδείγματα ρυθμίσεων παραμέτρων CSP.

Παράδειγμα 1 - η αναφορά απενεργοποιήθηκε

Παράδειγμα CSP 1, βάσει μοντέλου

Παράδειγμα CSP 1, καμβάς

Στο παράδειγμα:

  • Η αναφορά είναι απενεργοποιημένη.
  • Η εφαρμογή βάσει μοντέλου είναι ενεργοποιημένη.
    • frame-ancestors Το προσαρμόζεται στα https://www.contoso.com και https://www.fabrikam.com.
  • Η εφαρμογή καμβά απενεργοποιείται.

Οι αποτελεσματικές κεφαλίδες είναι οι εξής:

  • Εφαρμογές βάσει μοντέλου: 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;
  • Εφαρμογές καμβά: Η κεφαλίδα CSP δεν αποστέλλεται.

Παράδειγμα 2 - η αναφορά ενεργοποιήθηκε

Παράδειγμα CSP 2, βάσει μοντέλου

Παράδειγμα CSP 2, καμβάς

Στο παράδειγμα:

  • Η αναφορά είναι ενεργοποιημένη.
    • Το τελικό σημείο αναφοράς έχει οριστεί σε https://contoso.com/reporting-endpoint
  • Η εφαρμογή βάσει μοντέλου είναι ενεργοποιημένη.
    • Το frame-ancestors διατηρείται ως προεπιλεγμένο
  • Η εφαρμογή καμβά απενεργοποιείται.
    • Το frame-ancestors είναι προσαρμοσμένο στο https://www.contoso.com

Οι αποτελεσματικές τιμές CSP είναι οι εξής:

  • Εφαρμογές βάσει μοντέλου: 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;
  • Εφαρμογές καμβά: 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;

Άμεση τροποποίηση ρυθμίσεων οργανισμού

Μπορείτε να ρυθμίσετε τις παραμέτρους CSP χωρίς να χρησιμοποιήσετε το περιβάλλον εργασίας χρήστη, τροποποιώντας απευθείας αυτές τις ρυθμίσεις οργανισμού:

  • Το IsContentSecurityPolicyEnabled ελέγχει αν η κεφαλίδα Content-Security-Policy header αποστέλλεται σε εφαρμογές βάσει μοντέλου.

  • Το ContentSecurityPolicyConfiguration ελέγχει την τιμή του τμήματος πλαισίου-προγόνων (όπως φαίνεται παραπάνω, ορίζει σε 'self' εάν ContentSecurityPolicyConfiguration δεν έχει οριστεί). Καθορίστε αυτήν τη ρύθμιση χρησιμοποιώντας ένα αντικείμενο JSON με την ακόλουθη δομή , { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Αυτή η ρύθμιση μεταφράζεται σε script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Από το MDN) Η οδηγία frame-ancestors ασφαλείας περιεχομένου HTTP (CSP) καθορίζει τους έγκυρους γονικούς τύπους που μπορούν να ενσωματώσουν μια σελίδα χρησιμοποιώντας τα <frame>, <iframe>, <object><embed> ή<applet>.
  • Το IsContentSecurityPolicyEnabledForCanvas ελέγχει αν η κεφαλίδα Content-Security-Policy header αποστέλλεται σε εφαρμογές καμβά.

  • Το ContentSecurityPolicyConfigurationForCanvas ελέγχει την πολιτική για καμβά χρησιμοποιώντας την ίδια διαδικασία που περιγράφεται στην ενότητα ContentSecurityPolicyConfiguration.

  • Το ContentSecurityPolicyReportUri ελέγχει εάν πρέπει να χρησιμοποιηθεί η αναφορά. Αυτή η ρύθμιση χρησιμοποιείται τόσο από εφαρμογές βάσει μοντέλου όσο και από εφαρμογές καμβά. Μια έγκυρη συμβολοσειρά στέλνει αναφορές παραβίασης στο καθορισμένο τελικό σημείο, χρησιμοποιώντας τη λειτουργία μόνο αναφοράς εάν το IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas είναι απενεργοποιημένο. Μια κενή συμβολοσειρά απενεργοποιεί τη λειτουργία αναφοράς. Για περισσότερες πληροφορίες, δείτε τεκμηρίωση υποβολής αναφορών.

Ρύθμιση παραμέτρων CSP χωρίς περιβάλλον εργασίας χρήστη

Ειδικά για περιβάλλοντα που δεν υπάρχουν στο κέντρο διαχείρισης Power Platform, όπως ρυθμίσεις παραμέτρων εσωτερικής εγκατάστασης, οι διαχειριστές μπορεί να θέλουν να ρυθμίσουν τις παραμέτρους του CSP χρησιμοποιώντας δέσμες ενεργειών για την άμεση τροποποίηση των ρυθμίσεων.

Ενεργοποίηση CSP χωρίς περιβάλλον εργασίας χρήστη

Ακολουθήστε αυτά τα βήματα για να ενεργοποιήσετε το CSP χωρίς περιβάλλον εργασίας χρήστη:

  • Ανοίξτε τα εργαλεία ανάπτυξης προγράμματος περιήγησης κατά τη χρήση της εφαρμογής που καθορίζεται από μοντέλο ως χρήστης με προνόμια ενημέρωσης οντότητας οργανισμού (ο διαχειριστής συστήματος είναι μια καλή επιλογή).
  • Επικολλήστε και εκτελέστε την παρακάτω δέσμη ενεργειών στην κονσόλα.
  • Για να ενεργοποιήσετε το CSP, μεταβιβάστε την προεπιλεγμένη ρύθμιση παραμέτρων - enableFrameAncestors(["'self'"])
  • Ως παράδειγμα ενεργοποίησης άλλων προελεύσεων για ενσωμάτωση της εφαρμογής - 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!')
}

Απενεργοποίηση CSP χωρίς περιβάλλον εργασίας χρήστη

Ακολουθήστε αυτά τα βήματα για να απενεργοποιήσετε το CSP χωρίς περιβάλλον εργασίας χρήστη:

  • Ανοίξτε τα εργαλεία ανάπτυξης προγράμματος περιήγησης κατά τη χρήση της εφαρμογής που καθορίζεται από μοντέλο ως χρήστης με προνόμια ενημέρωσης οντότητας οργανισμού (ο διαχειριστής συστήματος είναι μια καλή επιλογή).
  • Επικολλήστε και εκτελέστε την παρακάτω δέσμη ενεργειών στην κονσόλα.
  • Για να απενεργοποιήσετε το 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!')
}