Política de segurança de conteúdo
política de segurança de conteúdo (CSP) é atualmente suportado em modelos e canvas Power Apps. 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 serão aplicadas a todos os aplicativos no ambiente quando ativados.
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-fonte | * 'unsafe-inline' 'unsafe-eval' |
Não |
trabalhador-src | 'self' blob: |
Não |
estilo-src | * 'unsafe-inline' |
Não |
fonte-src | * data: |
Não |
ancestrais-de-quadro | 'self' https://*.powerapps.com |
Sim |
Isso resulta em um CSP padrão de script-src * 'unsafe-inline' 'unsafe-eval'; worker-src 'self' blob:; style-src * 'unsafe-inline'; font-src * data:; frame-ancestors 'self' https://*.powerapps.com;
Em nosso roteiro, temos a capacidade de modificar cabeçalhos atualmente não personalizáveis.
Pré-requisitos
- Para aplicativos de engajamento do cliente do Dynamics 365 e outros aplicativos baseados em modelo, o CSP está disponível somente em ambientes online e em organizações com o Dynamics 365 Customer Engajamento (local), versão 9.1 ou posterior.
Configurando o CSP
O CSP pode ser alternado e configurado através do centro de administração do Power Platform. É importante habilitar primeiro em um ambiente de desenvolvimento/teste, pois habilitar o CSP pode começar a bloquear cenários se a política for violada. Oferecemos suporte a um "modo somente relatório" para permitir um aumento mais fácil na produção.
Para configurar o CSP, navegue até o centro de administração do Power Platform ->Ambientes ->Configurações ->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 de tela enviam relatórios de violação. Ativá-lo requer que um ponto de extremidade seja especificado. 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 aplicaçã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
Esta seção permite controlar diretivas individuais dentro da política. Atualmente, apenas frame-ancestors
podem ser personalizados.
Deixar a diretiva padrão ativada usa o valor padrão especificado na tabela mostrada anteriormente neste artigo. 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 de exclusão 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.com
https://outlook.office365.com
Para inserção do Power Apps nos relatórios do Power BI, adicione o seguinte a frame-ancestors
:
https://app.powerbi.com
https://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
Vamos dar uma olhada em alguns exemplos de configuração CSP:
Exemplo 1
No exemplo:
- Os relatórios estão desativados.
- A aplicação orientada por modelo está habilitada.
frame-ancestors
é personalizado parahttps://www.foo.com
ehttps://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'; worker-src 'self' blob:; 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
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 parahttps://www.baz.com
Os valores CSP efetivos seriam:
- Aplicativos baseados em modelos:
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;
- 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;
Configurações da organização
O CSP pode ser configurado sem usar a Interface do Usuário modificando diretamente as seguintes configurações da organização:
IsContentSecurityPolicyEnabled controla se o cabeçalho Content-Security-Policy é enviado em aplicativos orientados a modelo.
ContentSecurityPolicyConfiguration controla o valor da parte frame-ancestors (como visto acima, é definido como
'self'
seContentSecurityPolicyConfiguration
não estiver definido). Essa configuração é representada por um objeto JSON com esta estrutura –{ "Frame-Ancestor": { "sources": [ { "source": "foo" }, { "source": "bar" } ] } }
. Isso se traduziria 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 em aplicativos Canvas.
ContentSecurityPolicyConfigurationForCanvas controla a política para canvas usando o mesmo processo descrito
ContentSecurityPolicyConfiguration
acima.ContentSecurityPolicyReportUri controla se os relatórios devem ser usados. Essa configuração é usada por aplicativos baseados em modelo e de tela. Uma string válida envia relatórios de violação para o ponto de extremidade especificado, usando o modo somente relatório se
IsContentSecurityPolicyEnabled
/IsContentSecurityPolicyEnabledForCanvas
estiver desativado. Uma string 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.
Ativando CSP sem Interface do Usuário
Etapas:
- 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 abaixo no console.
- Para habilitar o CSP, passe a configuração padrão -
enableFrameAncestors(["'self'"])
- Como exemplo de como permitir que outras origens incorporem 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!')
}
Desativando CSP sem Interface do Usuário
Etapas:
- 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 seguinte script 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!')
}