שתף באמצעות


מדיניות אבטחת תוכן

הערה

מרכז הניהול החדש והמשופר של Power Platform נמצא כעת בגירסת Public Preview. תכננו את מרכז הניהול החדש כך שיהיה קל יותר לשימוש, עם ניווט מונחה משימות שעוזר לך להשיג תוצאות ספציפיות מהר יותר. אנו נפרסם תיעוד חדש ומעודכן כאשר מרכז הניהול החדש של Power Platform יעבור לזמינות כללית.

מדיניות אבטחת תוכן (CSP) נתמעת כרגע במודלים ובבד ציור של Power Apps. מנהלי מערכת יכולים לקבוע אם כותרת ה- CSP נשלחת ובמידה מסוימת מה היא מכילה. ההגדרות הן ברמת הסביבה, ומשמעות הדבר שהן יוחלו על כל היישומים בסביבה לאחר הפעלתה.

הערה

מדיניות אבטחת התוכן חלה רק על סביבות המשתמשות ב- Dataverse.

כל רכיב של ערך כותרת CSP קובע את הנכסים שניתן להוריד, ומתואר בפירוט רב יותר ב- Mozilla Developer Network ‏(MDN): ערכי ברירת המחדל הם להלן:

הנחיה ערך ברירת מחדל ניתן להתאמה אישית
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 Customer Engagement ויישומים מונחי-דגמים אחרים, CSP זמין רק בסביבות מקוונות ובארגונים עם Dynamics 365 Customer Engagement (on-premises)‎, גירסה 9.1 ואילך.

קביעת תצורה של CSP

ניתן לשנות את המצב של CSP ולהגדיר אותו דרך מרכז הניהול של 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:

  • מקור דף הבית של Outlook Web App שלך
  • 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

דוגמה 1 של CSP

בדוגמה:

  • הדיווח כבוי.
  • אכיפה מונחית מודל מופעלת.
    • 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

דוגמה 2 של CSP

בדוגמה:

  • הדיווח פועל.
    • נקודת קצה של דיווח מוגדרת 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 נשלחת ביישומים מונחי דגמים.

  • ContentSecurityPolicyConfiguration קובע את הערך של החלק frame-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'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (מ- MDN) הנחיית HTTP Content-Security-Policy (CSP) frame-ancestors מציינת רכיבי אב חוקיים שעשויים להטביע דף באמצעות <frame>,‏ <iframe>,‏ <object>,‏ <embed> או <applet>.
  • IsContentSecurityPolicyEnabledForCanvas קובע אם הכותרת Content-Security-Policy נשלחת ביישומי בד ציור.

  • 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!')
}