Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
- Masuk ke pusat admin Power Platform.
- Di panel navigasi, pilih Kelola. Di panel Kelola, pilih Lingkungan.
- Pada halaman Lingkungan, pilih lingkungan.
- Pilih Pengaturan di bilah perintah.
- Luaskan Produk, lalu pilih Privasi + Keamanan.
Gambar berikut menampilkan status default pengaturan:
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.
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:
- Terapkan kebijakan pada lingkungan pengembangan atau pengujian.
- Aktifkan mode hanya laporan dalam produksi.
- 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 .
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.
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.comhttps://outlook.office365.com
Untuk menyematkan Power Apps dalam laporan Power BI, tambahkan yang berikut ini ke frame-ancestors
https://app.powerbi.comhttps://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, kanvas
Dalam contoh:
- Pelaporan dinonaktifkan.
- Pemberlakuan berdasarkan model diaktifkan.
-
frame-ancestorsdisesuaikan denganhttps://www.contoso.comdanhttps://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
Dalam contoh:
- Pelaporan diaktifkan.
- Titik akhir pelaporan diatur ke
https://contoso.com/reporting-endpoint
- Titik akhir pelaporan diatur ke
- Pemberlakuan berdasarkan model diaktifkan.
-
frame-ancestorsdipertahankan sebagai default
-
- Pemberlakuan kanvas dinonaktifkan.
-
frame-ancestorsdisesuaikan kehttps://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'jikaContentSecurityPolicyConfigurationtidak diatur). Tentukan pengaturan ini dengan menggunakan objek JSON dengan struktur berikut –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Konfigurasi ini diterjemahkan menjadiscript-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>.
- (Dari MDN) Petunjuk kerangka-kebijakan keamanan konten (CSP) HTTP menentukan induk valid yang dapat menanam halaman menggunakan
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/IsContentSecurityPolicyEnabledForCanvasdinonaktifkan. 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!')
}