Kongsi melalui


Dasar keselamatan kandungan

Nota

Pusat pentadbiran Power Platform baharu dan dipertingkatkan kini tersedia secara umum. Kami sedang mengemas kini dokumentasi untuk mencerminkan perubahan ini, jadi semak semula untuk memastikan anda mendapat kemas kini terkini.

Dasar Keselamatan Kandungan (CSP) kini disokong dalam dipacu model dan kanvas Power Apps. Pentadbir boleh mengawal sama ada pengepala CSP dihantar dan sehingga kandungannya. Tetapan berada pada tahap persekitaran, yang bermaksud ia akan digunakan pada semua apl dalam persekitaran sebaik sahaja dihidupkan.

Nota

Dasar keselamatan kandungan hanya terpakai kepada persekitaran yang menggunakan Dataverse.

Setiap komponen nilai pengepala CSP mengawal aset yang boleh dimuat turun dan diterangkan dengan lebih terperinci pada Mozilla Developer Network (MDN). Nilai lalai adalah seperti berikut:

Arahan Nilai lalai Boleh suai
skrip-src * 'unsafe-inline' 'unsafe-eval' No
pekerja-src 'self' blob: No
gaya-src * 'unsafe-inline' No
fon-src * data: No
nenek moyang bingkai 'self' https://*.powerapps.com Ya

Konfigurasi ini menghasilkan CSP script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com; lalai. Dalam peta jalan kami, kami mempunyai keupayaan untuk mengubah suai pengepala yang tidak boleh disesuaikan pada masa ini.

Prasyarat

  • Untuk aplikasi penglibatan pelanggan Dynamics 365 dan aplikasi dipacu model lain, CSP hanya tersedia dalam persekitaran dalam talian dan dalam organisasi dengan penglibatan pelanggan Dynamics 365 (di premis), versi 9.1 atau versi yang lebih baru.

Konfigurasi CSP

Anda boleh togol dan konfigurasi CSP melalui Power Platform pusat pentadbiran. Adalah penting untuk mendayakan persekitaran pembangunan/ujian terlebih dahulu kerana mendayakan CSP boleh mula menyekat senario jika dasar dilanggar. Kami juga menyokong "mod lapor sahaja" untuk membolehkan susur dengan lebih mudah dalam pengeluaran.

Untuk mengkonfigurasikan CSP:

  1. Daftar masuk ke pusat pentadbiran Power Platform.
  2. Dalam anak tetingkap navigasi, pilih Urus, kemudian dalam anak tetingkap Urus , pilih Persekitaran.
  3. Pada halaman Persekitaran , pilih persekitaran.
  4. Dalam bar perintah, pilih Tetapan.
  5. Kembangkan Produk, kemudian pilih Privasi + Keselamatan.

Imej berikut menunjukkan keadaan lalai tetapan:

Tetapan lalai dasar keselamatan kandungan.

Pelaporan

Togol Dayakan pelaporan mengawal sama ada aplikasi dipacu model dan kanvas menghantar laporan pelanggaran. Anda dikehendaki menentukan titik akhir untuk mendayakannya. Laporan pelanggaran dihantar ke titik akhir ini tanpa mengira sama ada CSP dikuatkuasakan atau tidak (menggunakan mod laporan sahaja jika CSP tidak dikuatkuasakan). Untuk mendapatkan maklumat lanjut, rujuk dokumentasi pelaporan.

Dayakan togol pelaporan kepada dihidupkan.

Pelaksanaan

Penguatkuasaan CSP dikawal secara bebas untuk aplikasi berpandukan model dan aplikasi kanvas untuk memberikan kawalan butiran terhadap dasar. Gunakan pangsi berpandukan model/kanvas untuk mengubah suai jenis aplikasi yang dimaksudkan.

Togol "Kuatkuasakan dasar keselamatan kandungan" menghidupkan dasar lalai untuk penguatkuasaan bagi jenis apl yang diberikan. Menghidupkan togol ini mengubah tingkah laku apl dalam persekitaran ini untuk mematuhi dasar. Oleh itu, aliran pendayaan yang dicadangkan akan:

  1. Dikuatkuasakan ke atas persekitaran pembangunan/ujian.
  2. Mendayakan mod lapor sahaja dalam pengeluaran.
  3. Dikuatkuasakan dalam pengeluaran sebaik sahaja pelanggaran dilaporkan.

Konfigurasikan arahan

Bahagian ini membolehkan anda mengawal arahan individu dalam dasar ini. Pada masa ini, hanya frame-ancestors boleh disesuaikan.

Konfigurasikan arahan CSP.

Membiarkan arahan lalai dihidupkan menggunakan nilai lalai yang dinyatakan dalam jadual yang ditunjukkan sebelum ini dalam artikel ini. Mematikan togol membolehkan pentadbir menentukan nilai tersuai untuk arahan dan menambahkannya pada nilai lalai. Contoh di bawah menetapkan nilai tersuai untuk frame-ancestors. Arahan akan ditetapkan dalam frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com contoh ini, bermakna apl boleh dihoskan dalam asal yang sama, https://*.powerapps.com,dan https://www.foo.comhttps://www.bar.com, tetapi tidak dalam asal lain. Gunakan butang Tambah untuk menambah entri pada senarai dan ikon Padam untuk mengalih keluarnya.

