Κοινή χρήση μέσω


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

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

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

Οδηγία Default value Προσαρμόσιμα
script-src * 'unsafe-inline' 'unsafe-eval' όχι
worker-src 'self' blob: όχι
style-src * 'unsafe-inline' όχι
font-src * data: όχι
frame-ancestors 'self' https://*.powerapps.com Όχι

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

Προϋποθέσεις

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

Ρύθμιση παραμέτρων CSP

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

Για να ρυθμίσετε τις παραμέτρους του CSP, μεταβείτε στο Κέντρο διαχείρισης του Power Platform ->Περιβάλλοντα ->Ρυθμίσεις ->Πολιτική προστασίας προσωπικών δεδομένων + Ασφάλεια. Η εικόνα που ακολουθεί εμφανίζει την προεπιλεγμένη κατάσταση των ρυθμίσεων:

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

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

Με την εναλλαγή "Ενεργοποίηση αναφοράς" μπορείτε να ελέγξετε αν οι εφαρμογές βάσει μοντέλου και οι εφαρμογές καμβά στέλνουν αναφορές παραβίασης. Η ενεργοποίησή της απαιτεί τον καθορισμό ενός τελικού σημείου. Οι αναφορές παραβίασης αποστέλλονται σε αυτό το τελικό σημείο ανεξάρτητα από το εάν το 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.com, https://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:

Παράδειγμα 1

Παράδειγμα CSP 1

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

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

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

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

Παράδειγμα 2

Παράδειγμα CSP 2

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

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

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

  • Εφαρμογές βάσει μοντέλου: 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;
  • Εφαρμογές καμβά: 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 μπορεί να ρυθμιστεί χωρίς τη χρήση του περιβάλλοντος εργασίας χρήστη τροποποιώντας απευθείας τις παρακάτω ρυθμίσεις οργανισμού:

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

  • ContentSecurityPolicyConfiguration ελέγχει την τιμή του τμήματος frame-ancestors (όπως φαίνεται παραπάνω, έχει οριστεί σε 'self' if 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, περάστε την προεπιλεγμένη διαμόρφωση - 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, επικολλήστε στην κονσόλα: 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!')
}