सामग्री सुरक्षा नीति

सामग्री सुरक्षा नीति (CSP) वर्तमान में मॉडल-संचालित, कैनवास और कोड ऐप्स में समर्थित है। इस लेख में मॉडल-चालित और कैनवास ऐप्स के लिए CSP को कॉन्फ़िगर करने का तरीका बताया गया है. कोड ऐप्लिकेशन CSP के लिए, कोड ऐप्लिकेशन दस्तावेज़ देखें. व्यवस्थापक यह नियंत्रित कर सकते हैं कि CSP हेडर भेजा जाए या नहीं और एक हद तक, इसमें क्या शामिल है. सेटिंग्स पर्यावरण स्तर पर हैं, जिसका अर्थ है कि वे एक बार चालू होने के बाद पर्यावरण के सभी ऐप्स पर लागू हो जाती हैं।

नोट

सामग्री सुरक्षा नीति केवल उपयोग करने वाले वातावरणों पर लागू होती है। Dataverse

CSP हेडर मान का प्रत्येक घटक उन संपत्तियों को नियंत्रित करता है जिन्हें डाउनलोड किया जा सकता है। मोज़िला डेवलपर नेटवर्क (MDN) अधिक विस्तृत विवरण प्रदान करता है। डिफ़ॉल्ट मान इस प्रकार हैं:

आदेश डिफ़ॉल्ट मान अनुकूलनयोग्य
स्क्रिप्ट-src * 'unsafe-inline' 'unsafe-eval' blob: No
कार्यकर्ता-src 'self' blob: No
शैली-src * 'unsafe-inline' blob: No
फ़ॉन्ट-src * data: No
फ्रेम-पूर्वज 'self' https://*.powerapps.com हां

इस कॉन्फ़िगरेशन के परिणामस्वरूप script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; का डिफ़ॉल्ट CSP प्राप्त होता है।

सख्त मोड

सख्त सीएसपी टॉगल एक सीएसपी बनाता है जिसमें ज्यादातर वाइल्डकार्ड या असुरक्षित निर्देश शामिल नहीं होते हैं, जैसे .unsafe-inline जब आप सख्त CSP चालू करते हैं, तो पिछले निर्देश इस अनुभाग में विस्तृत निम्न निर्देश बन जाते हैं। नोटेशन का <platform> मतलब है कि प्लेटफ़ॉर्म डोमेन उत्पाद द्वारा आवश्यक रूप से प्रदान किए जाते हैं। उत्पाद के बढ़ने पर इस अनुभाग के डोमेन समय के साथ बदल सकते हैं।

आदेश डिफ़ॉल्ट मान (मॉडल-संचालित) डिफ़ॉल्ट मान (कैनवास) अनुकूलनयोग्य
स्क्रिप्ट-src 'self' blob: <platform>' 'self' <platform>' हां
कार्यकर्ता-src 'self' blob: 'self' blob: No
शैली-src 'self' 'unsafe-inline' blob: <platform> 'self' 'unsafe-inline' <platform> हां
फ़ॉन्ट-src 'self' data: <platform> 'self' data: <platform> हां
फ्रेम-पूर्वज 'self' https://*.powerapps.com 'self' https://*.powerapps.com हां
आईएमजी-एसआरसी 'self' blob: data: <platform> 'self' data: <platform> हां
कनेक्ट-एसआरसी 'self' blob: data: wss: <platform> 'self' blob: <platform> हां
फ़्रेम-SRC 'self' blob: <platform> 'self' <platform> हां
बेस-यूआरआई 'none' N/A No
प्रपत्र-क्रिया <platform> N/A हां
डिफ़ॉल्ट-एसआरसी 'self' 'self' No

पूर्वावश्यकताएँ

Dynamics 365 Customer Engagement अनुप्रयोग और अन्य मॉडल-चालित अनुप्रयोग के लिए, CSP केवल ऑनलाइन परिवेश और Dynamics 365 Customer Engagement (on-premises), संस्करण 9.1 या बाद के संस्करण वाले संगठनों में उपलब्ध है.

CSP कॉन्फ़िगर करें

आप Power Platform व्यवस्थापक केंद्र के माध्यम से CSP को टॉगल और कॉन्फ़िगर कर सकते हैं। सबसे पहले डेव/टेस्ट वातावरण को सक्षम करना महत्वपूर्ण है क्योंकि CSP को सक्षम करने से नीति का उल्लंघन होने पर परिदृश्यों को अवरुद्ध करना शुरू हो सकता है। व्यवस्थापन केंद्र उत्पादन में आसान रैंप-अप की अनुमति देने के लिए केवल रिपोर्ट मोड का भी समर्थन करता है।

CSP को कॉन्फ़िगर करने के लिए ये कदम उठाएं:

  1. Power Platform व्यवस्थापन केंद्र में साइन इन करें.
  2. नेविगेशन फलक में, प्रबंधित करें का चयन करें. प्रबंधित करें फलक में, पर्यावरण का चयन करें.
  3. पर्यावरण पृष्ठ पर, कोई परिवेश चुनें.
  4. कमांड बार में, सेटिंग्स का चयन करें.
  5. उत्पाद विस्तृत करें, और फिर गोपनीयता + सुरक्षा चुनें.

निम्नलिखित छवि सेटिंग्स की डिफ़ॉल्ट स्थिति दिखाती है:

सामग्री सुरक्षा नीति डिफ़ॉल्ट सेटिंग्स.

रिपोर्ट करना

