
Salesforce object access auditor
Rilasciato come open source da NCC Group Plc - https://www.nccgroup.com/
Sviluppato da Jerome Smith @exploresecurity (con ringraziamenti a Viktor Gazdag @wucpi)
https://www.github.com/nccgroup/raccoon
Rilasciato sotto AGPL - fare riferimento a LICENSE per maggiori informazioni.
Questo strumento determina quali Profili e Set di Autorizzazioni (con utenti attivi) hanno una qualche combinazione di permessi di lettura/modifica/eliminazione su TUTTI i record per un dato insieme di oggetti, in base alla loro condivisione effettiva e alle impostazioni degli oggetti. Da questo output è possibile analizzare le configurazioni errate che potenzialmente consentono un accesso eccessivo a oggetti che contengono dati sensibili. Fare riferimento al post del blog di accompagnamento per il contesto su https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce.
Si consiglia di verificare manualmente i risultati con riferimento diretto alla configurazione di Salesforce e/o testando i Profili e i Set di Autorizzazioni interessati. Qualora vengano riscontrate discrepanze, si prega di segnalare un problema con quanti più dettagli possibile.
Requisiti:
requests (coperto da requirements.txt)username + password + (opzionale) token OPPURE sessionId (maggiori dettagli nella sezione Autenticazione).Creare un file di configurazione JSON (o usare config.json come modello) e compilarlo come richiesto:
{
"hostname": "somewhere.my.salesforce.com",
"username": "",
"password": "",
"token": "<token opzionale>",
"sessionId": "",
"objects": ["Account", "Contact"],
"checkLimits": true,
"debug": "<livello di debug opzionale (0, 1 o 2)>"
}
objects è un elenco di oggetti Salesforce di interesse (cioè i dati a cui si tiene di più). Usare i nomi API formali è il metodo più affidabile ma, se non viene trovata una corrispondenza, Raccoon proverà alcune semplici corrispondenze basate, ad esempio, sull'etichetta visualizzata. Se Raccoon non riesce comunque a trovare una corrispondenza, il programma continuerà ma lo segnalerà nell'output.
checkLimits consente di verificare la disponibilità di chiamate API rimanenti per l'istanza in esame nel periodo mobile di 24 ore. Raccoon effettua relativamente poche chiamate per oggetto (oltre a un numero fisso per esecuzione) ma, per cortesia, questo parametro consente di controllare i propri limiti prima di procedere. Il valore predefinito è true. Il numero totale di possibili richieste rimanenti al punto di controllo non è certo perché il numero di chiamate dipenderà da quanti oggetti hanno un modello di condivisione 'Controlled by Parent'. Il numero indicato presuppone che tutti lo abbiano ed è quindi un massimo.
Eseguire:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
Quando si usano nome utente e password, notare che potrebbe essere necessario anche un token di sicurezza (se si proviene da un indirizzo IP esterno agli intervalli di Network Access definiti). Fare riferimento a questo articolo per maggiori informazioni.
L'uso dell'alternativa con ID di sessione è utile in molti casi:
Per ottenere l'ID di sessione:
sid: assicurarsi di prendere quello il cui attributo Domain include my.salesforce.com o cloudforce.comOutput di esempio (abbreviato e anonimizzato):
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
Raccoon esamina solo i Profili e i Set di Autorizzazioni con utenti attivi per ridurre la verbosità dell'output. Le informazioni relative a questo vengono visualizzate, dopodiché:
Se l'assegnazione dei privilegi è stata concessa tramite un Permission Set Group, anziché un singolo Permission Set, un asterisco appare come indicatore di indentazione a sinistra del nome al posto del solito trattino (Accounts PS Group nell'output di esempio precedente). Inoltre, viene mostrato anche se il Profilo o il Set di Autorizzazioni è personalizzato (per i Permission Set, personalizzato significa "creato da un amministratore", altrimenti "è standard e correlato a una specifica licenza di permission set" [ref]).
Sia per la condivisione globale che per quella degli oggetti, i Profili e i Set di Autorizzazioni sono ordinati per riflettere il probabile interesse. Il primo livello di ordinamento riguarda il tipo di utente assegnato - 'guest' (non autenticato) per primo, seguito da 'external' (vari tipi di utente portal) e poi 'internal' (qualsiasi altra cosa). È importante notare che 'external' qui è correlato alla definizione usata nel contesto del 'external sharing model' [ref]. L'idea è di evidenziare una condivisione potenzialmente eccessiva per utenti non autenticati o portal. Tuttavia, è alquanto sperimentale perché la documentazione Salesforce non è esaustiva nel suo elenco di valori validi 'UserType' per l'oggetto 'User' [ref]. Di conseguenza, è possibile che si verifichi una classificazione errata - si prega di segnalare un problema in tal caso. Il secondo livello di ordinamento si basa sul numero di utenti attivi - prima quelli più alti (viene visualizzato anche il numero totale di utenti assegnati per informazione).
L'obiettivo principale di Raccoon è evidenziare i casi di accesso diffuso a tutti i record, e copre:
I seguenti fattori, che influenzano solo un sottoinsieme di record, non vengono valutati:
Alcuni oggetti, come 'User' e 'File', non si adattano al modello di condivisione standard e/o entrano in gioco altri permessi di sistema. I casi noti vengono segnalati nell'output se sono specificati nell'elenco objects.
Le istanze con oltre 2.000 Profili e Set di Autorizzazioni combinati non sono supportate a causa delle limitazioni della piattaforma sull'uso di 'GROUP BY' nelle istruzioni SOQL. Questa è una concessione generosa e dovrebbe rappresentare un blocco solo nei casi più estremi.
Questo strumento esegue solo operazioni di lettura. Potrebbe quindi sorprendere vedere 'Modify Metadata Through Metadata API Functions' come requisito per l'account usato per eseguire lo strumento. Tuttavia, al momento della stesura, non sembra possibile configurare un account con permessi di sola lettura per la Metadata API. Dalla documentazione:
Identificare un utente che dispone del permesso API Enabled e del permesso Modify Metadata Through Metadata API Functions o del permesso Modify All Data. Questi permessi sono necessari per accedere alle chiamate Metadata API. Se un utente richiede l'accesso ai metadati ma non ai dati, abilitare il permesso Modify Metadata Through Metadata API Functions. In caso contrario, abilitare il permesso Modify All Data.
Si suggerisce pertanto di usare 'Modify Metadata Through Metadata API Functions' invece di 'Modify All Data'.
Se il problema riguarda l'accesso, controllare prima di tutto il nome host, il nome utente, la password e il token di sicurezza (se richiesto). Considerare anche se la password necessita di essere reimpostata (provare il normale accesso web a Salesforce) perché questa condizione restituisce un errore che è indistinguibile da un accesso non valido. Se si usa un ID di sessione, assicurarsi che sia valido per il dominio corretto.
Eseguire lo strumento con debug impostato su 2, poiché l'output dettagliato può aiutare a identificare la causa. Questo livello genera anche uno stack trace in un file indicato nell'output. Quando si segnala un problema, includere sia l'output della console che lo stack trace (anonimizzare come necessario).
Noto per frugare tra gli oggetti.