Bagikan melalui


Kebijakan keamanan konten

Kebijakan Keamanan Konten (CSP) saat ini didukung dalam aplikasi berbasis model, kanvas, dan kode. Artikel ini menjelaskan cara mengonfigurasi CSP untuk aplikasi berbasis model dan kanvas. Untuk CSP aplikasi kode, lihat dokumentasi aplikasi kode. Admin dapat mengontrol apakah header CSP dikirim dan, hingga tingkat tertentu, isinya. Pengaturan berada di tingkat lingkungan, yang berarti diterapkan ke semua aplikasi di lingkungan setelah diaktifkan.

Catatan

Kebijakan keamanan konten hanya berlaku untuk lingkungan yang menggunakan Dataverse.

Setiap komponen nilai header CSP mengontrol aset yang dapat diunduh. Mozilla Developer Network (MDN) memberikan deskripsi yang lebih rinci. Nilai default adalah sebagai berikut:

Arahan Nilai default Dapat disesuaikan
script-src * 'unsafe-inline' 'unsafe-eval' blob: Tidak
worker-src 'self' blob: Tidak
style-src * 'unsafe-inline' Tidak
font-src * data: Tidak
frame-ancestors 'self' https://*.powerapps.com Ya

Konfigurasi ini menghasilkan CSP default script-src * 'unsafe-inline' 'unsafe-eval' blob: ; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.

Mode ketat

Tombol Strict CSP membuat CSP yang kebanyakan tidak menyertakan wildcard atau arahan yang tidak aman, seperti unsafe-inline. Saat Anda mengaktifkan Strict CSP, arahan sebelumnya menjadi arahan berikut yang dirinci di bagian ini. Notasi <platform> berarti bahwa domain platform disediakan sebagaimana diperlukan oleh produk. Domain di bagian ini mungkin berubah dari waktu ke waktu saat produk tumbuh.

Arahan Nilai default (berbasis model) Nilai default (kanvas) Dapat disesuaikan
script-src 'self' blob: <platform>' 'self' <platform>' Ya
worker-src 'self' blob: 'self' blob: Tidak
style-src 'self' 'unsafe-inline' <platform> 'self' 'unsafe-inline' <platform> Ya
font-src 'self' data: <platform> 'self' data: <platform> Ya
frame-ancestors 'self' https://*.powerapps.com 'self' https://*.powerapps.com Ya
img-src 'self' blob: data: <platform> 'self' data: <platform> Ya
connect-src 'self' blob: data: wss: <platform> 'self' blob: <platform> Ya
frame-src 'self' blob: <platform> 'self' <platform> Ya
base-uri 'none' N/A Tidak
form-action <platform> N/A Ya
default-src 'self' 'self' Tidak

Prasyarat

Untuk aplikasi Dynamics 365 customer engagement dan aplikasi yang diarahkan model lainnya, CSP hanya tersedia di lingkungan online dan di organisasi dengan Dynamics 365 customer engagement (lokal), versi 9.1 atau versi yang lebih baru.

Konfigurasikan CSP

Anda dapat beralih dan mengonfigurasi CSP melalui pusat admin Power Platform. Penting untuk mengaktifkan lingkungan pengembang/pengujian terlebih dahulu karena mengaktifkan CSP dapat mulai memblokir skenario jika kebijakan dilanggar. Pusat admin juga mendukung mode khusus laporan untuk memungkinkan peningkatan produksi yang lebih mudah.

Lakukan langkah-langkah ini untuk mengonfigurasi CSP:

  1. Masuk ke pusat admin Power Platform.
  2. Di panel navigasi, pilih Kelola. Di panel Kelola, pilih Lingkungan.
  3. Pada halaman Lingkungan, pilih lingkungan.
  4. Pilih Pengaturan di bilah perintah.
  5. Luaskan Produk, lalu pilih Privasi + Keamanan.