Menetapkan arahan CSP tersuai.

Konfigurasi biasa

Untuk Microsoft Teams penyepaduan menggunakan aplikasi Dynamics 365, tambahkan yang berikut kepada frame-ancestors:

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

Untuk itu Dynamics 365 App for Outlook, tambah yang berikut kepada frame-ancestors:

  • Asal halaman utama Outlook Web App anda
  • https://outlook.office.com
  • https://outlook.office365.com

Untuk membenamkan Power Apps dalam Power BI laporan, tambahkan yang berikut kepada frame-ancestors:

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

Pertimbangan penting

Mematikan arahan lalai dan menyimpan dengan senarai kosong mematikan arahan sepenuhnya dan tidak menghantarnya sebagai sebahagian daripada pengepala respons CSP.

Contoh konfigurasi CSP

Mari kita lihat beberapa contoh konfigurasi CSP.

Contoh 1 - pelaporan dimatikan

Contoh CSP 1.

Dalam contoh:

  • Pelaporan dimatikan.
  • Penguatkuasaan berpandukan model didayakan.
    • frame-ancestors disesuaikan kepada https://www.foo.com dan https://www.bar.com
  • Penguatkuasaan kanvas dinyahdayakan.

Pengepala yang berkesan ialah:

  • Aplikasi berpandukan model: 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;
  • Aplikasi kanvas: Pengepala CSP tidak akan dihantar.

Contoh 2 - pelaporan dihidupkan

Contoh CSP 2.

Dalam contoh:

  • Pelaporan dihidupkan.
    • Titik tamat pelaporan ditetapkan untuk https://www.mysite.com/myreportingendpoint
  • Penguatkuasaan berpandukan model didayakan.
    • frame-ancestors disimpan sebagai lalai
  • Penguatkuasaan kanvas dinyahdayakan.
    • frame-ancestors disesuaikan dengan https://www.baz.com

Nilai CSP yang berkesan ialah:

  • Apl dipacu model: 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;
  • 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.baz.com; report-uri https://www.mysite.com/myreportingendpoint;

Ubah suai tetapan organisasi secara langsung

Anda boleh mengkonfigurasi CSP tanpa menggunakan UI dengan mengubah suai seting organisasi ini secara langsung:

  • IsContentSecurityPolicyEnabled mengawal sama ada pengepala Content-Security-Policy dihantar dalam aplikasi dipacu model.

  • ContentSecurityPolicyConfiguration mengawal nilai bahagian nenek moyang bingkai (seperti yang dilihat di atas, ia ditetapkan kepada 'self' jika ContentSecurityPolicyConfiguration tidak ditetapkan). Tetapan ini ditakrifkan menggunakan objek JSON dengan struktur berikut – { "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Konfigurasi ini diterjemahkan kepada script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';

    • (Dari MDN) HTTP Content-Security-Policy (CSP) arahan bingkai-moyang menentukan induk yang sah yang mungkin akan membenamkan halaman menggunakan <frame>, <iframe>, <object>, <embed>, atau <applet>.
  • IsContentSecurityPolicyEnabledForCanvas mengawal sama ada pengepala Content-Security-Policy dihantar dalam aplikasi kanvas.

  • ContentSecurityPolicyConfigurationForCanvas mengawal dasar untuk kanvas menggunakan proses yang sama yang diterangkan dalam ContentSecurityPolicyConfiguration.

  • ContentSecurityPolicyReportUri mengawal sama ada pelaporan perlu digunakan. Tetapan ini digunakan oleh kedua-dua aplikasi berpandukan model dan kanvas. Rentetan yang sah menghantar laporan pelanggaran ke titik akhir yang ditentukan, menggunakan mod laporan sahaja jika IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvas dimatikan. Rentetan kosong menyahdayakan pelaporan. Untuk mendapatkan maklumat lanjut, rujuk dokumentasi pelaporan.

Konfigurasi CSP tanpa UI

Terutamanya untuk persekitaran tidak dalam pusat pentadbir Power Platform seperti konfigurasi di premis, pentadbir mungkin mahu mengkonfigurasi CSP menggunakan skrip untuk mengubah suai tetapan secara langsung.

Dayakan CSP tanpa UI

Ambil langkah ini untuk mendayakan CSP tanpa UI:

  • Buka alat pembangunan pelayar semasa menggunakan aplikasi berpandukan model sebagai pengguna dengan kelayakan kemas kini entiti organisasi (Pentadbir Sistem ialah pilihan yang baik).
  • Tampal dan laksanakan skrip berikut ke dalam konsol.
  • Untuk mendayakan CSP, hantar konfigurasi lalai - enableFrameAncestors(["'self'"])
  • Sebagai contoh membolehkan asal lain membenamkan apl - 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!')
}

Lumpuhkan CSP tanpa UI

Ambil langkah ini untuk menyahdayakan CSP tanpa UI:

  • Buka alat pembangunan pelayar semasa menggunakan aplikasi berpandukan model sebagai pengguna dengan kelayakan kemas kini entiti organisasi (Pentadbir Sistem ialah pilihan yang baik).
  • Tampal dan laksanakan skrip berikut ke dalam konsol.
  • Untuk menyahdayakan CSP, tampal ke dalam 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!')
}