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

מדיניות אבטחת תוכן (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' blob: לא
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' blob:; 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' blob: <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 של מעורבות לקוחות ויישומים מונחי-מודלים אחרים, ספק ה- CSP זמין בסביבות מקוונות בלבד ובארגונים עם מעורבות לקוחות של Dynamics 365 (מקומי), גירסה 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 app, הוסף את הפעולות הבאות ל- frame-ancestors:

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

עבור היישום Dynamics 365 עבור 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' :blob; 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' 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;

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

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

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