Aracılığıyla paylaş


İçerik güvenliği ilkesi

İçerik Güvenliği İlkesi (CSP) şu anda model temelli, tuval ve kod uygulamalarında desteklenmektedir. Bu makalede, model temelli ve tuval uygulamaları için CSP'yi yapılandırma açıklanmaktadır. Kod uygulamaları CSP için kod uygulamaları belgelerine bakın. Yöneticiler, CSP üst bilgisinin gönderilip gönderilmediğini ve bir dereceye kadar ne içerdiğini denetleyebilir. Ayarlar ortam düzeyindedir; bu da ortam üzerindeki tüm uygulamalara bir kez açıldıktan sonra uygulanacağı anlamına gelir.

Not

İçerik güvenlik ilkesi yalnızca Dataverse kullanan ortamlar için geçerlidir.

CSP üst bilgi değerinin her bileşeni, indirilebilen varlıkları denetler. Mozilla Geliştirici Ağı (MDN) daha ayrıntılı açıklamalar sağlar. Varsayılan değerler aşağıdaki gibidir:

Yönerge Varsayılan değer Özelleştirilebilir
script-src * 'unsafe-inline' 'unsafe-eval' blob: Hayır
worker-src 'self' blob: Hayır
style-src * 'unsafe-inline' Hayır
font-src * data: Hayır
frame-ancestors 'self' https://*.powerapps.com Evet

Bu yapılandırma, varsayılan CSP'nin script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; olmasını sağlar.

Katı mod

Strict CSP geçişi, çoğunlukla joker karakterler veya güvenli olmayan yönergeler (örneğin unsafe-inline) içermeyen bir CSP oluşturur. Strict CSP'yi açtığınızda, yukarıdaki yönergeler bu bölümde ayrıntıları verilen aşağıdaki yönergeler haline gelir. <platform> gösterimi, platform etki alanlarının ürün tarafından gereklilik olarak sağlandığı anlamına gelir. Ürün büyüdükçe bu bölümdeki etki alanları zaman içinde değişebilir.

Yönerge Varsayılan değer (model temelli) Varsayılan değer (tuval) Özelleştirilebilir
script-src 'self' blob: <platform>' 'self' <platform>' Evet
worker-src 'self' blob: 'self' blob: Hayır
style-src 'self' 'unsafe-inline' <platform> 'self' 'unsafe-inline' <platform> Evet
font-src 'self' data: <platform> 'self' data: <platform> Evet
frame-ancestors 'self' https://*.powerapps.com 'self' https://*.powerapps.com Evet
img-src 'self' blob: data: <platform> 'self' data: <platform> Evet
connect-src 'self' blob: data: wss: <platform> 'self' blob: <platform> Evet
frame-src 'self' blob: <platform> 'self' <platform> Evet
base-uri 'none' Geçersiz Hayır
form-action <platform> Geçersiz Evet
default-src 'self' 'self' Hayır

Ön koşullar

Dynamics 365 Customer Engagement uygulamaları ve diğer model temelli uygulamalar için CSP yalnızca çevrimiçi ortamlarda ve Dynamics 365 Customer Engagement (on-premises), sürüm 9.1 veya sonraki bir sürüme sahip kuruluşlarda kullanılabilir.

CSP'yi yapılandırma

CSP'yi Power Platform yönetim merkezi aracılığıyla değiştirebilir ve yapılandırabilirsiniz. Öncelikle bir geliştirme/test ortamını etkinleştirmek önemlidir çünkü CSP'yi etkinleştirmek, politikanın ihlal edilmesi durumunda senaryoları engellemeye başlayabilir. Yönetim merkezi, üretimde daha kolay artış sağlamak için yalnızca rapor modunu da destekler.

CSP'yi yapılandırmak için şu adımları izleyin:

  1. Power Platform yönetim merkezinde oturum açın.
  2. Gezinti bölmesinde Yönet'i seçin. Yönet bölmesinde Ortamlar'ı seçin.
  3. Ortamlar sayfasında, bir ortam seçin.
  4. Komut çubuğunda Ayarlar'ı seçin.
  5. Ürün öğesini genişletin ve Gizlilik + Güvenlik öğesini seçin.

Aşağıdaki resimde ayarların varsayılan durumu gösterilmektedir:

