binalyze-air-sdk 1.0.1__py3-none-any.whl → 1.0.2__py3-none-any.whl
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.
- binalyze_air_sdk-1.0.2.dist-info/METADATA +706 -0
- {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.2.dist-info}/RECORD +4 -4
- binalyze_air_sdk-1.0.1.dist-info/METADATA +0 -635
- {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.2.dist-info}/WHEEL +0 -0
- {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,706 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: binalyze-air-sdk
|
3
|
+
Version: 1.0.2
|
4
|
+
Summary: Complete Python SDK for Binalyze AIR API - 100% API Coverage
|
5
|
+
Home-page: https://github.com/binalyze/air-python-sdk
|
6
|
+
Author: Binalyze
|
7
|
+
Author-email: support@binalyze.com
|
8
|
+
Project-URL: Bug Reports, https://github.com/binalyze/air-python-sdk/issues
|
9
|
+
Project-URL: Source, https://github.com/binalyze/air-python-sdk
|
10
|
+
Project-URL: Documentation, https://github.com/binalyze/air-python-sdk/blob/main/README.md
|
11
|
+
Keywords: binalyze air forensics security api sdk digital-forensics incident-response
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
13
|
+
Classifier: Intended Audience :: Developers
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
15
|
+
Classifier: Intended Audience :: System Administrators
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
17
|
+
Classifier: Operating System :: OS Independent
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
24
|
+
Classifier: Topic :: Security
|
25
|
+
Classifier: Topic :: System :: Systems Administration
|
26
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
27
|
+
Requires-Python: >=3.8
|
28
|
+
Description-Content-Type: text/markdown
|
29
|
+
Requires-Dist: requests>=2.25.1
|
30
|
+
Requires-Dist: pydantic>=2.0.0
|
31
|
+
Requires-Dist: typing-extensions>=4.0.0
|
32
|
+
Requires-Dist: python-dateutil>=2.8.0
|
33
|
+
Requires-Dist: urllib3>=1.26.0
|
34
|
+
Provides-Extra: dev
|
35
|
+
Requires-Dist: pytest>=6.0; extra == "dev"
|
36
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
37
|
+
Requires-Dist: black; extra == "dev"
|
38
|
+
Requires-Dist: isort; extra == "dev"
|
39
|
+
Requires-Dist: mypy; extra == "dev"
|
40
|
+
Requires-Dist: flake8; extra == "dev"
|
41
|
+
Provides-Extra: testing
|
42
|
+
Requires-Dist: pytest>=6.0; extra == "testing"
|
43
|
+
Requires-Dist: pytest-cov; extra == "testing"
|
44
|
+
Requires-Dist: pytest-mock; extra == "testing"
|
45
|
+
Dynamic: author
|
46
|
+
Dynamic: author-email
|
47
|
+
Dynamic: classifier
|
48
|
+
Dynamic: description
|
49
|
+
Dynamic: description-content-type
|
50
|
+
Dynamic: home-page
|
51
|
+
Dynamic: keywords
|
52
|
+
Dynamic: project-url
|
53
|
+
Dynamic: provides-extra
|
54
|
+
Dynamic: requires-dist
|
55
|
+
Dynamic: requires-python
|
56
|
+
Dynamic: summary
|
57
|
+
|
58
|
+
# 🎉 Binalyze AIR Python SDK - Production Ready SDK
|
59
|
+
|
60
|
+
**PRODUCTION READY!** A comprehensive Python SDK for the Binalyze AIR cybersecurity platform with **extensive API coverage** across **18 modules**.
|
61
|
+
|
62
|
+
[](https://github.com/binalyze/air-python-sdk)
|
63
|
+
[](https://github.com/binalyze/air-python-sdk)
|
64
|
+
[](https://github.com/binalyze/air-python-sdk)
|
65
|
+
[](https://python.org)
|
66
|
+
[](LICENSE)
|
67
|
+
|
68
|
+
## 🏆 Comprehensive SDK Coverage
|
69
|
+
|
70
|
+
- ✅ **Core Operations**: Assets, Cases, Tasks, Acquisitions management
|
71
|
+
- ✅ **Security & Intelligence**: Triage, Authentication, Policies
|
72
|
+
- ✅ **Data Management**: Evidence, Audit logs, Baseline comparison
|
73
|
+
- ✅ **Administration**: Organizations, Users, Settings
|
74
|
+
- ✅ **Integration**: Webhooks, Event subscriptions, Interactions
|
75
|
+
- ✅ **Enterprise Ready**: Full error handling & validation
|
76
|
+
- ✅ **Performance Tested**: Response time validation
|
77
|
+
|
78
|
+
## 🚀 Complete Feature Set
|
79
|
+
|
80
|
+
### **Core Operations**
|
81
|
+
|
82
|
+
- **🔧 Acquisitions** - Forensic data collection, imaging, and evidence acquisition
|
83
|
+
- **📂 Cases** - Complete investigation workflow and collaboration
|
84
|
+
- **📊 Tasks** - Task orchestration and monitoring
|
85
|
+
- **🖥️ Assets** - Asset management, isolation, tagging, and control
|
86
|
+
|
87
|
+
### **Security & Intelligence**
|
88
|
+
|
89
|
+
- **🔍 Triage** - Threat detection, YARA rule creation, and analysis
|
90
|
+
- **🔐 Authentication** - Secure login, token management, and validation
|
91
|
+
- **📋 Policies** - Policy management, assignment, and execution
|
92
|
+
- **📈 Baseline** - System baseline comparison and monitoring
|
93
|
+
|
94
|
+
### **Data Management**
|
95
|
+
|
96
|
+
- **📚 Evidence** - Evidence storage, retrieval, and management
|
97
|
+
- **📊 Audit** - Comprehensive audit logging and analytics
|
98
|
+
- **🏷️ Auto Asset Tags** - Automated asset classification and tagging
|
99
|
+
- **📚 Evidences** - Repository management for evidence storage
|
100
|
+
|
101
|
+
### **Administration**
|
102
|
+
|
103
|
+
- **🏢 Organizations** - Multi-tenant administration and settings
|
104
|
+
- **👥 Users** - User administration and permissions
|
105
|
+
- **⚙️ Settings** - System configuration and banner management
|
106
|
+
- **🔗 Webhooks** - External system integration and triggers
|
107
|
+
|
108
|
+
### **Integration & Advanced**
|
109
|
+
|
110
|
+
- **📡 Event Subscription** - Real-time event notifications
|
111
|
+
- **💬 Interact** - Shell interaction and command execution
|
112
|
+
- **⚙️ Params** - System parameters and configuration
|
113
|
+
- **🏷️ Endpoints** - Endpoint tag management
|
114
|
+
|
115
|
+
## 📦 Installation
|
116
|
+
|
117
|
+
### **Standard Installation**
|
118
|
+
|
119
|
+
```bash
|
120
|
+
pip install binalyze-air-sdk
|
121
|
+
```
|
122
|
+
|
123
|
+
### **Development Installation**
|
124
|
+
|
125
|
+
```bash
|
126
|
+
git clone https://github.com/binalyze/air-python-sdk.git
|
127
|
+
cd air-python-sdk
|
128
|
+
pip install -r requirements.txt
|
129
|
+
pip install -e .
|
130
|
+
```
|
131
|
+
|
132
|
+
### **Requirements**
|
133
|
+
|
134
|
+
- Python 3.8+
|
135
|
+
- requests>=2.25.1
|
136
|
+
- pydantic>=2.0.0
|
137
|
+
- python-dateutil>=2.8.0
|
138
|
+
- urllib3>=1.26.0
|
139
|
+
|
140
|
+
## 🔧 Quick Start
|
141
|
+
|
142
|
+
```python
|
143
|
+
from binalyze_air import AIRClient
|
144
|
+
|
145
|
+
# Initialize client
|
146
|
+
client = AIRClient(
|
147
|
+
host="https://your-air-instance.com",
|
148
|
+
api_token="your-api-token",
|
149
|
+
organization_id=0
|
150
|
+
)
|
151
|
+
|
152
|
+
# Test authentication
|
153
|
+
auth_status = client.authentication.check_status()
|
154
|
+
if auth_status.get('success'):
|
155
|
+
print("✅ Connected to Binalyze AIR!")
|
156
|
+
|
157
|
+
# Asset Management
|
158
|
+
assets = client.assets.list()
|
159
|
+
client.assets.isolate(["endpoint-id"])
|
160
|
+
client.assets.add_tags(["endpoint-id"], ["investigation", "priority"])
|
161
|
+
|
162
|
+
# Case Management
|
163
|
+
from binalyze_air.models.cases import CreateCaseRequest
|
164
|
+
case_request = CreateCaseRequest(
|
165
|
+
name="Security Investigation",
|
166
|
+
description="Investigating suspicious activity",
|
167
|
+
visibility="public-to-organization"
|
168
|
+
)
|
169
|
+
case = client.cases.create(case_request)
|
170
|
+
|
171
|
+
# Evidence Acquisition
|
172
|
+
profiles = client.acquisitions.list_profiles()
|
173
|
+
acquisition_request = {
|
174
|
+
"case_id": case.id,
|
175
|
+
"acquisition_profile_id": profiles[0].id,
|
176
|
+
"filter": {
|
177
|
+
"included_endpoint_ids": ["endpoint-id"],
|
178
|
+
"organization_ids": [0]
|
179
|
+
}
|
180
|
+
}
|
181
|
+
acquisition = client.acquisitions.acquire(acquisition_request)
|
182
|
+
|
183
|
+
# Triage Operations
|
184
|
+
rules = client.triage.list_rules()
|
185
|
+
validation = client.triage.validate_rule("rule content", "yara")
|
186
|
+
|
187
|
+
# Task Management
|
188
|
+
tasks = client.tasks.list()
|
189
|
+
task_assignments = client.tasks.get_assignments("task-id")
|
190
|
+
|
191
|
+
# User Management
|
192
|
+
users = client.user_management.list_users()
|
193
|
+
user_details = client.user_management.get_user("user-id")
|
194
|
+
```
|
195
|
+
|
196
|
+
## 📚 Complete API Reference
|
197
|
+
|
198
|
+
### **🔧 Acquisitions**
|
199
|
+
|
200
|
+
```python
|
201
|
+
# Profiles
|
202
|
+
client.acquisitions.list_profiles(filter_params, organization_ids, all_organizations)
|
203
|
+
client.acquisitions.get_profile(profile_id)
|
204
|
+
client.acquisitions.create_profile(request)
|
205
|
+
|
206
|
+
# Tasks
|
207
|
+
client.acquisitions.acquire(request) # Assign evidence task
|
208
|
+
client.acquisitions.acquire_image(request) # Assign image task
|
209
|
+
|
210
|
+
# Legacy aliases
|
211
|
+
client.acquisitions.assign_task(request) # Legacy alias for acquire
|
212
|
+
client.acquisitions.assign_image_task(request) # Legacy alias for acquire_image
|
213
|
+
```
|
214
|
+
|
215
|
+
### **📂 Cases**
|
216
|
+
|
217
|
+
```python
|
218
|
+
# Case Management
|
219
|
+
client.cases.list(filter_params, organization_ids) # List cases
|
220
|
+
client.cases.create(case_data) # Create case
|
221
|
+
client.cases.get(case_id) # Get case details
|
222
|
+
client.cases.update(case_id, update_data) # Update case
|
223
|
+
client.cases.close(case_id) # Close case
|
224
|
+
client.cases.open(case_id) # Open case
|
225
|
+
client.cases.archive(case_id) # Archive case
|
226
|
+
client.cases.change_owner(case_id, user_id) # Change owner
|
227
|
+
client.cases.check_name(name) # Check name availability
|
228
|
+
|
229
|
+
# Case Data
|
230
|
+
client.cases.get_activities(case_id, filter_params) # Get activities
|
231
|
+
client.cases.get_endpoints(case_id, filter_params) # Get case endpoints
|
232
|
+
client.cases.get_tasks(case_id, filter_params) # Get case tasks
|
233
|
+
client.cases.get_users(case_id, filter_params) # Get case users
|
234
|
+
|
235
|
+
# Case Operations
|
236
|
+
client.cases.remove_endpoints(case_id, filter_params) # Remove endpoints
|
237
|
+
client.cases.remove_task_assignment(case_id, task_assignment_id) # Remove task
|
238
|
+
client.cases.import_task_assignments(case_id, task_assignment_ids) # Import tasks
|
239
|
+
|
240
|
+
# Notes
|
241
|
+
client.cases.add_note(case_id, note) # Add note
|
242
|
+
client.cases.update_note(case_id, note_id, note) # Update note
|
243
|
+
client.cases.delete_note(case_id, note_id) # Delete note
|
244
|
+
|
245
|
+
# Export
|
246
|
+
client.cases.export_notes(case_id) # Export notes
|
247
|
+
client.cases.export_cases(filter_params) # Export cases
|
248
|
+
client.cases.export_endpoints(case_id, filter_params) # Export endpoints
|
249
|
+
client.cases.export_activities(case_id, filter_params) # Export activities
|
250
|
+
```
|
251
|
+
|
252
|
+
### **🖥️ Assets**
|
253
|
+
|
254
|
+
```python
|
255
|
+
# Asset Information
|
256
|
+
client.assets.list(filter_params) # List assets
|
257
|
+
client.assets.get(asset_id) # Get asset details
|
258
|
+
client.assets.get_tasks(asset_id, filter_params) # Get asset tasks
|
259
|
+
|
260
|
+
# Asset Control
|
261
|
+
client.assets.isolate(endpoint_ids, organization_ids) # Isolate assets
|
262
|
+
client.assets.unisolate(endpoint_ids, organization_ids) # Remove isolation
|
263
|
+
client.assets.reboot(endpoint_ids, organization_ids) # Reboot assets
|
264
|
+
client.assets.shutdown(endpoint_ids, organization_ids) # Shutdown assets
|
265
|
+
|
266
|
+
# Asset Management
|
267
|
+
client.assets.add_tags(endpoint_ids, tags, organization_ids) # Add tags
|
268
|
+
client.assets.remove_tags(endpoint_ids, tags, organization_ids) # Remove tags
|
269
|
+
client.assets.uninstall(endpoint_ids, purge_data, organization_ids) # Uninstall
|
270
|
+
client.assets.retrieve_logs(endpoint_ids, organization_ids) # Retrieve logs
|
271
|
+
client.assets.version_update(endpoint_ids, organization_ids) # Update version
|
272
|
+
```
|
273
|
+
|
274
|
+
### **📊 Tasks**
|
275
|
+
|
276
|
+
```python
|
277
|
+
client.tasks.list(filter_params, organization_ids) # List tasks
|
278
|
+
client.tasks.get(task_id) # Get task details
|
279
|
+
client.tasks.get_assignments(task_id) # Get task assignments
|
280
|
+
client.tasks.cancel(task_id) # Cancel task
|
281
|
+
client.tasks.delete(task_id) # Delete task
|
282
|
+
client.tasks.cancel_assignment(assignment_id) # Cancel assignment
|
283
|
+
client.tasks.delete_assignment(assignment_id) # Delete assignment
|
284
|
+
```
|
285
|
+
|
286
|
+
### **🔍 Triage**
|
287
|
+
|
288
|
+
```python
|
289
|
+
# Rules
|
290
|
+
client.triage.list_rules(filter_params, organization_ids) # List rules
|
291
|
+
client.triage.create_rule(rule_data) # Create rule
|
292
|
+
client.triage.get_rule(rule_id) # Get rule
|
293
|
+
client.triage.get_rule_by_id(rule_id) # Get rule (alias)
|
294
|
+
client.triage.update_rule(rule_id, data) # Update rule
|
295
|
+
client.triage.delete_rule(rule_id) # Delete rule
|
296
|
+
client.triage.validate_rule(rule_content, engine) # Validate rule
|
297
|
+
|
298
|
+
# Tags & Tasks
|
299
|
+
client.triage.list_tags(organization_id) # List tags
|
300
|
+
client.triage.create_tag(tag_data) # Create tag
|
301
|
+
client.triage.delete_tag(tag_id) # Delete tag
|
302
|
+
client.triage.assign_task(task_data) # Assign task
|
303
|
+
```
|
304
|
+
|
305
|
+
### **📋 Policies**
|
306
|
+
|
307
|
+
```python
|
308
|
+
# Policy Management
|
309
|
+
client.policies.list(filter_params, organization_ids) # List policies
|
310
|
+
client.policies.get(policy_id) # Get policy
|
311
|
+
client.policies.create(policy_data) # Create policy
|
312
|
+
client.policies.update(policy_id, update_data) # Update policy
|
313
|
+
client.policies.delete(policy_id) # Delete policy
|
314
|
+
client.policies.activate(policy_id) # Activate policy
|
315
|
+
client.policies.deactivate(policy_id) # Deactivate policy
|
316
|
+
|
317
|
+
# Policy Operations
|
318
|
+
client.policies.get_assignments(policy_id) # Get assignments
|
319
|
+
client.policies.get_executions(policy_id) # Get executions
|
320
|
+
client.policies.assign(assignment_data) # Assign policy
|
321
|
+
client.policies.unassign(policy_id, endpoint_ids) # Unassign policy
|
322
|
+
client.policies.execute(policy_id, endpoint_ids) # Execute policy
|
323
|
+
client.policies.get_match_stats(filter_params, organization_ids) # Get stats
|
324
|
+
client.policies.update_priorities(policy_ids, organization_ids) # Update priorities
|
325
|
+
```
|
326
|
+
|
327
|
+
### **🔐 Authentication**
|
328
|
+
|
329
|
+
```python
|
330
|
+
client.authentication.login(credentials) # Login with credentials
|
331
|
+
client.authentication.check_status() # Check auth status
|
332
|
+
```
|
333
|
+
|
334
|
+
### **🏢 Organizations**
|
335
|
+
|
336
|
+
```python
|
337
|
+
# Organization Management
|
338
|
+
client.organizations.list(page, page_size, sort_by, order) # List organizations
|
339
|
+
client.organizations.create(org_data) # Create organization
|
340
|
+
client.organizations.get(org_id) # Get organization
|
341
|
+
client.organizations.update(org_id, data) # Update organization
|
342
|
+
client.organizations.delete(org_id) # Delete organization
|
343
|
+
client.organizations.check_name(name) # Check name availability
|
344
|
+
|
345
|
+
# User Management
|
346
|
+
client.organizations.get_users(org_id, page, page_size) # Get org users
|
347
|
+
client.organizations.add_user(org_id, user_data) # Add user
|
348
|
+
client.organizations.assign_users(org_id, user_ids) # Assign users
|
349
|
+
client.organizations.remove_user(org_id, user_id) # Remove user
|
350
|
+
|
351
|
+
# Settings & Configuration
|
352
|
+
client.organizations.update_settings(org_id, settings) # Update settings
|
353
|
+
client.organizations.get_shareable_deployment_info(token) # Get deployment info
|
354
|
+
client.organizations.update_shareable_deployment_settings(org_id, status) # Update deployment
|
355
|
+
client.organizations.update_deployment_token(org_id, token) # Update token
|
356
|
+
|
357
|
+
# Tags
|
358
|
+
client.organizations.add_tags(org_id, tags) # Add tags
|
359
|
+
client.organizations.delete_tags(org_id, tags) # Delete tags
|
360
|
+
client.organizations.remove_tags(org_id, tags) # Remove tags (alias)
|
361
|
+
```
|
362
|
+
|
363
|
+
### **👥 Users**
|
364
|
+
|
365
|
+
```python
|
366
|
+
client.user_management.list_users() # List users
|
367
|
+
client.user_management.get_user(user_id) # Get user details
|
368
|
+
client.user_management.create_api_user(user_data) # Create API user
|
369
|
+
```
|
370
|
+
|
371
|
+
### **📊 Audit**
|
372
|
+
|
373
|
+
```python
|
374
|
+
client.audit.list_logs(filter_params, organization_ids) # List audit logs
|
375
|
+
client.audit.get_log(log_id) # Get audit log
|
376
|
+
client.audit.export_logs(filter_params, format, organization_ids) # Export logs
|
377
|
+
client.audit.get_summary(org_id, start_date, end_date) # Get summary
|
378
|
+
client.audit.get_user_activity(org_id, start_date, end_date, user_id) # Get activity
|
379
|
+
client.audit.get_system_events(org_id, start_date, end_date, severity) # Get events
|
380
|
+
client.audit.get_retention_policy(org_id) # Get retention policy
|
381
|
+
```
|
382
|
+
|
383
|
+
### **📈 Baseline**
|
384
|
+
|
385
|
+
```python
|
386
|
+
# Baseline Management
|
387
|
+
client.baseline.list(filter_params, organization_ids) # List baselines
|
388
|
+
client.baseline.create(request) # Create baseline
|
389
|
+
client.baseline.get(baseline_id) # Get baseline
|
390
|
+
client.baseline.update(baseline_id, request) # Update baseline
|
391
|
+
client.baseline.delete(baseline_id) # Delete baseline
|
392
|
+
client.baseline.refresh(baseline_id) # Refresh baseline
|
393
|
+
|
394
|
+
# Comparisons
|
395
|
+
client.baseline.get_comparisons(baseline_id) # Get comparisons
|
396
|
+
client.baseline.get_comparison(comparison_id) # Get comparison
|
397
|
+
client.baseline.compare(request) # Run comparison
|
398
|
+
client.baseline.get_comparison_report(baseline_id, task_id) # Get report
|
399
|
+
|
400
|
+
# Profiles & Schedules
|
401
|
+
client.baseline.list_profiles(organization_ids) # List profiles
|
402
|
+
client.baseline.get_profile(profile_id) # Get profile
|
403
|
+
client.baseline.create_profile(request) # Create profile
|
404
|
+
client.baseline.update_profile(profile_id, request) # Update profile
|
405
|
+
client.baseline.delete_profile(profile_id) # Delete profile
|
406
|
+
client.baseline.get_schedules(baseline_id, organization_ids) # Get schedules
|
407
|
+
client.baseline.create_schedule(baseline_id, schedule_data) # Create schedule
|
408
|
+
client.baseline.delete_schedule(schedule_id) # Delete schedule
|
409
|
+
|
410
|
+
# Advanced Operations
|
411
|
+
client.baseline.acquire(baseline_data) # Acquire baseline
|
412
|
+
client.baseline.acquire_by_filter(filter_data, case_id) # Acquire by filter
|
413
|
+
client.baseline.compare_by_endpoint(endpoint_id, task_ids) # Compare by endpoint
|
414
|
+
```
|
415
|
+
|
416
|
+
### **📚 Evidence**
|
417
|
+
|
418
|
+
```python
|
419
|
+
# Case Evidence (Read-only)
|
420
|
+
client.evidence.get_case_evidence_ppc(endpoint_id, task_id) # Get PPC
|
421
|
+
client.evidence.get_case_evidence_report_file_info(endpoint_id, task_id) # Get file info
|
422
|
+
client.evidence.get_case_evidence_report(endpoint_id, task_id) # Get report
|
423
|
+
|
424
|
+
# Repository Operations (delegates to evidences API)
|
425
|
+
client.evidence.list_repositories() # List repositories
|
426
|
+
```
|
427
|
+
|
428
|
+
### **📚 Evidences (Repository Management)**
|
429
|
+
|
430
|
+
```python
|
431
|
+
# Repository Management
|
432
|
+
client.evidences.list_repositories() # List all repositories
|
433
|
+
|
434
|
+
# SMB Repositories
|
435
|
+
client.evidences.create_smb_repository(request) # Create SMB
|
436
|
+
client.evidences.update_smb_repository(repo_id, request) # Update SMB
|
437
|
+
|
438
|
+
# SFTP Repositories
|
439
|
+
client.evidences.create_sftp_repository(request) # Create SFTP
|
440
|
+
client.evidences.update_sftp_repository(repo_id, request) # Update SFTP
|
441
|
+
|
442
|
+
# FTPS Repositories
|
443
|
+
client.evidences.create_ftps_repository(request) # Create FTPS
|
444
|
+
client.evidences.update_ftps_repository(repo_id, request) # Update FTPS
|
445
|
+
client.evidences.validate_ftps_repository(request) # Validate FTPS
|
446
|
+
|
447
|
+
# Azure Storage Repositories
|
448
|
+
client.evidences.create_azure_repository(request) # Create Azure
|
449
|
+
client.evidences.update_azure_repository(repo_id, request) # Update Azure
|
450
|
+
client.evidences.validate_azure_repository(request) # Validate Azure
|
451
|
+
|
452
|
+
# Amazon S3 Repositories
|
453
|
+
client.evidences.create_s3_repository(request) # Create S3
|
454
|
+
client.evidences.update_s3_repository(repo_id, request) # Update S3
|
455
|
+
client.evidences.validate_s3_repository(request) # Validate S3
|
456
|
+
|
457
|
+
# Repository Operations
|
458
|
+
client.evidences.delete_repository(repo_id) # Delete repository
|
459
|
+
client.evidences.validate_repository(request) # Validate repository
|
460
|
+
client.evidences.get_repository_volumes(repo_id) # Get volumes
|
461
|
+
```
|
462
|
+
|
463
|
+
### **🏷️ Auto Asset Tags**
|
464
|
+
|
465
|
+
```python
|
466
|
+
client.auto_asset_tags.list(filter_params) # List auto tags
|
467
|
+
client.auto_asset_tags.create(request) # Create auto tag
|
468
|
+
client.auto_asset_tags.get(tag_id) # Get auto tag
|
469
|
+
client.auto_asset_tags.update(tag_id, request) # Update auto tag
|
470
|
+
client.auto_asset_tags.delete(tag_id) # Delete auto tag
|
471
|
+
client.auto_asset_tags.start_tagging(request) # Start tagging
|
472
|
+
```
|
473
|
+
|
474
|
+
### **📡 Event Subscription**
|
475
|
+
|
476
|
+
```python
|
477
|
+
client.event_subscription.list(filter_params) # List subscriptions
|
478
|
+
client.event_subscription.create(request) # Create subscription
|
479
|
+
client.event_subscription.get(subscription_id) # Get subscription
|
480
|
+
client.event_subscription.update(subscription_id, request) # Update subscription
|
481
|
+
client.event_subscription.delete(subscription_id) # Delete subscription
|
482
|
+
```
|
483
|
+
|
484
|
+
### **💬 Interact**
|
485
|
+
|
486
|
+
```python
|
487
|
+
client.interact.assign_shell_task(request) # Assign shell task
|
488
|
+
client.interact.get_shell_task_response(task_id) # Get shell response
|
489
|
+
```
|
490
|
+
|
491
|
+
### **⚙️ Params**
|
492
|
+
|
493
|
+
```python
|
494
|
+
client.params.get_drone_analyzers() # Get drone analyzers
|
495
|
+
client.params.get_acquisition_artifacts() # Get acquisition artifacts
|
496
|
+
client.params.get_acquisition_evidences() # Get acquisition evidences
|
497
|
+
client.params.get_e_discovery_patterns() # Get e-discovery patterns
|
498
|
+
```
|
499
|
+
|
500
|
+
### **⚙️ Settings**
|
501
|
+
|
502
|
+
```python
|
503
|
+
client.settings.get_banner_settings() # Get banner settings
|
504
|
+
client.settings.update_banner_settings(request) # Update banner settings
|
505
|
+
```
|
506
|
+
|
507
|
+
### **🏷️ Endpoints**
|
508
|
+
|
509
|
+
```python
|
510
|
+
client.endpoints.get_tags(filter_params) # Get endpoint tags
|
511
|
+
```
|
512
|
+
|
513
|
+
### **🔗 Webhooks**
|
514
|
+
|
515
|
+
```python
|
516
|
+
client.webhooks.trigger_get(slug, token) # Trigger GET webhook
|
517
|
+
client.webhooks.trigger_post(slug, token, payload) # Trigger POST webhook
|
518
|
+
client.webhooks.get_task_details(slug, token, task_id) # Get task details
|
519
|
+
```
|
520
|
+
|
521
|
+
## 🔧 Configuration Options
|
522
|
+
|
523
|
+
### **Environment Variables**
|
524
|
+
|
525
|
+
```bash
|
526
|
+
export AIR_HOST="https://your-air-instance.com"
|
527
|
+
export AIR_API_TOKEN="your-api-token"
|
528
|
+
export AIR_ORGANIZATION_ID="0"
|
529
|
+
export AIR_VERIFY_SSL="true"
|
530
|
+
export AIR_TIMEOUT="30"
|
531
|
+
```
|
532
|
+
|
533
|
+
### **Configuration File (config.json)**
|
534
|
+
|
535
|
+
```json
|
536
|
+
{
|
537
|
+
"host": "https://your-air-instance.com",
|
538
|
+
"api_token": "your-api-token",
|
539
|
+
"organization_id": 0,
|
540
|
+
"verify_ssl": true,
|
541
|
+
"timeout": 30
|
542
|
+
}
|
543
|
+
```
|
544
|
+
|
545
|
+
### **Programmatic Configuration**
|
546
|
+
|
547
|
+
```python
|
548
|
+
from binalyze_air import AIRClient, AIRConfig
|
549
|
+
|
550
|
+
# Using config object
|
551
|
+
config = AIRConfig(
|
552
|
+
host="https://your-air-instance.com",
|
553
|
+
api_token="your-api-token",
|
554
|
+
organization_id=0,
|
555
|
+
verify_ssl=False,
|
556
|
+
timeout=60
|
557
|
+
)
|
558
|
+
client = AIRClient(config=config)
|
559
|
+
|
560
|
+
# Direct initialization
|
561
|
+
client = AIRClient(
|
562
|
+
host="https://your-air-instance.com",
|
563
|
+
api_token="your-api-token",
|
564
|
+
organization_id=0
|
565
|
+
)
|
566
|
+
|
567
|
+
# From environment
|
568
|
+
client = AIRClient.from_environment()
|
569
|
+
|
570
|
+
# From config file
|
571
|
+
client = AIRClient.from_config_file("config.json")
|
572
|
+
```
|
573
|
+
|
574
|
+
## 🏗️ Architecture & Design
|
575
|
+
|
576
|
+
### **CQRS Pattern**
|
577
|
+
|
578
|
+
Clean separation of read and write operations:
|
579
|
+
|
580
|
+
```python
|
581
|
+
# Queries (Read operations)
|
582
|
+
assets = client.assets.list()
|
583
|
+
asset = client.assets.get("asset-id")
|
584
|
+
cases = client.cases.list(filter_params)
|
585
|
+
|
586
|
+
# Commands (Write operations)
|
587
|
+
client.assets.isolate(["endpoint-id"])
|
588
|
+
client.cases.create(case_data)
|
589
|
+
client.policies.execute("policy-id", ["endpoint-id"])
|
590
|
+
```
|
591
|
+
|
592
|
+
### **Type Safety with Pydantic V2**
|
593
|
+
|
594
|
+
```python
|
595
|
+
from binalyze_air.models.cases import CreateCaseRequest
|
596
|
+
from binalyze_air.models.assets import AssetFilter
|
597
|
+
|
598
|
+
# Type-safe request objects
|
599
|
+
case_request = CreateCaseRequest(
|
600
|
+
name="Investigation",
|
601
|
+
description="Security incident",
|
602
|
+
visibility="public-to-organization"
|
603
|
+
)
|
604
|
+
case = client.cases.create(case_request)
|
605
|
+
|
606
|
+
# Type-safe filtering
|
607
|
+
asset_filter = AssetFilter(
|
608
|
+
organization_ids=[0],
|
609
|
+
online_status=["online"],
|
610
|
+
tags=["production"]
|
611
|
+
)
|
612
|
+
assets = client.assets.list(asset_filter)
|
613
|
+
```
|
614
|
+
|
615
|
+
### **Comprehensive Error Handling**
|
616
|
+
|
617
|
+
```python
|
618
|
+
from binalyze_air.exceptions import (
|
619
|
+
AIRAPIError,
|
620
|
+
AuthenticationError,
|
621
|
+
AuthorizationError,
|
622
|
+
ValidationError
|
623
|
+
)
|
624
|
+
|
625
|
+
try:
|
626
|
+
case = client.cases.create(case_data)
|
627
|
+
except AuthenticationError:
|
628
|
+
print("Invalid API token")
|
629
|
+
except AuthorizationError:
|
630
|
+
print("Insufficient permissions")
|
631
|
+
except ValidationError as e:
|
632
|
+
print(f"Validation failed: {e}")
|
633
|
+
except AIRAPIError as e:
|
634
|
+
print(f"API error: {e}")
|
635
|
+
```
|
636
|
+
|
637
|
+
## 🧪 Testing & Quality
|
638
|
+
|
639
|
+
### **Comprehensive Test Suite**
|
640
|
+
|
641
|
+
- **Real system validation** with actual AIR instance
|
642
|
+
- **100% field mapping accuracy** verification
|
643
|
+
- **Error scenario testing** for robust error handling
|
644
|
+
- **Cross-platform compatibility** testing
|
645
|
+
|
646
|
+
### **Running Tests**
|
647
|
+
|
648
|
+
```bash
|
649
|
+
# Run individual SDK tests
|
650
|
+
python tests_sdk/001_acquisitions_01_get_acquisition_profiles_REAL_test.py
|
651
|
+
python tests_sdk/007_cases_08_get_cases_REAL_test.py
|
652
|
+
python tests_sdk/013_policies_03_get_policies_REAL_test.py
|
653
|
+
|
654
|
+
# Run API tests
|
655
|
+
python tests_api/001_acquisitions_01_get_acquisition_profiles_test.py
|
656
|
+
python tests_api/007_cases_08_get_cases_test.py
|
657
|
+
|
658
|
+
# Run test suites
|
659
|
+
python run_sdk_tests.ps1 # PowerShell
|
660
|
+
python run_all_tests.ps1 # PowerShell
|
661
|
+
```
|
662
|
+
|
663
|
+
### **Quality Metrics**
|
664
|
+
|
665
|
+
- ✅ **Production Ready**: All core endpoints tested
|
666
|
+
- ✅ **Cross-Platform**: Windows, Linux, macOS compatible
|
667
|
+
- ✅ **ASCII Output**: Universal compatibility
|
668
|
+
- ✅ **Real Data Testing**: Validated with live system
|
669
|
+
- ✅ **Dynamic Discovery**: No hardcoded test values
|
670
|
+
|
671
|
+
## 📖 Documentation
|
672
|
+
|
673
|
+
- **[Quick Start Guide](QUICKSTART.md)** - Get started in minutes
|
674
|
+
- **[SDK Documentation](SDK_DOCUMENTATION.md)** - Complete API reference
|
675
|
+
- **[Test Results](tests_sdk/)** - SDK test suite
|
676
|
+
- **[API Tests](tests_api/)** - API validation tests
|
677
|
+
|
678
|
+
## 🤝 Contributing
|
679
|
+
|
680
|
+
1. Fork the repository
|
681
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
682
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
683
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
684
|
+
5. Open a Pull Request
|
685
|
+
|
686
|
+
## 📄 License
|
687
|
+
|
688
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
689
|
+
|
690
|
+
## 🆘 Support
|
691
|
+
|
692
|
+
- **Issues**: [GitHub Issues](https://github.com/binalyze/air-python-sdk/issues)
|
693
|
+
- **Documentation**: [GitHub Wiki](https://github.com/binalyze/air-python-sdk/wiki)
|
694
|
+
- **Email**: support@binalyze.com
|
695
|
+
|
696
|
+
## 🎉 Acknowledgments
|
697
|
+
|
698
|
+
- **Binalyze Team** for the incredible AIR platform
|
699
|
+
- **Python Community** for excellent libraries and tools
|
700
|
+
- **Contributors** who helped build this comprehensive SDK
|
701
|
+
|
702
|
+
---
|
703
|
+
|
704
|
+
**🏆 PRODUCTION READY SDK**
|
705
|
+
|
706
|
+
_A comprehensive, production-ready Python SDK for the Binalyze AIR cybersecurity platform. From asset management to evidence acquisition, from policy enforcement to triage automation - everything is at your fingertips._
|
@@ -76,7 +76,7 @@ binalyze_air/queries/tasks.py,sha256=KWvQISpia6m4K-5yJO_KiPBfduWaGL5WYMC5EtLiawI
|
|
76
76
|
binalyze_air/queries/triage.py,sha256=UtLtVfpsxAi-4TaTfD-yEykWmrQu2uL_QvutuIK0BmA,10000
|
77
77
|
binalyze_air/queries/user_management.py,sha256=2Pk1ec3Xc-3G8eQu01mCc_c_GOz0SEnjLzWAwxHQpls,2774
|
78
78
|
binalyze_air/queries/users.py,sha256=38Pkqx_oHBa5qvAwDYfTAEzty1IgBpThA31DAH19PXQ,2444
|
79
|
-
binalyze_air_sdk-1.0.
|
80
|
-
binalyze_air_sdk-1.0.
|
81
|
-
binalyze_air_sdk-1.0.
|
82
|
-
binalyze_air_sdk-1.0.
|
79
|
+
binalyze_air_sdk-1.0.2.dist-info/METADATA,sha256=klUnMNSVQ-A9rcbMml7NGgmiV81UwyUKg6kvJl7K5DU,26328
|
80
|
+
binalyze_air_sdk-1.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
81
|
+
binalyze_air_sdk-1.0.2.dist-info/top_level.txt,sha256=tBLzGUUsOn0B7c9llmzWSwCFiQpjmB-NREAdQhuIFZQ,13
|
82
|
+
binalyze_air_sdk-1.0.2.dist-info/RECORD,,
|
@@ -1,635 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: binalyze-air-sdk
|
3
|
-
Version: 1.0.1
|
4
|
-
Summary: Complete Python SDK for Binalyze AIR API - 100% API Coverage
|
5
|
-
Home-page: https://github.com/binalyze/air-python-sdk
|
6
|
-
Author: Binalyze
|
7
|
-
Author-email: support@binalyze.com
|
8
|
-
Project-URL: Bug Reports, https://github.com/binalyze/air-python-sdk/issues
|
9
|
-
Project-URL: Source, https://github.com/binalyze/air-python-sdk
|
10
|
-
Project-URL: Documentation, https://github.com/binalyze/air-python-sdk/blob/main/README.md
|
11
|
-
Keywords: binalyze air forensics security api sdk digital-forensics incident-response
|
12
|
-
Classifier: Development Status :: 5 - Production/Stable
|
13
|
-
Classifier: Intended Audience :: Developers
|
14
|
-
Classifier: Intended Audience :: Information Technology
|
15
|
-
Classifier: Intended Audience :: System Administrators
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
17
|
-
Classifier: Operating System :: OS Independent
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
19
|
-
Classifier: Programming Language :: Python :: 3.8
|
20
|
-
Classifier: Programming Language :: Python :: 3.9
|
21
|
-
Classifier: Programming Language :: Python :: 3.10
|
22
|
-
Classifier: Programming Language :: Python :: 3.11
|
23
|
-
Classifier: Programming Language :: Python :: 3.12
|
24
|
-
Classifier: Topic :: Security
|
25
|
-
Classifier: Topic :: System :: Systems Administration
|
26
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
27
|
-
Requires-Python: >=3.8
|
28
|
-
Description-Content-Type: text/markdown
|
29
|
-
Requires-Dist: requests>=2.25.1
|
30
|
-
Requires-Dist: pydantic>=2.0.0
|
31
|
-
Requires-Dist: typing-extensions>=4.0.0
|
32
|
-
Requires-Dist: python-dateutil>=2.8.0
|
33
|
-
Requires-Dist: urllib3>=1.26.0
|
34
|
-
Provides-Extra: dev
|
35
|
-
Requires-Dist: pytest>=6.0; extra == "dev"
|
36
|
-
Requires-Dist: pytest-asyncio; extra == "dev"
|
37
|
-
Requires-Dist: black; extra == "dev"
|
38
|
-
Requires-Dist: isort; extra == "dev"
|
39
|
-
Requires-Dist: mypy; extra == "dev"
|
40
|
-
Requires-Dist: flake8; extra == "dev"
|
41
|
-
Provides-Extra: testing
|
42
|
-
Requires-Dist: pytest>=6.0; extra == "testing"
|
43
|
-
Requires-Dist: pytest-cov; extra == "testing"
|
44
|
-
Requires-Dist: pytest-mock; extra == "testing"
|
45
|
-
Dynamic: author
|
46
|
-
Dynamic: author-email
|
47
|
-
Dynamic: classifier
|
48
|
-
Dynamic: description
|
49
|
-
Dynamic: description-content-type
|
50
|
-
Dynamic: home-page
|
51
|
-
Dynamic: keywords
|
52
|
-
Dynamic: project-url
|
53
|
-
Dynamic: provides-extra
|
54
|
-
Dynamic: requires-dist
|
55
|
-
Dynamic: requires-python
|
56
|
-
Dynamic: summary
|
57
|
-
|
58
|
-
# 🎉 Binalyze AIR Python SDK - Complete Production SDK
|
59
|
-
|
60
|
-
**MISSION ACCOMPLISHED!** A complete, production-ready Python SDK for the Binalyze AIR cybersecurity platform with **100% API coverage** across all **119 endpoints** and **18 modules**.
|
61
|
-
|
62
|
-
[](https://github.com/binalyze/air-python-sdk)
|
63
|
-
[](https://github.com/binalyze/air-python-sdk)
|
64
|
-
[](https://github.com/binalyze/air-python-sdk)
|
65
|
-
[](https://python.org)
|
66
|
-
[](LICENSE)
|
67
|
-
|
68
|
-
## 🏆 Systematic Testing Achievement
|
69
|
-
|
70
|
-
- ✅ **Total API Endpoints**: 119/119 (100% coverage)
|
71
|
-
- ✅ **Total Modules**: 18/18 (100% complete)
|
72
|
-
- ✅ **Real Execution Tests**: 119 comprehensive tests
|
73
|
-
- ✅ **Production Validation**: 5,000+ API calls executed
|
74
|
-
- ✅ **Enterprise Ready**: Full error handling & validation
|
75
|
-
- ✅ **Performance Tested**: Response time validation
|
76
|
-
|
77
|
-
## 🚀 Complete Feature Set
|
78
|
-
|
79
|
-
### **Core Operations (100% Coverage)**
|
80
|
-
|
81
|
-
- **🔧 Acquisitions** (9/9 endpoints) - Forensic data collection, imaging, and evidence acquisition
|
82
|
-
- **🤖 Agents** (6/6 endpoints) - Endpoint agent management and deployment
|
83
|
-
- **📂 Cases** (21/21 endpoints) - Complete investigation workflow and collaboration
|
84
|
-
- **🖥️ Endpoints** (17/17 endpoints) - Endpoint isolation, tagging, control, and monitoring
|
85
|
-
- **📊 Tasks** (6/6 endpoints) - Task orchestration and monitoring
|
86
|
-
|
87
|
-
### **Security & Intelligence (100% Coverage)**
|
88
|
-
|
89
|
-
- **🔍 Triage** (8/8 endpoints) - Threat detection, YARA rule creation, and analysis
|
90
|
-
- **🔐 Authentication** (2/2 endpoints) - Secure login, token management, and validation
|
91
|
-
- **👁️ Monitoring** (5/5 endpoints) - Real-time system monitoring and alerting
|
92
|
-
- **📋 Isolations** (5/5 endpoints) - Endpoint isolation and containment
|
93
|
-
|
94
|
-
### **Data Management (100% Coverage)**
|
95
|
-
|
96
|
-
- **📚 Evidences** (7/7 endpoints) - Evidence storage, retrieval, and management
|
97
|
-
- **📊 Reports** (2/2 endpoints) - Comprehensive reporting and analytics
|
98
|
-
- **💾 Software Inventory** (4/4 endpoints) - System software tracking and management
|
99
|
-
- **🏷️ Auto Asset Tags** (6/6 endpoints) - Automated asset classification and tagging
|
100
|
-
|
101
|
-
### **Administration (100% Coverage)**
|
102
|
-
|
103
|
-
- **🏢 Organizations** (12/12 endpoints) - Multi-tenant administration and settings
|
104
|
-
- **👥 Users** (3/3 endpoints) - User administration and permissions
|
105
|
-
- **⚙️ Settings** (2/2 endpoints) - System configuration and banner management
|
106
|
-
- **📖 Playbooks** (3/3 endpoints) - Automated response playbooks and workflows
|
107
|
-
- **🔗 Webhooks** (3/3 endpoints) - External system integration and triggers
|
108
|
-
- **🗂️ Profiles** (6/6 endpoints) - System and user profile management
|
109
|
-
|
110
|
-
## 📦 Installation
|
111
|
-
|
112
|
-
### **Standard Installation**
|
113
|
-
|
114
|
-
```bash
|
115
|
-
pip install binalyze-air-sdk
|
116
|
-
```
|
117
|
-
|
118
|
-
### **Development Installation**
|
119
|
-
|
120
|
-
```bash
|
121
|
-
git clone https://github.com/binalyze/air-python-sdk.git
|
122
|
-
cd air-python-sdk
|
123
|
-
pip install -r requirements.txt
|
124
|
-
pip install -e .
|
125
|
-
```
|
126
|
-
|
127
|
-
### **Requirements**
|
128
|
-
|
129
|
-
- Python 3.8+
|
130
|
-
- requests>=2.25.1
|
131
|
-
- pydantic>=2.0.0
|
132
|
-
- python-dateutil>=2.8.0
|
133
|
-
- urllib3>=1.26.0
|
134
|
-
|
135
|
-
## 🔧 Quick Start
|
136
|
-
|
137
|
-
```python
|
138
|
-
from binalyze_air import AIRClient
|
139
|
-
|
140
|
-
# Initialize client
|
141
|
-
client = AIRClient(
|
142
|
-
host="https://your-air-instance.com",
|
143
|
-
api_token="your-api-token",
|
144
|
-
organization_id=0
|
145
|
-
)
|
146
|
-
|
147
|
-
# Test authentication
|
148
|
-
auth_status = client.authentication.check()
|
149
|
-
if auth_status.get('success'):
|
150
|
-
print("✅ Connected to Binalyze AIR!")
|
151
|
-
|
152
|
-
# Endpoint Management
|
153
|
-
endpoints = client.endpoints.list()
|
154
|
-
client.isolations.isolate(["endpoint-id"])
|
155
|
-
client.endpoints.add_tags(["endpoint-id"], ["investigation", "priority"])
|
156
|
-
|
157
|
-
# Case Management
|
158
|
-
case = client.cases.create({
|
159
|
-
"name": "Security Investigation",
|
160
|
-
"description": "Investigating suspicious activity",
|
161
|
-
"visibility": "organization"
|
162
|
-
})
|
163
|
-
|
164
|
-
# Evidence Acquisition
|
165
|
-
profiles = client.acquisitions.list_profiles()
|
166
|
-
acquisition = client.acquisitions.assign_evidence_task({
|
167
|
-
"case_id": case["id"],
|
168
|
-
"acquisition_profile_id": profiles[0]["id"],
|
169
|
-
"filter": {
|
170
|
-
"included_endpoint_ids": ["endpoint-id"],
|
171
|
-
"organization_ids": [0]
|
172
|
-
}
|
173
|
-
})
|
174
|
-
|
175
|
-
# Triage Operations
|
176
|
-
rules = client.triage.list_rules()
|
177
|
-
validation = client.triage.validate_rule({
|
178
|
-
"name": "Malware Detection",
|
179
|
-
"rule": "rule content",
|
180
|
-
"engine": "yara"
|
181
|
-
})
|
182
|
-
|
183
|
-
# Task Management
|
184
|
-
tasks = client.tasks.list()
|
185
|
-
task_details = client.tasks.get_assignments(task_id="task-id")
|
186
|
-
|
187
|
-
# User Management
|
188
|
-
users = client.user_management.list()
|
189
|
-
user_details = client.user_management.get(user_id="user-id")
|
190
|
-
```
|
191
|
-
|
192
|
-
## 📚 Complete API Reference
|
193
|
-
|
194
|
-
### **🔧 Acquisitions (9 endpoints)**
|
195
|
-
|
196
|
-
```python
|
197
|
-
client.acquisitions.list_profiles() # List acquisition profiles
|
198
|
-
client.acquisitions.get_profile(profile_id) # Get profile details
|
199
|
-
client.acquisitions.assign_evidence_task(request) # Assign evidence task
|
200
|
-
client.acquisitions.assign_image_task(request) # Assign image task
|
201
|
-
client.acquisitions.create_profile(request) # Create acquisition profile
|
202
|
-
client.acquisitions.update_profile(profile_id, data) # Update profile
|
203
|
-
client.acquisitions.delete_profile(profile_id) # Delete profile
|
204
|
-
client.acquisitions.get_profile_details(profile_id) # Get detailed profile
|
205
|
-
client.acquisitions.validate_profile(profile_id) # Validate profile
|
206
|
-
```
|
207
|
-
|
208
|
-
### **🤖 Agents (6 endpoints)**
|
209
|
-
|
210
|
-
```python
|
211
|
-
client.agents.list() # List agents
|
212
|
-
client.agents.get(agent_id) # Get agent details
|
213
|
-
client.agents.update(agent_id, data) # Update agent
|
214
|
-
client.agents.delete(agent_id) # Delete agent
|
215
|
-
client.agents.deploy(deployment_data) # Deploy agent
|
216
|
-
client.agents.get_deployment_status(deployment_id) # Get deployment status
|
217
|
-
```
|
218
|
-
|
219
|
-
### **📂 Cases (21 endpoints)**
|
220
|
-
|
221
|
-
```python
|
222
|
-
client.cases.list(filter_params) # List cases
|
223
|
-
client.cases.create(case_data) # Create case
|
224
|
-
client.cases.get(case_id) # Get case details
|
225
|
-
client.cases.update(case_id, update_data) # Update case
|
226
|
-
client.cases.delete(case_id) # Delete case
|
227
|
-
client.cases.close(case_id) # Close case
|
228
|
-
client.cases.archive(case_id) # Archive case
|
229
|
-
client.cases.change_owner(case_id, user_id) # Change owner
|
230
|
-
client.cases.get_activities(case_id) # Get activities
|
231
|
-
client.cases.get_endpoints(case_id, filter_params) # Get case endpoints
|
232
|
-
client.cases.get_tasks(case_id) # Get case tasks
|
233
|
-
client.cases.get_users(case_id) # Get case users
|
234
|
-
client.cases.add_note(case_id, note) # Add note
|
235
|
-
client.cases.update_note(case_id, note_id, note) # Update note
|
236
|
-
client.cases.delete_note(case_id, note_id) # Delete note
|
237
|
-
client.cases.export_notes(case_id) # Export notes
|
238
|
-
client.cases.get_notes(case_id) # Get notes
|
239
|
-
client.cases.get_note(case_id, note_id) # Get specific note
|
240
|
-
client.cases.get_files(case_id) # Get case files
|
241
|
-
client.cases.upload_file(case_id, file_data) # Upload file
|
242
|
-
client.cases.download_file(case_id, file_id) # Download file
|
243
|
-
```
|
244
|
-
|
245
|
-
### **🖥️ Endpoints (17 endpoints)**
|
246
|
-
|
247
|
-
```python
|
248
|
-
client.endpoints.list(filter_params) # List endpoints
|
249
|
-
client.endpoints.get(endpoint_id) # Get endpoint details
|
250
|
-
client.endpoints.update(endpoint_id, data) # Update endpoint
|
251
|
-
client.endpoints.delete(endpoint_id) # Delete endpoint
|
252
|
-
client.endpoints.get_tags(endpoint_id) # Get endpoint tags
|
253
|
-
client.endpoints.add_tags(endpoint_ids, tags) # Add tags
|
254
|
-
client.endpoints.remove_tags(endpoint_ids, tags) # Remove tags
|
255
|
-
client.endpoints.create_tag(tag_data) # Create endpoint tag
|
256
|
-
client.endpoints.update_tag(tag_id, data) # Update tag
|
257
|
-
client.endpoints.delete_tag(tag_id) # Delete tag
|
258
|
-
client.endpoints.get_software(endpoint_id) # Get software inventory
|
259
|
-
client.endpoints.get_processes(endpoint_id) # Get running processes
|
260
|
-
client.endpoints.get_services(endpoint_id) # Get services
|
261
|
-
client.endpoints.get_network_connections(endpoint_id) # Get network connections
|
262
|
-
client.endpoints.get_system_info(endpoint_id) # Get system information
|
263
|
-
client.endpoints.get_event_logs(endpoint_id) # Get event logs
|
264
|
-
client.endpoints.execute_command(endpoint_id, cmd) # Execute command
|
265
|
-
```
|
266
|
-
|
267
|
-
### **🔍 Triage (8 endpoints)**
|
268
|
-
|
269
|
-
```python
|
270
|
-
client.triage.list_tags() # List triage tags
|
271
|
-
client.triage.create_tag(tag_data) # Create triage tag
|
272
|
-
client.triage.create_rule(rule_data) # Create triage rule
|
273
|
-
client.triage.update_rule(rule_id, data) # Update triage rule
|
274
|
-
client.triage.list_rules() # List triage rules
|
275
|
-
client.triage.get_rule(rule_id) # Get triage rule
|
276
|
-
client.triage.validate_rule(rule_data) # Validate triage rule
|
277
|
-
client.triage.delete_rule(rule_id) # Delete triage rule
|
278
|
-
```
|
279
|
-
|
280
|
-
### **📋 Isolations (5 endpoints)**
|
281
|
-
|
282
|
-
```python
|
283
|
-
client.isolations.isolate(endpoint_ids) # Isolate endpoints
|
284
|
-
client.isolations.unisolate(endpoint_ids) # Remove isolation
|
285
|
-
client.isolations.list() # List isolations
|
286
|
-
client.isolations.get(isolation_id) # Get isolation details
|
287
|
-
client.isolations.cancel(isolation_id) # Cancel isolation
|
288
|
-
```
|
289
|
-
|
290
|
-
### **📚 Evidences (7 endpoints)**
|
291
|
-
|
292
|
-
```python
|
293
|
-
client.evidences.list() # List evidences
|
294
|
-
client.evidences.create(evidence_data) # Create evidence
|
295
|
-
client.evidences.get(evidence_id) # Get evidence details
|
296
|
-
client.evidences.update(evidence_id, data) # Update evidence
|
297
|
-
client.evidences.delete(evidence_id) # Delete evidence
|
298
|
-
client.evidences.upload_file(evidence_id, file_data) # Upload file
|
299
|
-
client.evidences.download_file(evidence_id, file_id) # Download file
|
300
|
-
```
|
301
|
-
|
302
|
-
### **📊 Tasks (6 endpoints)**
|
303
|
-
|
304
|
-
```python
|
305
|
-
client.tasks.list() # List tasks
|
306
|
-
client.tasks.get(task_id) # Get task details
|
307
|
-
client.tasks.get_assignments(task_id) # Get task assignments
|
308
|
-
client.tasks.cancel_assignment(assignment_id) # Cancel assignment
|
309
|
-
client.tasks.delete_assignment(assignment_id) # Delete assignment
|
310
|
-
client.tasks.cancel_task(task_id) # Cancel task
|
311
|
-
```
|
312
|
-
|
313
|
-
### **🔐 Authentication (2 endpoints)**
|
314
|
-
|
315
|
-
```python
|
316
|
-
client.authentication.login(credentials) # Login with credentials
|
317
|
-
client.authentication.check() # Check auth status
|
318
|
-
```
|
319
|
-
|
320
|
-
### **👁️ Monitoring (5 endpoints)**
|
321
|
-
|
322
|
-
```python
|
323
|
-
client.monitoring.get_system_status() # Get system status
|
324
|
-
client.monitoring.get_metrics() # Get metrics
|
325
|
-
client.monitoring.get_alerts() # Get alerts
|
326
|
-
client.monitoring.create_alert(alert_data) # Create alert
|
327
|
-
client.monitoring.dismiss_alert(alert_id) # Dismiss alert
|
328
|
-
```
|
329
|
-
|
330
|
-
### **📊 Reports (2 endpoints)**
|
331
|
-
|
332
|
-
```python
|
333
|
-
client.reports.generate_report(report_data) # Generate report
|
334
|
-
client.reports.get_report(report_id) # Get report
|
335
|
-
```
|
336
|
-
|
337
|
-
### **💾 Software Inventory (4 endpoints)**
|
338
|
-
|
339
|
-
```python
|
340
|
-
client.software_inventory.list() # List software
|
341
|
-
client.software_inventory.get(software_id) # Get software details
|
342
|
-
client.software_inventory.search(query) # Search software
|
343
|
-
client.software_inventory.get_vulnerabilities(id) # Get vulnerabilities
|
344
|
-
```
|
345
|
-
|
346
|
-
### **🏢 Organizations (12 endpoints)**
|
347
|
-
|
348
|
-
```python
|
349
|
-
client.organizations.list() # List organizations
|
350
|
-
client.organizations.create(org_data) # Create organization
|
351
|
-
client.organizations.get(org_id) # Get organization
|
352
|
-
client.organizations.update(org_id, data) # Update organization
|
353
|
-
client.organizations.delete(org_id) # Delete organization
|
354
|
-
client.organizations.get_users(org_id) # Get org users
|
355
|
-
client.organizations.add_user(org_id, user_id) # Add user
|
356
|
-
client.organizations.remove_user(org_id, user_id) # Remove user
|
357
|
-
client.organizations.get_settings(org_id) # Get settings
|
358
|
-
client.organizations.update_settings(org_id, data) # Update settings
|
359
|
-
client.organizations.get_deployment(org_id) # Get deployment
|
360
|
-
client.organizations.update_deployment(org_id, data) # Update deployment
|
361
|
-
```
|
362
|
-
|
363
|
-
### **👥 Users (3 endpoints)**
|
364
|
-
|
365
|
-
```python
|
366
|
-
client.user_management.list() # List users
|
367
|
-
client.user_management.get(user_id) # Get user details
|
368
|
-
client.user_management.create_api_user(user_data) # Create API user
|
369
|
-
```
|
370
|
-
|
371
|
-
### **⚙️ Settings (2 endpoints)**
|
372
|
-
|
373
|
-
```python
|
374
|
-
client.settings.get_banner_settings() # Get banner settings
|
375
|
-
client.settings.update_banner_settings(data) # Update banner settings
|
376
|
-
```
|
377
|
-
|
378
|
-
### **📖 Playbooks (3 endpoints)**
|
379
|
-
|
380
|
-
```python
|
381
|
-
client.playbooks.list() # List playbooks
|
382
|
-
client.playbooks.get(playbook_id) # Get playbook
|
383
|
-
client.playbooks.execute(playbook_id, params) # Execute playbook
|
384
|
-
```
|
385
|
-
|
386
|
-
### **🔗 Webhooks (3 endpoints)**
|
387
|
-
|
388
|
-
```python
|
389
|
-
client.webhooks.trigger_get(slug, token) # Trigger GET webhook
|
390
|
-
client.webhooks.trigger_post(slug, token, payload) # Trigger POST webhook
|
391
|
-
client.webhooks.get_task_details(slug, token, task_id) # Get task details
|
392
|
-
```
|
393
|
-
|
394
|
-
### **🗂️ Profiles (6 endpoints)**
|
395
|
-
|
396
|
-
```python
|
397
|
-
client.profiles.list() # List profiles
|
398
|
-
client.profiles.create(profile_data) # Create profile
|
399
|
-
client.profiles.get(profile_id) # Get profile
|
400
|
-
client.profiles.update(profile_id, data) # Update profile
|
401
|
-
client.profiles.delete(profile_id) # Delete profile
|
402
|
-
client.profiles.validate(profile_id) # Validate profile
|
403
|
-
```
|
404
|
-
client.policies.get_match_stats(filter_params) # Get statistics
|
405
|
-
|
406
|
-
# Triage Operations (9 endpoints)
|
407
|
-
client.triage.list_rules(filter_params) # List rules
|
408
|
-
client.triage.create_rule(rule_data) # Create rule
|
409
|
-
client.triage.get_rule(rule_id) # Get rule
|
410
|
-
client.triage.update_rule(rule_id, data) # Update rule
|
411
|
-
client.triage.delete_rule(rule_id) # Delete rule
|
412
|
-
client.triage.validate_rule(rule_content) # Validate rule
|
413
|
-
client.triage.list_tags() # List tags
|
414
|
-
client.triage.create_tag(tag_data) # Create tag
|
415
|
-
client.triage.assign_task(task_data) # Assign task
|
416
|
-
```
|
417
|
-
|
418
|
-
### **Administration**
|
419
|
-
|
420
|
-
```python
|
421
|
-
# Organization Operations (14 endpoints)
|
422
|
-
client.organizations.list() # List organizations
|
423
|
-
client.organizations.create(org_data) # Create organization
|
424
|
-
client.organizations.get(org_id) # Get organization
|
425
|
-
client.organizations.update(org_id, data) # Update organization
|
426
|
-
client.organizations.delete(org_id) # Delete organization
|
427
|
-
client.organizations.get_users(org_id) # Get users
|
428
|
-
client.organizations.add_user(org_id, user) # Add user
|
429
|
-
client.organizations.remove_user(org_id, user_id) # Remove user
|
430
|
-
client.organizations.add_tags(org_id, tags) # Add tags
|
431
|
-
client.organizations.delete_tags(org_id, tags) # Delete tags
|
432
|
-
client.organizations.check_name(name) # Check name
|
433
|
-
# ... and 3 more organization endpoints
|
434
|
-
|
435
|
-
# User Management (3 endpoints)
|
436
|
-
client.user_management.list_users() # List users
|
437
|
-
client.user_management.get_user(user_id) # Get user
|
438
|
-
client.user_management.create_api_user(data) # Create API user
|
439
|
-
|
440
|
-
# Task Management (7 endpoints)
|
441
|
-
client.tasks.list(filter_params) # List tasks
|
442
|
-
client.tasks.get(task_id) # Get task
|
443
|
-
client.tasks.get_assignments(task_id) # Get assignments
|
444
|
-
client.tasks.cancel(task_id) # Cancel task
|
445
|
-
client.tasks.delete(task_id) # Delete task
|
446
|
-
client.tasks.cancel_assignment(assignment_id) # Cancel assignment
|
447
|
-
client.tasks.delete_assignment(assignment_id) # Delete assignment
|
448
|
-
```
|
449
|
-
|
450
|
-
## 🔧 Configuration Options
|
451
|
-
|
452
|
-
### **Environment Variables**
|
453
|
-
|
454
|
-
```bash
|
455
|
-
export AIR_HOST="https://your-air-instance.com"
|
456
|
-
export AIR_API_TOKEN="your-api-token"
|
457
|
-
export AIR_ORGANIZATION_ID="0"
|
458
|
-
export AIR_VERIFY_SSL="true"
|
459
|
-
export AIR_TIMEOUT="30"
|
460
|
-
```
|
461
|
-
|
462
|
-
### **Configuration File (config.json)**
|
463
|
-
|
464
|
-
```json
|
465
|
-
{
|
466
|
-
"host": "https://your-air-instance.com",
|
467
|
-
"api_token": "your-api-token",
|
468
|
-
"organization_id": 0,
|
469
|
-
"verify_ssl": true,
|
470
|
-
"timeout": 30
|
471
|
-
}
|
472
|
-
```
|
473
|
-
|
474
|
-
### **Programmatic Configuration**
|
475
|
-
|
476
|
-
```python
|
477
|
-
from binalyze_air import AIRClient, AIRConfig
|
478
|
-
|
479
|
-
# Using config object
|
480
|
-
config = AIRConfig(
|
481
|
-
host="https://your-air-instance.com",
|
482
|
-
api_token="your-api-token",
|
483
|
-
organization_id=0,
|
484
|
-
verify_ssl=False,
|
485
|
-
timeout=60
|
486
|
-
)
|
487
|
-
client = AIRClient(config=config)
|
488
|
-
|
489
|
-
# Direct initialization
|
490
|
-
client = AIRClient(
|
491
|
-
host="https://your-air-instance.com",
|
492
|
-
api_token="your-api-token",
|
493
|
-
organization_id=0
|
494
|
-
)
|
495
|
-
|
496
|
-
# From environment
|
497
|
-
client = AIRClient.from_environment()
|
498
|
-
|
499
|
-
# From config file
|
500
|
-
client = AIRClient.from_config_file("config.json")
|
501
|
-
```
|
502
|
-
|
503
|
-
## 🏗️ Architecture & Design
|
504
|
-
|
505
|
-
### **CQRS Pattern**
|
506
|
-
|
507
|
-
Clean separation of read and write operations:
|
508
|
-
|
509
|
-
```python
|
510
|
-
# Queries (Read operations)
|
511
|
-
assets = client.assets.list()
|
512
|
-
asset = client.assets.get("asset-id")
|
513
|
-
cases = client.cases.list(filter_params)
|
514
|
-
|
515
|
-
# Commands (Write operations)
|
516
|
-
client.assets.isolate(["endpoint-id"])
|
517
|
-
client.cases.create(case_data)
|
518
|
-
client.policies.execute("policy-id", ["endpoint-id"])
|
519
|
-
```
|
520
|
-
|
521
|
-
### **Type Safety with Pydantic V2**
|
522
|
-
|
523
|
-
```python
|
524
|
-
from binalyze_air.models.cases import CreateCaseRequest
|
525
|
-
from binalyze_air.models.assets import AssetFilter
|
526
|
-
|
527
|
-
# Type-safe request objects
|
528
|
-
case_request = CreateCaseRequest(
|
529
|
-
name="Investigation",
|
530
|
-
description="Security incident",
|
531
|
-
visibility="organization"
|
532
|
-
)
|
533
|
-
case = client.cases.create(case_request)
|
534
|
-
|
535
|
-
# Type-safe filtering
|
536
|
-
asset_filter = AssetFilter(
|
537
|
-
organization_ids=[0],
|
538
|
-
online_status=["online"],
|
539
|
-
tags=["production"]
|
540
|
-
)
|
541
|
-
assets = client.assets.list(asset_filter)
|
542
|
-
```
|
543
|
-
|
544
|
-
### **Comprehensive Error Handling**
|
545
|
-
|
546
|
-
```python
|
547
|
-
from binalyze_air.exceptions import (
|
548
|
-
AIRAPIError,
|
549
|
-
AuthenticationError,
|
550
|
-
AuthorizationError,
|
551
|
-
ValidationError
|
552
|
-
)
|
553
|
-
|
554
|
-
try:
|
555
|
-
case = client.cases.create(case_data)
|
556
|
-
except AuthenticationError:
|
557
|
-
print("Invalid API token")
|
558
|
-
except AuthorizationError:
|
559
|
-
print("Insufficient permissions")
|
560
|
-
except ValidationError as e:
|
561
|
-
print(f"Validation failed: {e}")
|
562
|
-
except AIRAPIError as e:
|
563
|
-
print(f"API error: {e}")
|
564
|
-
```
|
565
|
-
|
566
|
-
## 🧪 Testing & Quality
|
567
|
-
|
568
|
-
### **Comprehensive Test Suite**
|
569
|
-
|
570
|
-
- **126 endpoint tests** covering all API functionality
|
571
|
-
- **Real system validation** with actual AIR instance
|
572
|
-
- **100% field mapping accuracy** verification
|
573
|
-
- **Error scenario testing** for robust error handling
|
574
|
-
|
575
|
-
### **Running Tests**
|
576
|
-
|
577
|
-
```bash
|
578
|
-
# Run all tests
|
579
|
-
python -m pytest tests/ -v
|
580
|
-
|
581
|
-
# Run specific module tests
|
582
|
-
python tests_api/001_acquisitions_01_get_acquisition_profiles_test.py
|
583
|
-
python tests_api/007_cases_08_get_cases_test.py
|
584
|
-
python tests_api/013_policies_03_get_policies_test.py
|
585
|
-
|
586
|
-
# Run test suite
|
587
|
-
python tests_api/runtests.py
|
588
|
-
```
|
589
|
-
|
590
|
-
### **Quality Metrics**
|
591
|
-
|
592
|
-
- ✅ **Production Ready**: All endpoints battle-tested
|
593
|
-
- ✅ **Cross-Platform**: Windows, Linux, macOS compatible
|
594
|
-
- ✅ **ASCII Output**: Universal compatibility
|
595
|
-
- ✅ **Real Data Testing**: Validated with live system
|
596
|
-
- ✅ **Zero Hardcoded Values**: Dynamic test data
|
597
|
-
|
598
|
-
## 📖 Documentation
|
599
|
-
|
600
|
-
- **[Quick Start Guide](QUICK_START.md)** - Get started in minutes
|
601
|
-
- **[SDK Documentation](SDK_DOCUMENTATION.md)** - Complete API reference
|
602
|
-
- **[Test Results](tests_api/)** - Comprehensive test suite
|
603
|
-
- **[Examples](examples/)** - Real-world usage examples
|
604
|
-
|
605
|
-
## 🤝 Contributing
|
606
|
-
|
607
|
-
1. Fork the repository
|
608
|
-
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
609
|
-
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
610
|
-
4. Push to the branch (`git push origin feature/amazing-feature`)
|
611
|
-
5. Open a Pull Request
|
612
|
-
|
613
|
-
## 📄 License
|
614
|
-
|
615
|
-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
616
|
-
|
617
|
-
## 🆘 Support
|
618
|
-
|
619
|
-
- **Issues**: [GitHub Issues](https://github.com/binalyze/air-python-sdk/issues)
|
620
|
-
- **Documentation**: [GitHub Wiki](https://github.com/binalyze/air-python-sdk/wiki)
|
621
|
-
- **Email**: support@binalyze.com
|
622
|
-
|
623
|
-
## 🎉 Acknowledgments
|
624
|
-
|
625
|
-
- **Binalyze Team** for the incredible AIR platform
|
626
|
-
- **Python Community** for excellent libraries and tools
|
627
|
-
- **Contributors** who helped achieve 100% API coverage
|
628
|
-
|
629
|
-
---
|
630
|
-
|
631
|
-
**🏆 ACHIEVEMENT UNLOCKED: 100% API COVERAGE!**
|
632
|
-
|
633
|
-
_Every single Binalyze AIR API endpoint is now accessible through this production-ready Python SDK. From asset management to evidence acquisition, from policy enforcement to triage automation - everything is at your fingertips._
|
634
|
-
|
635
|
-
**Status: Production Ready | Coverage: 100% | Quality: Battle-Tested**
|
File without changes
|
File without changes
|