Gambar berikut menampilkan status default pengaturan:

Pengaturan default kebijakan keamanan konten.

Mengirimkan laporan

Tombol Aktifkan pelaporan mengontrol apakah aplikasi yang diarahkan model dan aplikasi kanvas mengirim laporan pelanggaran. Untuk mengaktifkannya, tentukan titik akhir. Aplikasi mengirimkan laporan pelanggaran ke titik akhir ini terlepas dari apakah CSP diberlakukan atau tidak. Jika CSP tidak diberlakukan, aplikasi menggunakan mode khusus laporan. Untuk informasi lebih lanjut, lihat dokumentasi pelaporan.

Aktifkan tombol pelaporan ke aktif.

Penegakan

Pemberlakuan CSP dikontrol secara independen untuk aplikasi yang diarahkan model dan kanvas dalam memberikan kontrol terperinci atas kebijakan. Gunakan pivot berdasarkan model/kanvas untuk memodifikasi jenis aplikasi yang dituju.

Tombol Terlaksakan kebijakan keamanan konten mengaktifkan kebijakan default untuk penegakan untuk jenis aplikasi yang diberikan. Mengaktifkan tombol ini mengubah perilaku aplikasi di lingkungan ini agar mematuhi kebijakan. Oleh karena itu, ikuti alur pengaktifan yang disarankan ini:

  1. Terapkan kebijakan pada lingkungan pengembangan atau pengujian.
  2. Aktifkan mode hanya laporan dalam produksi.
  3. Terapkan kebijakan dalam produksi setelah tidak ada pelanggaran yang dilaporkan.

Konfigurasikan direktif

Bagian Konfigurasi direktif memungkinkan Anda mengontrol arahan individual dalam kebijakan. Saat ini, Anda hanya dapat menyesuaikan arahan frame-ancestors .

Konfigurasikan petunjuk CSP.

Jika Anda membiarkan direktif default tetap aktif, Anda menggunakan nilai default yang ditentukan dalam tabel. Jika Anda menonaktifkan tombol, Anda dapat menentukan nilai kustom untuk direktif dan menambahkannya ke nilai default. Contoh berikut menetapkan nilai kustom untuk frame-ancestors. Direktif diatur ke frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com dalam contoh ini. Pengaturan ini berarti aplikasi dapat dihosting di asal yang sama, , https://*.powerapps.com, https://www.foo.comdan https://www.bar.com, tetapi tidak di asal lain. Gunakan tombol Tambah untuk menambahkan entri ke daftar dan ikon Hapus untuk menghapusnya.

Mengatur arahan CSP kustom.

Konfigurasi Umum

Untuk integrasi Microsoft Teams menggunakan aplikasi Dynamics 365 , tambahkan yang berikut ini ke frame-ancestors

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

Untuk Dynamics 365 App for Outlook, tambahkan yang berikut ini ke frame-ancestors

  • Asal halaman Beranda Outlook Web App Anda
  • https://outlook.office.com
  • https://outlook.office365.com

Untuk menyematkan Power Apps dalam laporan Power BI, tambahkan yang berikut ini ke frame-ancestors

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

Pertimbangan penting

Menonaktifkan petunjuk default dan menyimpan dengan daftar kosong menonaktifkan sepenuhnya arahan dan tidak mengirimkannya sebagai bagian dari header respons CSP.

Contoh konfigurasi CSP

Berikut adalah beberapa contoh konfigurasi CSP.

Contoh 1 - pelaporan dinonaktifkan

Contoh CSP 1, diarahkan model

Contoh CSP 1, kanvas

Dalam contoh:

  • Pelaporan dinonaktifkan.
  • Pemberlakuan berdasarkan model diaktifkan.
    • frame-ancestors disesuaikan dengan https://www.contoso.com dan https://www.fabrikam.com.
  • Pemberlakuan kanvas dinonaktifkan.