İçerik güvenlik ilkesi varsayılan ayarları.

Bildirme

Raporlamayı etkinleştir geçiş düğmesi, model temelli uygulamaların ve tuval uygulamalarının ihlal raporları gönderip göndermediğini denetler. Etkinleştirmek için bir uç nokta belirtin. Uygulama, CSP'nin zorlanıp zorlanmadığına bakılmaksızın ihlal raporlarını bu uç noktasına gönderir. CSP zorlanmazsa uygulama sadece rapor modunu kullanır. Daha fazla bilgi için bkz. belgeleri raporlama.

Raporlama geçişini açık konuma getirin.

Zorlama

CSP zorlama, ilkeler üzerinde ayrıntılı denetim sağlamak için model temelli uygulamalar ve tuval uygulamaları için bağımsız olarak denetlenir. Hedeflenen uygulama türünü değiştirmek için model temelli uygulama/tuval uygulaması özetini kullanın.

İçerik güvenliği ilkesi anahtarı, belirli bir uygulama türü için varsayılan ilkenin uygulanmasını açar. Bu geçiş düğmesi açıldığında, bu ortamdaki uygulamaların davranışı ilkeye uyacak şekilde değiştirilir. Bu nedenle, şu önerilen etkinleştirme akışını izleyin:

  1. İlkeyi geliştirme veya test ortamında zorunlu kılma.
  2. Üretim ortamında yalnızca rapor modunu etkinleştirin.
  3. İhlal bildirilmediğinde ilkeyi üretim ortamında uygulamaya koyun.

Yönergeleri yapılandır

Yönergeleri yapılandır bölümü, ilke içindeki tek tek yönergeleri denetlemenize olanak tanır. Şu anda yalnızca frame-ancestors yönergesini özelleştirebilirsiniz.

CSP yönergelerini yapılandırma.

Varsayılan yönergeyi açık bırakırsanız, tabloda belirtilen varsayılan değeri kullanırsınız. Düğmeyi kapalı konuma getirirseniz yönerge için özel değerler belirtebilir ve bunları varsayılan değere ekleyebilirsiniz. Aşağıdaki örnek, frame-ancestors için özel değerler ayarlar. Bu örnekteki yönerge frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com olarak ayarlanmıştır. Bu ayar, uygulamanın aynı kaynakta, https://*.powerapps.com, https://www.foo.com, ve https://www.bar.com içinde barındırılabildiği, ancak diğer kaynaklarda barındırılamadığı anlamına gelir. Listeye giriş eklemek için Ekle düğmesini ve kaldırmak için sil simgesini kullanın.

Özel CSP yönergelerini ayarlama.

Ortak yapılandırmalar

Dynamics 365 uygulamasını kullanarak Microsoft Teams entegrasyonu için frame-ancestors öğesine aşağıdakileri ekleyin:

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

Dynamics 365 App for Outlook için frame-ancestors öğesine aşağıdakileri ekleyin:

  • Outlook Web Uygulaması giriş sayfası kaynağınız
  • https://outlook.office.com
  • https://outlook.office365.com

Power Apps'i Power BI raporlarına yerleştirmek için frame-ancestors öğesine aşağıdakileri ekleyin:

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

Dikkat edilmesi gereken önemli hususlar

Varsayılan yönerge kapatılarak boş bir listeyle kaydedildiğinde yönerge tamamen kapatılır ve CSP yanıtı üst bilgisinin bir parçası olarak gönderilmez.

CSP yapılandırma örnekleri

CSP yapılandırmalarına birkaç örnek aşağıda verilmiştir.

Örnek 1 - Raporlama kapatıldı

CSP örnek 1, model temelli

CSP örneği 1, tuval

Örnekte:

  • Raporlama kapalıdır.
  • Model temelli zorlama etkindir.
    • frame-ancestors için https://www.contoso.com ve https://www.fabrikam.com özelleştirilmiştir.
  • Tuval zorlaması devre dışı bırakılmıştır.

Geçerli üst bilgiler şunlardır:

  • Model temelli uygulamalar: 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;
  • Tuval uygulamaları: CSP başlığı gönderilmez.

Örnek 2 - Raporlama açıldı

CSP örnek 2, model temelli

CSP örneği 2, tuval

