
Auditor de acceso a objetos de Salesforce
Publicado como código abierto por NCC Group Plc - https://www.nccgroup.com/
Desarrollado por Jerome Smith @exploresecurity (con agradecimientos a Viktor Gazdag @wucpi)
https://www.github.com/nccgroup/raccoon
Publicado bajo AGPL - consulte LICENSE para más información.
Esta herramienta determina qué Perfiles y Conjuntos de Permisos (con usuarios activos) tienen alguna combinación de permisos de lectura/edición/eliminación sobre TODOS los registros de un conjunto determinado de objetos, basándose en su uso compartido efectivo y en la configuración de los objetos. A partir de esta salida, se pueden investigar configuraciones incorrectas que potencialmente permiten un acceso excesivo a objetos que contienen datos sensibles. Consulte la publicación de blog adjunta para obtener los antecedentes en https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce.
Se recomienda verificar los resultados manualmente con referencia directa a la configuración de Salesforce y/o probando los Perfiles y Conjuntos de Permisos afectados. Si se encuentran discrepancias, por favor notifique un problema con el mayor detalle posible.
Requisitos:
requests de Python (cubierto por requirements.txt)username + password + (opcional) token O sessionId (más detalles en la sección Autenticación).Cree un archivo de configuración JSON (o use config.json como plantilla) y complételo según sea necesario:
{
"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 es una lista de objetos de Salesforce de interés (es decir, los datos que más le importan). Usar los nombres formales de la API es el método más fiable pero, si no se encuentra una coincidencia, Raccoon intentará algunas coincidencias simples basadas, por ejemplo, en la etiqueta mostrada. Si Raccoon aún no logra encontrar una coincidencia, el programa continuará pero lo señalará en la salida.
checkLimits le permite verificar el saldo de llamadas a la API restantes para la instancia bajo investigación dentro del período móvil de 24 horas. Raccoon realiza relativamente pocas llamadas por objeto (además de un número fijo por ejecución) pero, como cortesía, este parámetro le permite verificar sus límites antes de continuar. El valor predeterminado es true. El número total de solicitudes posibles restantes en el punto de control no es seguro porque el número de llamadas dependerá de cuántos objetos tengan un modelo de uso compartido 'Controlled by Parent'. El número indicado asume que todos lo tienen y, por lo tanto, es un máximo.
Ejecute:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
Cuando se utilizan un nombre de usuario y una contraseña, tenga en cuenta que también puede ser necesario un token de seguridad (si se accede desde una dirección IP fuera de los rangos definidos de Network Access). Consulte este artículo para más información.
Usar la alternativa del ID de sesión es útil en muchos casos:
Para obtener el ID de sesión:
sid: asegúrese de tomar la que tenga el atributo Domain que incluya my.salesforce.com o cloudforce.comSalida de ejemplo (resumida y 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
Raccoon sólo examina Perfiles y Conjuntos de Permisos con usuarios activos para reducir la verbosidad de su salida. La información sobre esto se muestra, después de lo cual:
Si la asignación de privilegios se ha concedido a través de un Grupo de Conjuntos de Permisos, en lugar de un único Conjunto de Permisos, aparece un asterisco como marcador de sangría a la izquierda del nombre en lugar del guion habitual (Accounts PS Group en la salida de ejemplo anterior). Además, también se muestra si el Perfil o Conjunto de Permisos es personalizado (para Conjuntos de Permisos, personalizado significa "creado por un administrador"; de lo contrario, "es estándar y está relacionado con una licencia de conjunto de permisos específica" [ref]).
Tanto para el uso compartido global como para el de objetos, los Perfiles y Conjuntos de Permisos se ordenan para reflejar el interés probable. El primer nivel de ordenación se refiere al tipo de usuario asignado: 'guest' (no autenticado) primero, seguido de 'external' (varios tipos de usuario de portal) y luego 'internal' (cualquier otro). Es importante tener en cuenta que 'external' aquí está relacionado con la definición utilizada en el contexto del 'modelo de uso compartido externo' [ref]. La idea es resaltar el uso compartido potencialmente excesivo para usuarios no autenticados o de portal. Sin embargo, es algo experimental porque la documentación de Salesforce no es exhaustiva en su lista de valores válidos de 'UserType' para el objeto 'User' [ref]. Como resultado, es posible que se produzca una clasificación errónea; en tal caso, por favor notifique un problema. El segundo nivel de ordenación se basa en el número de usuarios activos: el mayor primero (el número total de usuarios asignados también se muestra como información).
El objetivo principal de Raccoon es resaltar casos de acceso generalizado a todos los registros, y cubre:
Los siguientes factores, que afectan sólo a un subconjunto de registros, no se evalúan:
Ciertos objetos, como 'User' y 'File', no se ajustan al modelo de uso compartido estándar y/o entran en juego otros permisos del sistema. Los casos conocidos se señalan en la salida si se especifican en la lista objects.
Las instancias con más de 2.000 Perfiles y Conjuntos de Permisos combinados no son compatibles debido a limitaciones de la plataforma en el uso de 'GROUP BY' en sentencias SOQL. Esta es una asignación generosa y sólo debería ser un obstáculo en los casos más extremos.
Esta herramienta sólo realiza operaciones de lectura. Por lo tanto, podría ser sorprendente ver 'Modify Metadata Through Metadata API Functions' como requisito para la cuenta utilizada para ejecutar la herramienta. Sin embargo, al momento de escribir esto, no parece posible configurar una cuenta con permisos de sólo lectura para la Metadata API. De la documentación:
Identify a user that has the API Enabled permission and the Modify Metadata Through Metadata API Functions permission or Modify All Data permission. These permissions are required to access Metadata API calls. If a user requires access to metadata but not to data, enable the Modify Metadata Through Metadata API Functions permission. Otherwise, enable the Modify All Data permission.
Por lo tanto, se sugiere usar 'Modify Metadata Through Metadata API Functions' en lugar de 'Modify All Data'.
Si el problema es con el inicio de sesión, primero verifique dos veces el nombre de host, el nombre de usuario, la contraseña y el token de seguridad (si es necesario). También considere si la contraseña necesita restablecerse (pruebe el inicio de sesión web habitual de Salesforce) porque esta condición devuelve un error que es indistinguible de un inicio de sesión no válido. Si utiliza un ID de sesión, asegúrese de que sea válido para el dominio correcto.
Ejecute la herramienta con debug establecido en 2, ya que la salida detallada puede ayudar a identificar la causa. Este nivel también genera un volcado de pila (stack trace) en un archivo cuyo nombre se indica en la salida. Si notifica un problema, incluya tanto la salida de consola como el volcado de pila (anonimice según sea necesario).
Conocido por hurgar entre los objetos.