Header yang efektif adalah:

  • Aplikasi yang diarahkan model: 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;
  • Aplikasi kanvas: Header CSP tidak dikirim.

Contoh 2 - pelaporan diaktifkan

Contoh CSP 2, berbasis model

Contoh CSP 2, kanvas

Dalam contoh:

  • Pelaporan diaktifkan.
    • Titik akhir pelaporan diatur ke https://contoso.com/reporting-endpoint
  • Pemberlakuan berdasarkan model diaktifkan.
    • frame-ancestors dipertahankan sebagai default
  • Pemberlakuan kanvas dinonaktifkan.
    • frame-ancestors disesuaikan ke https://www.contoso.com

Nilai CSP yang efektif adalah:

  • Aplikasi yang diarahkan model: 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;
  • Aplikasi kanvas: 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;

Mengubah pengaturan organisasi secara langsung

Anda dapat mengonfigurasi CSP tanpa menggunakan UI dengan memodifikasi pengaturan organisasi ini secara langsung:

  • IsContentSecurityPolicyEnabled mengontrol apakah header Content-Security-Policy dikirim dalam aplikasi yang diarahkan model.

  • ContentSecurityPolicyConfiguration mengontrol nilai bagian frame-ancestors (seperti yang terlihat sebelumnya, diatur ke 'self' jika ContentSecurityPolicyConfiguration tidak diatur). Tentukan pengaturan ini dengan menggunakan objek JSON dengan struktur berikut – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Konfigurasi ini diterjemahkan menjadi script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Dari MDN) Petunjuk kerangka-kebijakan keamanan konten (CSP) HTTP menentukan induk valid yang dapat menanam halaman menggunakan <frame>, <iframe>, <object>, <embed>, atau <applet>.
  • IsContentSecurityPolicyEnabledForCanvas mengontrol apakah header Content-Security-Policy dikirim dalam aplikasi kanvas.

  • ContentSecurityPolicyConfigurationForCanvas mengontrol kebijakan untuk kanvas menggunakan proses yang sama yang dijelaskan dalam ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri mengontrol apakah pelaporan harus digunakan. Pengaturan ini digunakan oleh aplikasi yang diarahkan model dan kanvas. String yang valid mengirimkan laporan pelanggaran ke titik akhir yang ditentukan, menggunakan mode khusus laporan jika IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas dinonaktifkan. String kosong akan menonaktifkan pelaporan. Untuk informasi lebih lanjut, lihat dokumentasi pelaporan.

Konfigurasikan CSP tanpa UI

Khusus untuk lingkungan yang tidak berada di pusat admin Power Platform seperti konfigurasi lokal, admin mungkin perlu mengonfigurasi CSP menggunakan skrip untuk secara langsung memodifikasi pengaturan.

Mengaktifkan CSP tanpa UI

Lakukan langkah-langkah berikut untuk mengaktifkan CSP tanpa UI:

  • Buka alat pengembang browser saat menggunakan aplikasi yang diarahkan model sebagai pengguna dengan hak istimewa pembaruan entitas organisasi (Administrator Sistem adalah pilihan yang baik).
  • Rekatkan dan jalankan skrip berikut ini ke konsol.
  • Untuk mengaktifkan CSP, teruskan konfigurasi default - enableFrameAncestors(["'self'"])
  • Sebagai contoh mengaktifkan asal lain untuk menyematkan aplikasi - 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!')
}

Menonaktifkan CSP tanpa UI

Lakukan langkah-langkah berikut untuk menonaktifkan CSP tanpa UI:

  • Buka alat pengembang browser saat menggunakan aplikasi yang diarahkan model sebagai pengguna dengan hak istimewa pembaruan entitas organisasi (Administrator Sistem adalah pilihan yang baik).
  • Rekatkan dan jalankan skrip berikut ini ke konsol.
  • Untuk menonaktifkan CSP, rekatkan ke konsol: 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!')
}