रिपोर्टिंग सक्षम करें टॉगल नियंत्रित करता है कि मॉडल-चालित और कैनवास ऐप उल्लंघन रिपोर्ट भेजते हैं या नहीं. इसे सक्षम करने के लिए, एक समापन बिंदु निर्दिष्ट करें। ऐप इस समापन बिंदु पर उल्लंघन रिपोर्ट भेजता है, भले ही सीएसपी लागू किया गया हो या नहीं। यदि 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 निर्देश सेट करना.

सामान्य कॉन्फ़िगरेशन

Dynamics 365 ऐप का उपयोग करके Microsoft Teams एकीकरण के लिए, निम्नलिखित को frame-ancestors में जोड़ें:

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

Outlook के लिए Dynamics 365 ऐप के लिए, निम्नलिखित को frame-ancestors में जोड़ें:

  • आपका Outlook Web App मुखपृष्ठ मूल
  • https://outlook.office.com
  • https://outlook.office365.com

Power BI रिपोर्ट में Power Apps एम्बेड करने के लिए, निम्न को frame-ancestors में जोड़ें:

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

महत्वपूर्ण विचार

डिफ़ॉल्ट निर्देश को बंद करना और एक खाली सूची के साथ सहेजना निर्देश को पूरी तरह से बंद कर देता है और इसे CSP प्रतिक्रिया शीर्षलेख के भाग के रूप में नहीं भेजता है.

CSP कॉन्फ़िगरेशन उदाहरण

यहां सीएसपी कॉन्फ़िगरेशन के कुछ उदाहरण दिए गए हैं।

उदाहरण 1 - रिपोर्टिंग बंद कर दी गई

सीएसपी उदाहरण 1, मॉडल-संचालित

सीएसपी उदाहरण 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' :blob; font-src * data:; frame-ancestors https://www.contoso.com https://www.fabrikam.com;
  • कैनवास ऐप्लिकेशन: CSP हेडर नहीं भेजा जाता है.

उदाहरण 2 - रिपोर्टिंग चालू है

सीएसपी उदाहरण 2, मॉडल-संचालित

सीएसपी उदाहरण 2, कैनवास

उदाहरण में:

  • रिपोर्टिंग चालू है.
    • रिपोर्टिंग समाप्ति बिंदु https://contoso.com/reporting-endpoint पर सेट है
  • मॉडल-चालित प्रवर्तन सक्षम है.
    • frame-ancestors डिफ़ॉल्ट रूप में रखा जाता है
  • कैनवस प्रवर्तन अक्षम है.
    • frame-ancestors के लिए अनुकूलित है https://www.contoso.com

प्रभावी सीएसपी मान हैं:

  • मॉडल-चालित ऐप्स: Content-Security-Policy: script-src * 'unsafe-inline' 'unsafe-eval' blob:; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; 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;

संगठन सेटिंग को सीधे संशोधित करें

आप इन संगठन सेटिंग्स को सीधे संशोधित करके UI का उपयोग किए बिना CSP को कॉन्फ़िगर कर सकते हैं:

  • IsContentSecurityPolicyEnabled यह नियंत्रित करता है कि मॉडल-चालित ऐप्स में Content-Security-Policy शीर्षलेख भेजा जाए या नहीं.

  • ContentSecurityPolicyConfiguration फ़्रेम-ancestors भाग के मान को नियंत्रित करता है (जैसा कि पहले देखा गया है, यह सेट नहीं है, तो सेट 'self' करता ContentSecurityPolicyConfiguration है)। निम्न संरचना के साथ JSON ऑब्जेक्ट का उपयोग करके इस सेटिंग को परिभाषित करें - . { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } } यह विन्यास इस प्रकार है script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline' blob:; font-src * data:; frame-ancestors 'foo' 'bar';

    • (MDN से) HTTP सामग्री-सुरक्षा-नीति (सीएसपी) फ्रेम-पूर्वज निर्देश वैध माता-पिता को निर्दिष्ट करता है जो <frame>, <iframe>, <object>, <embed>, या <applet> का उपयोग कर एक पृष्ठ एम्बेड कर सकते हैं.
  • IsContentSecurityPolicyEnabledForCanvas यह नियंत्रित करता है कि कैनवास ऐप्स में Content-Security-Policy शीर्षलेख भेजा जाए या नहीं.

  • ContentSecurityPolicyConfigurationForCanvasContentSecurityPolicyConfiguration में वर्णित समान प्रक्रिया का उपयोग करके कैनवास के लिए नीति को नियंत्रित करता है।

  • ContentSecurityPolicyReportUri नियंत्रित करता है कि रिपोर्टिंग का उपयोग किया जाना चाहिए या नहीं। इस सेटिंग का उपयोग मॉडल-चालित और कैनवास ऐप दोनों द्वारा किया जाता है. यदि IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas बंद है, तो एक मान्य स्ट्रिंग केवल रिपोर्ट मोड का उपयोग करके निर्दिष्ट समापन बिंदु पर उल्लंघन रिपोर्ट भेजती है। एक खाली स्ट्रिंग रिपोर्टिंग अक्षम करती है. अधिक जानकारी के लिए, रिपोर्टिंग दस्तावेज़ीकरण देखें.

बिना UI के CSP को कॉन्फिगर करना

विशेष रूप से उन वातावरणों के लिए जो Power Platform व्यवस्थापन केंद्र में नहीं हैं जैसे कि ऑन-प्रिमाइसेस कॉन्फ़िगरेशन, व्यवस्थापक सेटिंग्स को सीधे संशोधित करने के लिए स्क्रिप्ट का उपयोग करके CSP को कॉन्फ़िगर करना चाह सकते हैं.

UI के बिना CSP सक्षम करें

UI के बिना 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!')
}

UI के बिना CSP अक्षम करें

UI के बिना 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!')
}