
Salesforce object access auditor
Lançado como código aberto pela NCC Group Plc - https://www.nccgroup.com/
Desenvolvido por Jerome Smith @exploresecurity (com agradecimentos a Viktor Gazdag @wucpi)
https://www.github.com/nccgroup/raccoon
Lançado sob AGPL - consulte LICENSE para mais informações.
Esta ferramenta determina quais Perfis e Conjuntos de Permissões (com utilizadores ativos) têm alguma combinação de permissões de leitura/edição/eliminação em TODOS os registos para um determinado conjunto de objetos, com base nas suas definições eficazes de partilha e de objetos. A partir desta saída, podem ser investigadas más configurações que potencialmente permitem acesso excessivo a objetos que contêm dados sensíveis. Consulte a publicação do blogue que acompanha esta ferramenta para contexto em https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce.
Recomenda-se que os resultados sejam verificados manualmente com referência direta à configuração do Salesforce e/ou testando os Perfis e Conjuntos de Permissões afetados. Caso sejam encontradas discrepâncias, comunique um problema com o máximo de detalhe possível.
Requisitos:
requests do Python (abrangido por requirements.txt)username + password + (opcional) token OU sessionId (mais detalhes na secção Autenticação).Crie um ficheiro de configuração JSON (ou utilize config.json como modelo) e preencha conforme necessário:
{
"hostname": "somewhere.my.salesforce.com",
"username": "",
"password": "",
"token": "<optional token>",
"sessionId": "",
"objects": ["Account", "Contact"],
"checkLimits": true,
"debug": <optional debug level (0, 1 or 2)>
}
objects é uma lista de objetos do Salesforce de interesse (ou seja, os dados que mais lhe interessam). Utilizar os nomes formais da API é o método mais fiável, mas, caso não seja encontrada uma correspondência, o Raccoon tentará algumas correspondências simples baseadas, por exemplo, no rótulo de exibição. Se o Raccoon ainda assim não encontrar uma correspondência, o programa continuará, mas assinalará isso na saída.
checkLimits permite-lhe verificar a quantidade de chamadas de API restantes para a instância em investigação no período contínuo de 24 horas. O Raccoon faz relativamente poucas chamadas por objeto (além de um número fixo por execução), mas, como cortesia, este parâmetro permite-lhe verificar os seus limites antes de prosseguir. O valor predefinido é true. O número total de pedidos possíveis restantes no ponto de verificação não é certo porque o número de chamadas dependerá de quantos objetos têm um modelo de partilha 'Controlled by Parent'. O número indicado assume que todos o têm e, portanto, é um máximo.
Execute:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
Ao utilizar um nome de utilizador e palavra-passe, note que um token de segurança também pode ser necessário (se estiver a aceder a partir de um endereço IP fora de quaisquer intervalos de Acesso à Rede definidos). Consulte este artigo para mais informações.
Utilizar a alternativa do ID de sessão é útil em muitos casos:
Para obter o ID de sessão:
sid: certifique-se de que obtém aquele cujo atributo Domain inclui my.salesforce.com ou cloudforce.comExemplo de saída (resumida e anonimizada):
Raccoon - Salesforce object access auditor
- version 1.0
- https://www.github.com/nccgroup/raccoon
* Refer to README for usage notes including important limitations *
Target instance: somewhere.my.salesforce.com
- Login successful
4,969,529 API requests can be sent to this instance from a 24-hour limit of 5,000,000
- Up to 33 further requests are required to complete (3 requests sent so far)
- Do you want to continue? Enter 'y' to proceed: y
Validating objects
- Found object 'Accounts' with API name 'Account'
- Found object 'Contact' with API name 'Contact'
- Found object 'Quotes' with API name 'Quote__c'
- Found object 'Quote Lines' with API name 'QuoteLine__c'
Evaluating 28 Profiles and 104 Permission Sets
- Profiles with active users: 15
- Permission Sets with active users: 67
- Ignoring 50 unused Profiles and Permission Sets
Global Sharing Overrides (ALL records for ALL objects)
------------------------------------------------------
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- System Administrator 61/91 [I]
READ
Profiles
- Integration User [C] 1/1 [I]
- Analytics Cloud Integration User 1/1 [I]
Object Sharing (ALL records for EACH object)
--------------------------------------------
Account:
Organization-wide default sharing
- Internal: Public Read Only
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Integration User [C] 1/1 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
READ
Profiles
- Read Only [C] 192/199 [I]
- Sales User [C] 192/248 [I]
- Finance User [C] 16/20 [I]
- Standard User 6/3075 [I]
Permission Sets (* Groups)
* Accounts PS Group [C] 36/39 [I]
- Sales Operations [C] 24/26 [I]
- SharePoint User [C] 3/4 [I]
Sharing Rules (manual check required):
- Criteria-based rules configured
- Ownership-based rules configured
Contact:
Organization-wide default sharing
- Internal: Controlled by Parent
- External: <Undefined>
Parent object: 'Account'
- Internal: Public Read Only
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Integration User 1/1 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
READ
Profiles
- Read Only [C] 192/199 [I]
- Sales User [C] 192/248 [I]
- Finance User [C] 16/20 [I]
- Standard User 6/3075 [I]
Permission Sets (* Groups)
- Sales Operations [C] 24/26 [I]
Quote__c:
Organization-wide default sharing
- Internal: Public Read/Write
- External: <Undefined>
READ/EDIT [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Sales User [C] 192/248 [I]
READ
Profiles
- Finance User [C] 16/20 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
QuoteLine__c:
Organization-wide default sharing
- Internal: Controlled by Parent
- External: <Undefined>
Parent object: 'Quote__c'
- Internal: Public Read/Write
- External: <Undefined>
READ/EDIT/DELETE [C]ustom Active/Total [G]uest[E]xt[I]nt
Profiles
- Sales User [C] 192/248 [I]
READ
Profiles
- Finance User [C] 16/20 [I]
Permission Sets (* Groups)
- Mulesoft Integration [C] 2/2 [I]
Total API requests sent: 31
O Raccoon apenas examina Perfis e Conjuntos de Permissões com utilizadores ativos para reduzir a verbosidade da sua saída. As informações sobre isso são apresentadas, após o que:
Se a atribuição de privilégios tiver sido concedida através de um Grupo de Conjuntos de Permissões, em vez de um único Conjunto de Permissões, um asterisco aparece como marcador de indentação à esquerda do nome, em vez do hífen habitual (Accounts PS Group no exemplo de saída acima). Além disso, também é indicado se o Perfil ou Conjunto de Permissões é personalizado (para Conjuntos de Permissões, personalizado significa "criado por um administrador"; caso contrário, "é padrão e está relacionado a uma licença específica de conjunto de permissões" [ref]).
Tanto para a partilha global como para a partilha de objetos, os Perfis e Conjuntos de Permissões são ordenados para refletir o provável interesse. O primeiro nível de ordenação diz respeito ao tipo de utilizador atribuído - 'convidado' (não autenticado) primeiro, seguido de 'externo' (vários tipos de utilizador de portal) e depois 'interno' (qualquer outro). É importante notar que 'externo' aqui está relacionado com a definição utilizada no contexto do 'modelo de partilha externo' [ref]. A ideia é destacar partilha potencialmente excessiva para utilizadores não autenticados ou de portal. No entanto, é algo experimental porque a documentação do Salesforce não é exaustiva na sua lista de valores 'UserType' válidos para o objeto 'User' [ref]. Como resultado, é possível que ocorra uma classificação incorreta - nesse caso, comunique um problema. O segundo nível de ordenação é baseado no número de utilizadores ativos - primeiro os mais elevados (o número total de utilizadores atribuídos também é apresentado para informação).
O principal objetivo do Raccoon é destacar casos de acesso generalizado a todos os registos, e abrange:
Os seguintes fatores, que afetam apenas um subconjunto de registos, não são avaliados:
Certos objetos, como 'User' e 'File', não se enquadram no modelo de partilha padrão e/ou outras permissões do sistema entram em jogo. Os casos conhecidos são assinalados na saída se forem especificados na lista objects.
Instâncias com mais de 2.000 Perfis e Conjuntos de Permissões combinados não são suportadas devido a limitações da plataforma no uso de 'GROUP BY' em declarações SOQL. Esta é uma margem generosa e só deve ser um bloqueio nos casos mais extremos.
Esta ferramenta apenas realiza operações de leitura. Portanto, pode ser surpreendente ver 'Modify Metadata Through Metadata API Functions' como requisito para a conta utilizada para executar a ferramenta. No entanto, no momento em que isto é escrito, não parece ser possível configurar uma conta com permissões apenas de leitura para a Metadata API. A partir da documentação:
Identifique um utilizador que tenha a permissão API Enabled e a permissão Modify Metadata Through Metadata API Functions ou a permissão Modify All Data. Estas permissões são necessárias para aceder a chamadas da Metadata API. Se um utilizador precisar de acesso aos metadados, mas não aos dados, ative a permissão Modify Metadata Through Metadata API Functions. Caso contrário, ative a permissão Modify All Data.
É portanto sugerido que 'Modify Metadata Through Metadata API Functions' seja utilizado em vez de 'Modify All Data'.
Se o problema for com o início de sessão, verifique primeiro novamente o hostname, o nome de utilizador, a palavra-passe e o token de segurança (se necessário). Considere também se a palavra-passe precisa de ser reposta (tente o início de sessão habitual na web do Salesforce), porque esta condição devolve um erro indistinguível de um início de sessão inválido. Se estiver a utilizar um ID de sessão, certifique-se de que é válido para o domínio correto.
Execute a ferramenta com debug definido como 2, pois a saída verbosa pode ajudar a identificar a causa. Este nível também envia um stack trace para um ficheiro cujo nome é indicado na saída. Se comunicar um problema, inclua tanto a saída da consola como o stack trace (anonimize conforme necessário).
Conhecido por vasculhar objetos.