
Salesforce 객체 접근 감사 도구
NCC Group Plc가 오픈소스로 공개했습니다 - https://www.nccgroup.com/
Jerome Smith 개발 @exploresecurity (Viktor Gazdag @wucpi에게 감사드립니다)
https://www.github.com/nccgroup/raccoon
AGPL 라이선스로 배포됩니다 - 자세한 내용은 LICENSE를 참조하세요.
이 도구는 유효 공유 및 객체 설정을 기반으로, 지정된 객체 집합의 모든 레코드에 대해 읽기/편집/삭제 권한의 일부 조합을 가진 프로필 및 권한 세트(활성 사용자가 있는)를 식별합니다. 이 출력을 통해 민감한 데이터를 보유한 객체에 과도한 접근을 허용할 수 있는 잘못된 구성을 조사할 수 있습니다. 배경 정보는 관련 블로그 게시물 https://research.nccgroup.com/2021/06/28/are-you-oversharing-in-salesforce 를 참조하세요.
결과는 Salesforce 구성을 직접 참조하거나 영향을 받는 프로필 및 권한 세트를 테스트하여 수동으로 검증하는 것이 좋습니다. 불일치 사항이 발견되면 가능한 한 자세히 이슈를 등록해 주시기 바랍니다.
요구 사항:
requests 모듈 (requirements.txt에 포함됨)인증을 위해 username + password + (선택) token 또는 sessionId 중 하나를 제공하세요 (자세한 내용은 인증 섹션 참조).
JSON 구성 파일을 만들고(또는 config.json을 템플릿으로 사용) 필요에 따라 작성합니다:
{
"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는 관심 있는 Salesforce 객체의 목록입니다(즉, 가장 중요하게 생각하는 데이터). 공식 API 이름을 사용하는 것이 가장 확실한 방법이지만, 일치하는 항목이 없으면 Raccoon은 예를 들어 표시 레이블을 기준으로 몇 가지 간단한 일치를 시도합니다. Raccoon이 여전히 일치 항목을 찾지 못하면 프로그램은 계속 진행하되 출력에 이를 표시합니다.
checkLimits를 사용하면 조사 중인 인스턴스에 대해 24시간 이동 기간 내 남은 API 호출 허용량을 확인할 수 있습니다. Raccoon은 객체당 비교적 적은 호출을 수행하지만(실행당 고정된 횟수에 추가로), 진행 전에 한도를 확인할 수 있는 편의 기능입니다. 기본값은 true입니다. 체크포인트에서 남은 가능한 총 요청 수는 정확하지 않습니다. 호출 수는 'Controlled by Parent' 공유 모델을 가진 객체 수에 따라 달라지기 때문입니다. 표시된 숫자는 모든 객체가 그런 경우를 가정하므로 최대치입니다.
실행:
git clone https://github.com/nccgroup/raccoon
pip3 install -r requirements.txt
python3 raccoon.py <config_file>
사용자 이름과 비밀번호를 사용하는 경우 정의된 네트워크 액세스 범위 밖의 IP 주소에서 접근한다면 보안 토큰도 필요할 수 있습니다. 자세한 내용은 이 문서를 참조하세요.
세션 ID를 사용하는 대안은 여러 경우에 유용합니다:
세션 ID를 얻으려면:
sid 쿠키가 있습니다: Domain 속성에 my.salesforce.com 또는 cloudforce.com이 포함된 쿠키를 가져와야 합니다.샘플(축약 및 익명화) 출력:
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은 출력의 장황함을 줄이기 위해 활성 사용자가 있는 프로필과 권한 세트만 검사합니다. 이에 대한 정보가 표시된 후 다음이 수행됩니다:
권한 부여가 단일 권한 세트가 아닌 권한 세트 그룹을 통해 이루어진 경우, 이름 왼쪽의 들여쓰기 표시로 일반적인 하이픈 대신 별표가 표시됩니다(위 샘플 출력의 Accounts PS Group 참조). 또한 프로필 또는 권한 세트가 커스텀인지 여부도 표시됩니다(권한 세트의 경우 커스텀은 "관리자가 생성함"을 의미하고, 그렇지 않은 경우 "표준이며 특정 권한 세트 라이선스와 관련됨"을 의미합니다 [ref]).
전역 공유와 객체 공유 모두에서 프로필과 권한 세트는 관심도가 높을 것으로 예상되는 순서로 정렬됩니다. 첫 번째 정렬 기준은 할당된 사용자 유형입니다 - 'guest'(인증되지 않은 사용자)가 먼저, 그다음 'external'(다양한 유형의 포털 사용자), 마지막으로 'internal'(그 외 모든 사용자) 순입니다. 여기서 'external'은 '외부 공유 모델'의 맥락에서 사용되는 정의와 관련이 있다는 점을 유의하세요 [ref]. 이는 인증되지 않은 사용자 또는 포털 사용자에게 과도한 공유가 발생할 가능성을 강조하기 위한 것입니다. 그러나 Salesforce 문서가 'User' 객체의 유효한 'UserType' 값 목록을 완전히 제공하지 않기 때문에 다소 실험적입니다 [ref]. 그 결과 오분류가 발생할 수 있습니다 - 그러한 경우 이슈를 등록해 주세요. 두 번째 정렬 기준은 활성 사용자 수이며, 많은 순서대로 표시됩니다(할당된 총 사용자 수도 정보 제공용으로 표시됩니다).
Raccoon의 주요 목표는 모든 레코드에 대한 광범위한 접근 사례를 강조하는 것이며, 다음을 다룹니다:
레코드의 일부에만 영향을 미치는 다음 요소는 평가 되지 않습니다:
'User' 및 'File'과 같은 일부 객체는 표준 공유 모델에 맞지 않거나 다른 시스템 권한이 적용됩니다. 알려진 인스턴스는 objects 목록에 지정된 경우 출력에 표시됩니다.
프로필과 권한 세트를 합쳐 2,000개가 넘는 인스턴스는 SOQL 문에서 'GROUP BY' 사용에 대한 플랫폼 제한으로 인해 지원되지 않습니다. 이는 넉넉한 허용치이며 극단적인 경우에만 문제가 될 것입니다.
이 도구는 읽기 작업만 수행합니다. 따라서 도구를 실행하는 데 사용되는 계정의 요구 사항으로 'Modify Metadata Through Metadata API Functions'가 있는 것을 보고 놀랄 수도 있습니다. 하지만 이 글을 작성하는 시점에는 Metadata API에 대한 읽기 전용 권한으로 계정을 구성하는 것이 불가능해 보입니다. 문서에서:
API Enabled 권한과 Modify Metadata Through Metadata API Functions 권한 또는 Modify All Data 권한이 있는 사용자를 식별하세요. 이러한 권한은 Metadata API 호출에 접근하는 데 필요합니다. 사용자가 데이터가 아닌 메타데이터에 대한 접근이 필요한 경우 Modify Metadata Through Metadata API Functions 권한을 활성화하세요. 그렇지 않으면 Modify All Data 권한을 활성화하세요.
따라서 'Modify All Data'보다 'Modify Metadata Through Metadata API Functions'를 사용하는 것이 좋습니다.
로그인 문제라면 먼저 호스트 이름, 사용자 이름, 비밀번호 및 보안 토큰(필요한 경우)을 다시 확인하세요. 또한 비밀번호 재설정이 필요한지도 고려하세요(일반적인 Salesforce 웹 로그인을 시도해 보세요). 이 상태는 잘못된 로그인과 구분할 수 없는 오류를 반환하기 때문입니다. 세션 ID를 사용하는 경우 올바른 도메인에 유효한지 확인하세요.
debug를 2로 설정하여 도구를 실행하세요. 자세한 출력이 원인을 파악하는 데 도움이 될 수 있습니다. 이 수준은 또한 출력에 이름이 표시된 파일에 스택 추적을 출력합니다. 이슈를 신고할 때는 콘솔 출력과 스택 추적을 모두 포함해 주세요(필요 시 익명화).
객체를 뒤적거리는 것으로 유명합니다.