שתף דרך


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

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

הערה

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

כל רכיב של ערך כותרת ה- CSP קובע את הנכסים שניתן להוריד. רשת Mozilla Developer Network (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;.

מצב קפדני

הלחצן הדו-מצבי Strict CSP יוצר מדיניות אבטחה ללא תווים כלליים או הוראות לא בטוחות, כגון unsafe-inline. בעת הפעלת ספק פתרונות ענן קפדניים, ההוראה הקודמת תהפוך להוראות הבאות המפורטות בסעיף זה. המשמעות של <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> ‏‏כן
בסיס URI 'none' לא ישים לא
פעולת טופס <platform> לא ישים ‏‏כן
default-src 'self' 'self' לא

דרישות מוקדמות

עבור יישומי Dynamics 365 Customer Engagement ויישומים מונחי-דגמים אחרים, CSP זמין רק בסביבות מקוונות ובארגונים עם 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.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

להלן כמה דוגמאות של תצורות 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 - הדיווח פועל

דוגמה 2 של ספק שירותי ענן (CSP), מבוסס מודל

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;

שינוי הגדרות הארגון ישירות

ניתן להגדיר ספק פתרונות ענן בלי להשתמש בממשק המשתמש על ידי שינוי הגדרות הארגון הבאות ישירות:

  • IsContentSecurityPolicyEnabled קובע אם הכותרת Content-Security-Policy נשלחת ביישומים מונחי דגמים.

  • 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) הנחיית 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, העבר את תצורת ברירת המחדל - 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 ללא זמין, הדבק במסוף: 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!')
}