isc-reporter 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- isc_reporter-0.1.0/LICENSE +21 -0
- isc_reporter-0.1.0/PKG-INFO +226 -0
- isc_reporter-0.1.0/README.md +190 -0
- isc_reporter-0.1.0/pyproject.toml +63 -0
- isc_reporter-0.1.0/setup.cfg +4 -0
- isc_reporter-0.1.0/src/isc_reporter/__init__.py +3 -0
- isc_reporter-0.1.0/src/isc_reporter/__main__.py +5 -0
- isc_reporter-0.1.0/src/isc_reporter/api.py +181 -0
- isc_reporter-0.1.0/src/isc_reporter/attribute_history.py +361 -0
- isc_reporter-0.1.0/src/isc_reporter/certification_reports.py +418 -0
- isc_reporter-0.1.0/src/isc_reporter/cli.py +351 -0
- isc_reporter-0.1.0/src/isc_reporter/client.py +135 -0
- isc_reporter-0.1.0/src/isc_reporter/csvio.py +149 -0
- isc_reporter-0.1.0/src/isc_reporter/dashboard.py +464 -0
- isc_reporter-0.1.0/src/isc_reporter/demo.py +349 -0
- isc_reporter-0.1.0/src/isc_reporter/errors.py +5 -0
- isc_reporter-0.1.0/src/isc_reporter/identity_profiles.py +533 -0
- isc_reporter-0.1.0/src/isc_reporter/logs.py +31 -0
- isc_reporter-0.1.0/src/isc_reporter/query.py +8 -0
- isc_reporter-0.1.0/src/isc_reporter/report_writers.py +316 -0
- isc_reporter-0.1.0/src/isc_reporter/reporting.py +462 -0
- isc_reporter-0.1.0/src/isc_reporter/search.py +102 -0
- isc_reporter-0.1.0/src/isc_reporter/source_migration.py +440 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/PKG-INFO +226 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/SOURCES.txt +34 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/dependency_links.txt +1 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/entry_points.txt +2 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/requires.txt +9 -0
- isc_reporter-0.1.0/src/isc_reporter.egg-info/top_level.txt +1 -0
- isc_reporter-0.1.0/tests/test_attribute_history.py +193 -0
- isc_reporter-0.1.0/tests/test_certification_reports.py +198 -0
- isc_reporter-0.1.0/tests/test_core.py +102 -0
- isc_reporter-0.1.0/tests/test_demo.py +19 -0
- isc_reporter-0.1.0/tests/test_identity_profiles.py +146 -0
- isc_reporter-0.1.0/tests/test_reporting.py +186 -0
- isc_reporter-0.1.0/tests/test_source_migration.py +215 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ousmane N'Diaye
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: isc-reporter
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Excel dashboards and PDF reports for SailPoint Identity Security Cloud: search, certification campaigns, identity attribute history, identity profile mappings and source migrations.
|
|
5
|
+
Author: Ousmane N'Diaye
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/NDIAYE-baoussou/isc-reporter
|
|
8
|
+
Project-URL: Issues, https://github.com/NDIAYE-baoussou/isc-reporter/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/NDIAYE-baoussou/isc-reporter/blob/main/CHANGELOG.md
|
|
10
|
+
Keywords: sailpoint,identity-security-cloud,identitynow,iam,iga,reporting,excel,pdf,certification,audit
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: System Administrators
|
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Security
|
|
22
|
+
Classifier: Topic :: System :: Systems Administration
|
|
23
|
+
Classifier: Topic :: Office/Business
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: sailpoint<3,>=2.1
|
|
28
|
+
Requires-Dist: XlsxWriter>=3.1
|
|
29
|
+
Requires-Dist: reportlab>=4
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
33
|
+
Requires-Dist: openpyxl>=3.1; extra == "dev"
|
|
34
|
+
Requires-Dist: build>=1; extra == "dev"
|
|
35
|
+
Dynamic: license-file
|
|
36
|
+
|
|
37
|
+
# isc-reporter
|
|
38
|
+
|
|
39
|
+
Excel dashboards and PDF reports for **SailPoint Identity Security Cloud (ISC)**, from the command line.
|
|
40
|
+
|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
`isc-reporter` turns what ISC knows into reports people can read: workbooks with KPI tiles,
|
|
44
|
+
native Excel charts and filterable tables, and matching PDF files to send around.
|
|
45
|
+
|
|
46
|
+
| Command | What you get |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `search` | Any search (identities, access profiles, roles, entitlements, events, account activities, workflows) with **one line per object**: an identity's roles, access profiles, entitlements and accounts are consolidated instead of repeated on many lines. |
|
|
49
|
+
| `campaigns` | Certification campaign dashboard: progress, approved / revoked / pending decisions by access type, reviewer workload, overdue certifications, and every reviewed item for audit evidence. |
|
|
50
|
+
| `changes` | Identity attribute changes **with old and new values** over a period (e.g. department and manager changes of the last 30 days), which ISC search cannot show. |
|
|
51
|
+
| `profiles` | How every identity attribute is built, profile by profile: source, account attribute, transforms, a plain-language explanation, and checks for likely mistakes. |
|
|
52
|
+
| `migration` | Impact analysis for replacing a source (typically a new HR system): impacted identity profiles, transforms and attribute mappings, before/after, and draft JSON for the new objects. |
|
|
53
|
+
|
|
54
|
+
**Read-only:** `isc-reporter` only reads from your tenant. It never creates, changes or deletes
|
|
55
|
+
anything; the migration analysis writes its drafts to local files for you to review.
|
|
56
|
+
|
|
57
|
+
> isc-reporter is a community project. It is not affiliated with, endorsed or supported by
|
|
58
|
+
> SailPoint Technologies. SailPoint and Identity Security Cloud are trademarks of SailPoint
|
|
59
|
+
> Technologies, Inc.
|
|
60
|
+
|
|
61
|
+
## Install
|
|
62
|
+
|
|
63
|
+
Python 3.10 or later.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install isc-reporter
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Or from a clone of this repository: `pip install .`
|
|
70
|
+
|
|
71
|
+
## Try it without a tenant
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
isc-reporter demo
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
writes every report, built from fictional data, to `outputs/demo/`.
|
|
78
|
+
|
|
79
|
+
## Connect to your tenant
|
|
80
|
+
|
|
81
|
+
Create a [personal access token](https://documentation.sailpoint.com/saas/help/common/api_keys.html)
|
|
82
|
+
for a user who can read what you want to report on, then either set environment variables:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
export SAIL_BASE_URL="https://<tenant>.api.identitynow.com" # Windows PowerShell: $env:SAIL_BASE_URL = "..."
|
|
86
|
+
export SAIL_CLIENT_ID="<client id>"
|
|
87
|
+
export SAIL_CLIENT_SECRET="<client secret>"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
or create a `config.json` in the folder you run from (or pass `--config path/to/file.json`):
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"BaseURL": "https://<tenant>.api.identitynow.com",
|
|
95
|
+
"ClientId": "<client id>",
|
|
96
|
+
"ClientSecret": "<client secret>"
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The token needs read access to what each command uses: search (`sp:search:read`) for `search`
|
|
101
|
+
and `changes`, identity history (`idn:identity-history:read`) for `changes`, certification
|
|
102
|
+
campaigns and certifications for `campaigns`, identity profiles, transforms and identity
|
|
103
|
+
attributes for `profiles`, and sources for `migration`.
|
|
104
|
+
|
|
105
|
+
## Reports
|
|
106
|
+
|
|
107
|
+
Every command writes to `outputs/` (change with `--output-dir`, or name the file with `-o`),
|
|
108
|
+
logs to `logs/`, and accepts `--format xlsx pdf` (plus `csv` where it makes sense).
|
|
109
|
+
|
|
110
|
+
### Search reports
|
|
111
|
+
|
|
112
|
+

|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
isc-reporter types # available report types
|
|
116
|
+
isc-reporter search identities
|
|
117
|
+
isc-reporter search identities -q "attributes.department:Finance" --expand access
|
|
118
|
+
isc-reporter search entitlements -q "privileged:true" --format xlsx csv
|
|
119
|
+
isc-reporter search events -q "status:FAILED AND created:[now-7d TO now]"
|
|
120
|
+
isc-reporter search identities --columns displayName,email,attributes.location --group-by attributes.location
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
| Type | One line per | Consolidated into the line | `--expand` (one line per item) |
|
|
124
|
+
| --- | --- | --- | --- |
|
|
125
|
+
| `identities` | identity | roles, access profiles, entitlements, accounts (list + count) | `access`, `accounts`, `apps` |
|
|
126
|
+
| `access-profiles` | access profile | entitlements | `entitlements` |
|
|
127
|
+
| `roles` | role | access profiles, entitlements | `access-profiles` |
|
|
128
|
+
| `entitlements` | entitlement | | |
|
|
129
|
+
| `events` | event | | |
|
|
130
|
+
| `account-activities` | activity | account requests | `account-requests` |
|
|
131
|
+
| `workflows` | workflow execution | | |
|
|
132
|
+
|
|
133
|
+
The workbook has a *Summary* (key figures and a chart per breakdown), the *Data* as an Excel
|
|
134
|
+
table, a *Detail* sheet with `--expand`, and the *Query* used. Any other search index works too,
|
|
135
|
+
with columns chosen automatically or with `--columns`. Reports can be saved as JSON and shared:
|
|
136
|
+
see [`examples/reports/`](examples/reports) and `--definition`.
|
|
137
|
+
|
|
138
|
+
### Certification campaigns
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
isc-reporter campaigns # every campaign
|
|
142
|
+
isc-reporter campaigns --status ACTIVE
|
|
143
|
+
isc-reporter campaigns --since 2026-01-01 --items # with every reviewed access item
|
|
144
|
+
isc-reporter campaigns --campaign "Q3 Manager Certification" --format pdf
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Sheets: *Dashboard*, *Campaigns* (progress bars, revocation rate, days left), *Certifications*
|
|
148
|
+
(one per reviewer), *Reviewers* (workload, most pending first), with `--items` *Identities*
|
|
149
|
+
(access grouped by decision) and *Decisions* (every item with its reviewer comment), and
|
|
150
|
+
*Filters*. Overdue items are shown in red. Role composition campaigns are listed with their
|
|
151
|
+
progress but have no reviewer detail (their reviews are not identity certifications).
|
|
152
|
+
|
|
153
|
+
### Identity attribute changes
|
|
154
|
+
|
|
155
|
+

|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
isc-reporter changes --attributes department,manager --days 30 --format xlsx pdf csv
|
|
159
|
+
isc-reporter changes --since 2026-10-01 -q "attributes.cloudLifecycleState:active"
|
|
160
|
+
isc-reporter changes --exclude someDailyAttribute
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
ISC search does not keep previous attribute values, so this report finds the identities modified
|
|
164
|
+
in the period and reads their history. *By identity* gives one line per identity with
|
|
165
|
+
`Old <attribute>` / `New <attribute>` columns; *Changes* lists every change. Manager ids are
|
|
166
|
+
shown as names. Attributes that change on most days (typically computed from today's date by a
|
|
167
|
+
transform) are flagged, as they fire an attribute change event every day. One history call is
|
|
168
|
+
made per modified identity: narrow large tenants with `--query` or `--max-identities`.
|
|
169
|
+
|
|
170
|
+
### Identity profile mappings
|
|
171
|
+
|
|
172
|
+

|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
isc-reporter profiles
|
|
176
|
+
isc-reporter profiles --profile Employees --profile Contractors
|
|
177
|
+
isc-reporter profiles --from exports/ # offline, from exported JSON
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
One sheet per profile with, for every identity attribute, the mapping kind, a plain-language
|
|
181
|
+
explanation (*"Value of 'hireDate' from HR System, converted by the transform 'Date to ISO8601'
|
|
182
|
+
(changes a date format)"*), sources, transforms and the definition. Also: a matrix comparing
|
|
183
|
+
profiles, attribute coverage, the transforms used, and checks: required or common attributes not
|
|
184
|
+
mapped, missing transforms, lifecycle state copied as is, identical mappings, other sources.
|
|
185
|
+
`--from` reads a profile, a list of profiles or a configuration export, with transforms found in
|
|
186
|
+
the same files.
|
|
187
|
+
|
|
188
|
+
### Source migration analysis
|
|
189
|
+
|
|
190
|
+

|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
isc-reporter migration --old-source "HR System" --new-source "New HR"
|
|
194
|
+
# complete outputs/source-migration_<ts>/attribute-mapping.csv, then:
|
|
195
|
+
isc-reporter migration --old-source "HR System" --new-source "New HR" --attribute-map attribute-mapping.csv
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Finds the identity profiles authoritative on or reading the old source, the transforms reading
|
|
199
|
+
it and those calling them, matches each old account attribute to the new source (mapping file,
|
|
200
|
+
or same name in the new account schema), shows every mapping before and after, and writes draft
|
|
201
|
+
JSON for the new identity profiles and transforms. Transforms are copied with a suffix so both
|
|
202
|
+
sources can run in parallel (`--in-place` to update them instead). Lifecycle states, account
|
|
203
|
+
correlation, provisioning policies and workflows are listed as next steps, not analysed.
|
|
204
|
+
|
|
205
|
+
## Privacy
|
|
206
|
+
|
|
207
|
+
Reports contain personal data (names, emails, access). The default `.gitignore` keeps
|
|
208
|
+
`outputs/`, `logs/`, spreadsheets, PDFs and `config.json` out of version control; handle the
|
|
209
|
+
reports under your organisation's data protection rules, and never attach real reports to
|
|
210
|
+
public issues.
|
|
211
|
+
|
|
212
|
+
## Development
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
216
|
+
pip install -e ".[dev]"
|
|
217
|
+
pytest
|
|
218
|
+
ruff check src tests
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Tests need no tenant: the SDK is replaced by recording fakes and the real SDK models are used to
|
|
222
|
+
check what would be read. See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# isc-reporter
|
|
2
|
+
|
|
3
|
+
Excel dashboards and PDF reports for **SailPoint Identity Security Cloud (ISC)**, from the command line.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
`isc-reporter` turns what ISC knows into reports people can read: workbooks with KPI tiles,
|
|
8
|
+
native Excel charts and filterable tables, and matching PDF files to send around.
|
|
9
|
+
|
|
10
|
+
| Command | What you get |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| `search` | Any search (identities, access profiles, roles, entitlements, events, account activities, workflows) with **one line per object**: an identity's roles, access profiles, entitlements and accounts are consolidated instead of repeated on many lines. |
|
|
13
|
+
| `campaigns` | Certification campaign dashboard: progress, approved / revoked / pending decisions by access type, reviewer workload, overdue certifications, and every reviewed item for audit evidence. |
|
|
14
|
+
| `changes` | Identity attribute changes **with old and new values** over a period (e.g. department and manager changes of the last 30 days), which ISC search cannot show. |
|
|
15
|
+
| `profiles` | How every identity attribute is built, profile by profile: source, account attribute, transforms, a plain-language explanation, and checks for likely mistakes. |
|
|
16
|
+
| `migration` | Impact analysis for replacing a source (typically a new HR system): impacted identity profiles, transforms and attribute mappings, before/after, and draft JSON for the new objects. |
|
|
17
|
+
|
|
18
|
+
**Read-only:** `isc-reporter` only reads from your tenant. It never creates, changes or deletes
|
|
19
|
+
anything; the migration analysis writes its drafts to local files for you to review.
|
|
20
|
+
|
|
21
|
+
> isc-reporter is a community project. It is not affiliated with, endorsed or supported by
|
|
22
|
+
> SailPoint Technologies. SailPoint and Identity Security Cloud are trademarks of SailPoint
|
|
23
|
+
> Technologies, Inc.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
Python 3.10 or later.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install isc-reporter
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Or from a clone of this repository: `pip install .`
|
|
34
|
+
|
|
35
|
+
## Try it without a tenant
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
isc-reporter demo
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
writes every report, built from fictional data, to `outputs/demo/`.
|
|
42
|
+
|
|
43
|
+
## Connect to your tenant
|
|
44
|
+
|
|
45
|
+
Create a [personal access token](https://documentation.sailpoint.com/saas/help/common/api_keys.html)
|
|
46
|
+
for a user who can read what you want to report on, then either set environment variables:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
export SAIL_BASE_URL="https://<tenant>.api.identitynow.com" # Windows PowerShell: $env:SAIL_BASE_URL = "..."
|
|
50
|
+
export SAIL_CLIENT_ID="<client id>"
|
|
51
|
+
export SAIL_CLIENT_SECRET="<client secret>"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
or create a `config.json` in the folder you run from (or pass `--config path/to/file.json`):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"BaseURL": "https://<tenant>.api.identitynow.com",
|
|
59
|
+
"ClientId": "<client id>",
|
|
60
|
+
"ClientSecret": "<client secret>"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The token needs read access to what each command uses: search (`sp:search:read`) for `search`
|
|
65
|
+
and `changes`, identity history (`idn:identity-history:read`) for `changes`, certification
|
|
66
|
+
campaigns and certifications for `campaigns`, identity profiles, transforms and identity
|
|
67
|
+
attributes for `profiles`, and sources for `migration`.
|
|
68
|
+
|
|
69
|
+
## Reports
|
|
70
|
+
|
|
71
|
+
Every command writes to `outputs/` (change with `--output-dir`, or name the file with `-o`),
|
|
72
|
+
logs to `logs/`, and accepts `--format xlsx pdf` (plus `csv` where it makes sense).
|
|
73
|
+
|
|
74
|
+
### Search reports
|
|
75
|
+
|
|
76
|
+

|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
isc-reporter types # available report types
|
|
80
|
+
isc-reporter search identities
|
|
81
|
+
isc-reporter search identities -q "attributes.department:Finance" --expand access
|
|
82
|
+
isc-reporter search entitlements -q "privileged:true" --format xlsx csv
|
|
83
|
+
isc-reporter search events -q "status:FAILED AND created:[now-7d TO now]"
|
|
84
|
+
isc-reporter search identities --columns displayName,email,attributes.location --group-by attributes.location
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
| Type | One line per | Consolidated into the line | `--expand` (one line per item) |
|
|
88
|
+
| --- | --- | --- | --- |
|
|
89
|
+
| `identities` | identity | roles, access profiles, entitlements, accounts (list + count) | `access`, `accounts`, `apps` |
|
|
90
|
+
| `access-profiles` | access profile | entitlements | `entitlements` |
|
|
91
|
+
| `roles` | role | access profiles, entitlements | `access-profiles` |
|
|
92
|
+
| `entitlements` | entitlement | | |
|
|
93
|
+
| `events` | event | | |
|
|
94
|
+
| `account-activities` | activity | account requests | `account-requests` |
|
|
95
|
+
| `workflows` | workflow execution | | |
|
|
96
|
+
|
|
97
|
+
The workbook has a *Summary* (key figures and a chart per breakdown), the *Data* as an Excel
|
|
98
|
+
table, a *Detail* sheet with `--expand`, and the *Query* used. Any other search index works too,
|
|
99
|
+
with columns chosen automatically or with `--columns`. Reports can be saved as JSON and shared:
|
|
100
|
+
see [`examples/reports/`](examples/reports) and `--definition`.
|
|
101
|
+
|
|
102
|
+
### Certification campaigns
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
isc-reporter campaigns # every campaign
|
|
106
|
+
isc-reporter campaigns --status ACTIVE
|
|
107
|
+
isc-reporter campaigns --since 2026-01-01 --items # with every reviewed access item
|
|
108
|
+
isc-reporter campaigns --campaign "Q3 Manager Certification" --format pdf
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Sheets: *Dashboard*, *Campaigns* (progress bars, revocation rate, days left), *Certifications*
|
|
112
|
+
(one per reviewer), *Reviewers* (workload, most pending first), with `--items` *Identities*
|
|
113
|
+
(access grouped by decision) and *Decisions* (every item with its reviewer comment), and
|
|
114
|
+
*Filters*. Overdue items are shown in red. Role composition campaigns are listed with their
|
|
115
|
+
progress but have no reviewer detail (their reviews are not identity certifications).
|
|
116
|
+
|
|
117
|
+
### Identity attribute changes
|
|
118
|
+
|
|
119
|
+

|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
isc-reporter changes --attributes department,manager --days 30 --format xlsx pdf csv
|
|
123
|
+
isc-reporter changes --since 2026-10-01 -q "attributes.cloudLifecycleState:active"
|
|
124
|
+
isc-reporter changes --exclude someDailyAttribute
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
ISC search does not keep previous attribute values, so this report finds the identities modified
|
|
128
|
+
in the period and reads their history. *By identity* gives one line per identity with
|
|
129
|
+
`Old <attribute>` / `New <attribute>` columns; *Changes* lists every change. Manager ids are
|
|
130
|
+
shown as names. Attributes that change on most days (typically computed from today's date by a
|
|
131
|
+
transform) are flagged, as they fire an attribute change event every day. One history call is
|
|
132
|
+
made per modified identity: narrow large tenants with `--query` or `--max-identities`.
|
|
133
|
+
|
|
134
|
+
### Identity profile mappings
|
|
135
|
+
|
|
136
|
+

|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
isc-reporter profiles
|
|
140
|
+
isc-reporter profiles --profile Employees --profile Contractors
|
|
141
|
+
isc-reporter profiles --from exports/ # offline, from exported JSON
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
One sheet per profile with, for every identity attribute, the mapping kind, a plain-language
|
|
145
|
+
explanation (*"Value of 'hireDate' from HR System, converted by the transform 'Date to ISO8601'
|
|
146
|
+
(changes a date format)"*), sources, transforms and the definition. Also: a matrix comparing
|
|
147
|
+
profiles, attribute coverage, the transforms used, and checks: required or common attributes not
|
|
148
|
+
mapped, missing transforms, lifecycle state copied as is, identical mappings, other sources.
|
|
149
|
+
`--from` reads a profile, a list of profiles or a configuration export, with transforms found in
|
|
150
|
+
the same files.
|
|
151
|
+
|
|
152
|
+
### Source migration analysis
|
|
153
|
+
|
|
154
|
+

|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
isc-reporter migration --old-source "HR System" --new-source "New HR"
|
|
158
|
+
# complete outputs/source-migration_<ts>/attribute-mapping.csv, then:
|
|
159
|
+
isc-reporter migration --old-source "HR System" --new-source "New HR" --attribute-map attribute-mapping.csv
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Finds the identity profiles authoritative on or reading the old source, the transforms reading
|
|
163
|
+
it and those calling them, matches each old account attribute to the new source (mapping file,
|
|
164
|
+
or same name in the new account schema), shows every mapping before and after, and writes draft
|
|
165
|
+
JSON for the new identity profiles and transforms. Transforms are copied with a suffix so both
|
|
166
|
+
sources can run in parallel (`--in-place` to update them instead). Lifecycle states, account
|
|
167
|
+
correlation, provisioning policies and workflows are listed as next steps, not analysed.
|
|
168
|
+
|
|
169
|
+
## Privacy
|
|
170
|
+
|
|
171
|
+
Reports contain personal data (names, emails, access). The default `.gitignore` keeps
|
|
172
|
+
`outputs/`, `logs/`, spreadsheets, PDFs and `config.json` out of version control; handle the
|
|
173
|
+
reports under your organisation's data protection rules, and never attach real reports to
|
|
174
|
+
public issues.
|
|
175
|
+
|
|
176
|
+
## Development
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
180
|
+
pip install -e ".[dev]"
|
|
181
|
+
pytest
|
|
182
|
+
ruff check src tests
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Tests need no tenant: the SDK is replaced by recording fakes and the real SDK models are used to
|
|
186
|
+
check what would be read. See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "isc-reporter"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "Excel dashboards and PDF reports for SailPoint Identity Security Cloud: search, certification campaigns, identity attribute history, identity profile mappings and source migrations."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
authors = [{ name = "Ousmane N'Diaye" }]
|
|
14
|
+
keywords = ["sailpoint", "identity-security-cloud", "identitynow", "iam", "iga", "reporting",
|
|
15
|
+
"excel", "pdf", "certification", "audit"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: System Administrators",
|
|
20
|
+
"Intended Audience :: Information Technology",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Programming Language :: Python :: 3.13",
|
|
27
|
+
"Topic :: Security",
|
|
28
|
+
"Topic :: System :: Systems Administration",
|
|
29
|
+
"Topic :: Office/Business",
|
|
30
|
+
]
|
|
31
|
+
dependencies = [
|
|
32
|
+
"sailpoint>=2.1,<3",
|
|
33
|
+
"XlsxWriter>=3.1",
|
|
34
|
+
"reportlab>=4",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.optional-dependencies]
|
|
38
|
+
dev = ["pytest>=8", "ruff>=0.5", "openpyxl>=3.1", "build>=1"]
|
|
39
|
+
|
|
40
|
+
[project.scripts]
|
|
41
|
+
isc-reporter = "isc_reporter.cli:main"
|
|
42
|
+
|
|
43
|
+
[project.urls]
|
|
44
|
+
Homepage = "https://github.com/NDIAYE-baoussou/isc-reporter"
|
|
45
|
+
Issues = "https://github.com/NDIAYE-baoussou/isc-reporter/issues"
|
|
46
|
+
Changelog = "https://github.com/NDIAYE-baoussou/isc-reporter/blob/main/CHANGELOG.md"
|
|
47
|
+
|
|
48
|
+
[tool.setuptools.dynamic]
|
|
49
|
+
version = { attr = "isc_reporter.__version__" }
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.packages.find]
|
|
52
|
+
where = ["src"]
|
|
53
|
+
|
|
54
|
+
[tool.pytest.ini_options]
|
|
55
|
+
testpaths = ["tests"]
|
|
56
|
+
|
|
57
|
+
[tool.ruff]
|
|
58
|
+
line-length = 110
|
|
59
|
+
target-version = "py310"
|
|
60
|
+
src = ["src", "tests"]
|
|
61
|
+
|
|
62
|
+
[tool.ruff.lint]
|
|
63
|
+
select = ["E", "F", "W", "I", "B", "UP"]
|