Örnekte:

  • Raporlama açıktır.
    • Raporlama uç noktası https://contoso.com/reporting-endpoint olarak ayarlanmıştır
  • Model temelli zorlama etkindir.
    • frame-ancestors varsayılan olarak korunur
  • Tuval zorlaması devre dışı bırakılmıştır.
    • frame-ancestors, https://www.contoso.com olarak özelleştirilmiştir

Geçerli CSP değerleri şunlardır:

  • Model temelli uygulamalar: 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;
  • Tuval uygulamaları: 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;

Kuruluş ayarlarını doğrudan değiştirin

Bu kuruluş ayarlarını doğrudan değiştirerek CSP'yi kullanıcı arabirimini kullanmadan yapılandırabilirsiniz:

  • IsContentSecurityPolicyEnabled, İçerik Güvenliği İlkesi üst bilgisinin model temelli uygulamalarda gönderilip gönderilmeyeceğini denetler.

  • ContentSecurityPolicyConfiguration, çerçeve alt öğelerinin değerini kontrol eder (önceden görüldüğü gibi, 'self' ayarlanmamışsa ContentSecurityPolicyConfiguration olarak ayarlanır). Aşağıdaki yapıya sahip bir JSON nesnesi kullanarak bu ayarı tanımlayın: { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Bu yapılandırma script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar'; olarak çevrilir

    • (MDN'den) HTTP İçerik Güvenliği İlkesi (CSP) frame-ancestors yönergesi <frame>, <iframe>, <object>, <embed> veya <applet> kullanarak bir sayfa ekleyebilecek geçerli üst öğeleri belirtir.
  • IsContentSecurityPolicyEnabledForCanvas, İçerik Güvenliği İlkesi üst bilgisinin tuval uygulamalarında gönderilip gönderilmeyeceğini denetler.

  • ContentSecurityPolicyConfigurationForCanvas, ContentSecurityPolicyConfiguration'te açıklanan aynı işlemi kullanarak tuval için politikayı kontrol eder.

  • ContentSecurityPolicyReportUri, raporun kullanılmasının gerekip gerekmediğini denetler. Bu ayar model temelli uygulamalar ve tuval uygulamaları tarafından kullanılır. IsContentSecurityPolicyEnabled / IsContentSecurityPolicyEnabledForCanvas kapalıysa geçerli dize, yalnızca rapor modunu kullanarak belirtilen uç noktaya ihlal raporları gönderir. Boş dize, raporlamayı devre dışı bırakır. Daha fazla bilgi için bkz. belgeleri raporlama.

Kullanıcı arabirimi olmadan CSP'yi yapılandırma

Özellikle yerinde yapılandırmalar gibi Power Platform yönetim merkezinde bulunmayan ortamlarda yöneticiler, ayarları doğrudan değiştirmek için komut dosyalarını kullanarak CSP'yi yapılandırmak isteyebilir.

Kullanıcı arabirimi olmadan CSP'yi etkinleştirme

Kullanıcı arabirimi olmadan CSP'yi etkinleştirmek için şu adımları uygulayın:

  • Model temelli uygulamayı kuruluş varlığı güncelleştirme ayrıcalıklarına sahip bir kullanıcı olarak kullanırken tarayıcı geliştirme araçlarını açın (Sistem Yöneticisi iyi bir seçenektir).
  • Aşağıdaki komut dosyasını konsola yapıştırın ve yürütün.
  • CSP'yi etkinleştirmek için varsayılan yapılandırmayı geçirin - enableFrameAncestors(["'self'"])
  • Uygulamayı eklemek için diğer kökenleri etkinleştirmenin bir örneği olarak - 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!')
}

Kullanıcı arabirimi olmadan CSP'yi devre dışı bırak

Kullanıcı arabirimi olmadan CSP'yi devre dışı bırakmak için şu adımları uygulayın:

  • Model temelli uygulamayı kuruluş varlığı güncelleştirme ayrıcalıklarına sahip bir kullanıcı olarak kullanırken tarayıcı geliştirme araçlarını açın (Sistem Yöneticisi iyi bir seçenektir).
  • Aşağıdaki komut dosyasını konsola yapıştırın ve yürütün.
  • CSP'yi devre dışı bırakmak için disableCSP() ifadesini konsola yapıştırın
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!')
}