Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Atualmente , há suporte para CSP (Política de Segurança de Conteúdo) em aplicativos baseados em modelo e tela. Os administradores podem controlar se o cabeçalho CSP é enviado e, até certo ponto, o que ele contém. As configurações estão no nível do ambiente, o que significa que ela é aplicada a todos os aplicativos no ambiente uma vez ativadas.
Nota
A política de segurança de conteúdo só se aplica a ambientes que usam o Dataverse.
Cada componente do valor de cabeçalho do CSP controla os ativos que podem ser baixados e são descritos com mais detalhes na MDN (Mozilla Developer Network): Os valores padrão são os seguintes:
| Diretiva | Valor padrão | Personalizável |
|---|---|---|
| script-src | * 'unsafe-inline' 'unsafe-eval' blob: data: |
Não |
| worker-src | 'self' blob: data: |
Não |
| style-src | * 'unsafe-inline' |
Não |
| font-src | * data: |
Não |
| frame-ancestors | 'self' https://*.powerapps.com |
Sim |
Esta configuração resulta em um CSP padrão de script-src * 'unsafe-inline' 'unsafe-eval' blob: data:; worker-src 'self' blob: data:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;.
Modo rigoroso
A alternância CSP estrita cria uma política de segurança de conteúdo que, na maioria das vezes, não inclui curingas ou diretivas inseguras, como unsafe-inline. Quando o CSP estrito estiver ativado, as diretivas detalhadas na tabela anterior se transformarão nas diretivas detalhadas na tabela a seguir. A <platform> notação significa que os domínios de plataforma são fornecidos conforme exigido pelo produto. Os domínios nesta seção podem mudar ao longo do tempo à medida que o produto cresce.
Nota
Atualmente, o CSP estrito só está disponível para aplicativos controlados por modelos.
| Diretiva | Valor padrão (controlado por modelo) | Personalizável |
|---|---|---|
| script-src | 'self' blob: data: <platform>' |
Sim |
| worker-src | 'self' blob: data: |
Não |
| style-src | 'self' 'unsafe-inline' <platform> |
Sim |
| font-src | 'self' data: <platform> |
Sim |
| frame-ancestors | 'self' https://*.powerapps.com |
Sim |
| img-src | 'self' blob: data: <platform> |
Sim |
| connect-src | 'self' blob: data: wss: <platform> |
Sim |
| frame-src | 'self' blob: <platform> |
Sim |
| base-uri | 'none' |
Não |
| form-action | <platform> |
Sim |
| default-src | 'self' |
Não |
Pré-requisitos
Para aplicativos Dynamics 365 customer engagement e outros aplicativos baseados em modelo, o CSP só está disponível em ambientes online e em organizações com Dynamics 365 customer engagement (on-premises), versão 9.1 ou posterior.
Configurar CSP
Você pode alternar e configurar o CSP por meio do Centro de administração do Power Platform. É importante habilitar primeiro um ambiente de desenvolvimento/teste, pois habilitar o CSP pode começar a bloquear cenários se a política for violada. Oferecemos suporte também a um modo apenas para relatório, permitindo uma transição mais fácil na produção.
Como configurar CSP:
- Entre no Centro de administração do Power Platform.
- No painel de navegação, selecione Gerenciar, em seguida, no painel Gerenciar, selecione Ambientes.
- Na página Ambientes, selecione um ambiente.
- Na barra de comandos, selecione Configurações.
- Expanda Produto e selecione Privacidade + Segurança.
A imagem a seguir mostra o estado padrão das configurações:
Relatando
A alternância Ativar relatórios controla se os aplicativos baseados em modelo e aplicativo de tela enviam relatórios de violação. Você precisa especificar um ponto de extremidade para habilitá-lo. Os relatórios de violação são enviados para este ponto de extremidade, independentemente de o CSP ser aplicado ou não (usando o modo somente relatório, se o CSP não for aplicado). Para obter mais informações, consulte documentação do relatório.
Aplicação
A aplicação do CSP é controlada de forma independente para aplicativos de tela e baseados em modelo para fornecer controle granular sobre as políticas. Use o pivô orientado por modelo/tela para modificar o tipo de aplicativo pretendido.
A alternância Aplicar política de segurança de conteúdo ativa a política padrão para imposição para determinado tipo de aplicativo. Ativar essa alternância mudará o comportamento dos aplicativos neste ambiente para aderir à política. Portanto, o fluxo de habilitação sugerido seria:
- Aplique em um ambiente de desenvolvimento/teste.
- Habilite o modo somente relatório na produção.
- Aplique em produção, se nenhuma violação for relatada.
Configurar diretivas
A seção Configurar diretivas permite controlar diretivas individuais dentro da política. Atualmente, apenas frame-ancestors podem ser personalizados.
Manter a diretiva padrão ativada utiliza o valor padrão especificado na tabela. Desativar a alternância permite que os administradores especifiquem valores personalizados para a diretiva e os anexem ao valor padrão. O exemplo abaixo define valores personalizados para frame-ancestors. A diretiva seria definida como frame-ancestors: 'self' https://*.powerapps.com https://www.foo.com https://www.bar.com neste exemplo, significando que o aplicativo seria hospedado na mesma origem, https://*.powerapps.com, https://www.foo.com e https://www.bar.com, mas não em outras origens. Use o botão Adicionar para adicionar entradas à lista e o ícone Excluir para removê-las.
Configurações comuns
Para integração do Microsoft Teams usando o Aplicativo Dynamics 365, adicione o seguinte a frame-ancestors:
https://teams.microsoft.com/https://teams.cloud.microsoft/https://msteamstabintegration.dynamics.com/
Para o Dynamics 365 App for Outlook, adicione o seguinte a frame-ancestors:
- Origem da página inicial do Outlook Web App
https://outlook.office.comhttps://outlook.office365.com
Para inserção do Power Apps nos relatórios do Power BI, adicione o seguinte a frame-ancestors:
https://app.powerbi.comhttps://ms-pbi.pbi.microsoft.com
Considerações importantes
Desativar a diretiva padrão e salvar com uma lista vazia desativa a diretiva completamente e não a envia como parte do cabeçalho de resposta do CSP.
Exemplos de configuração de CSP
Vamos dar uma olhada em alguns exemplos de configurações de CSP.
Exemplo 1 - relatórios desativados
No exemplo:
- Os relatórios estão desativados.
- A aplicação orientada por modelo está habilitada.
-
frame-ancestorsé personalizado parahttps://www.foo.comehttps://www.bar.com
-
- A imposição de tela está desativada.
Os cabeçalhos eficazes seriam:
- Aplicativos baseados em modelos:
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.foo.com https://www.bar.com; - Aplicativos de tela: o cabeçalho CSP não seria enviado.
Exemplo 2 - relatórios ativados
No exemplo:
- O relatório está ativado.
- O ponto de extremidade do relatório foi definido como
https://www.mysite.com/myreportingendpoint
- O ponto de extremidade do relatório foi definido como
- A aplicação orientada por modelo está habilitada.
-
frame-ancestorsé mantido como padrão
-
- A imposição de tela está desativada.
-
frame-ancestorsé personalizado comohttps://www.baz.com
-
Os valores CSP efetivos seriam:
- Aplicativos baseados em modelos:
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 'self' https://*.powerapps.com; report-uri https://www.mysite.com/myreportingendpoint; - Aplicativos de tela:
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;
Modificar as configurações da organização diretamente
Você pode configurar o CSP sem usar a interface do usuário modificando estas configurações da organização diretamente:
IsContentSecurityPolicyEnabled controla se o cabeçalho Content-Security-Policy é enviado nos aplicativos baseados em modelo.
ContentSecurityPolicyConfiguration controla o valor da parte frame-ancestors (como visto acima, ele é definido como
'self'seContentSecurityPolicyConfigurationnão estiver definido). Essa configuração é definida usando um objeto JSON com esta estrutura –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }. Esta configuração se traduz emscript-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'foo' 'bar';- (Da MDN) A diretiva HTTP Content-Security-Policy (CSP) frame-ancestors especifica pais válidos que podem conter uma página usando
<frame>,<iframe>,<object>,<embed>ou<applet>.
- (Da MDN) A diretiva HTTP Content-Security-Policy (CSP) frame-ancestors especifica pais válidos que podem conter uma página usando
IsContentSecurityPolicyEnabledForCanvas controla se o cabeçalho Content-Security-Policy é enviado nos aplicativos de tela.
ContentSecurityPolicyConfigurationForCanvas controla a política para tela usando o mesmo processo descrito em
ContentSecurityPolicyConfiguration.ContentSecurityPolicyReportUri controla se os relatórios devem ser usados. Essa configuração é usada por aplicativos de tela e baseados em modelo. Uma cadeia de caracteres válida envia relatórios de violação para o ponto de extremidade especificado, usando o modo somente relatório se
IsContentSecurityPolicyEnabled/IsContentSecurityPolicyEnabledForCanvasestiver desativado. Uma cadeia de caracteres vazia desabilita a geração de relatórios. Para obter mais informações, consulte documentação do relatório.
Configurar CSP sem Interface do Usuário
Especialmente para ambientes fora do centro de administração do Power Platform, como configurações local, os administradores talvez queiram configurar o CSP usando scripts para modificar diretamente as configurações.
Habilitar CSP sem IU
Siga estas etapas para habilitar o CSP sem interface do usuário:
- Abra as ferramentas de desenvolvimento do navegador enquanto usa o aplicativo baseado em modelo como um usuário com privilégios de atualização de entidade organizacional (Administrador do Sistema é uma boa opção).
- Cole e execute o script a seguir no console.
- Para habilitar o CSP, passe para a configuração padrão –
enableFrameAncestors(["'self'"]) - Como exemplo de habilitar outras origens para inserir o aplicativo -
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!')
}
Desabilitar CSP sem UI
Siga estas etapas para desabilitar o CSP sem interface do usuário:
- Abra as ferramentas de desenvolvimento do navegador enquanto usa o aplicativo baseado em modelo como um usuário com privilégios de atualização de entidade organizacional (Administrador do Sistema é uma boa opção).
- Cole e execute o script a seguir no console.
- Para desabilitar o CSP, cole no console:
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!')
}