regscale-cli 6.27.3.0__py3-none-any.whl → 6.28.1.0__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.

Potentially problematic release.


This version of regscale-cli might be problematic. Click here for more details.

Files changed (113) hide show
  1. regscale/_version.py +1 -1
  2. regscale/core/app/utils/app_utils.py +11 -2
  3. regscale/dev/cli.py +26 -0
  4. regscale/dev/version.py +72 -0
  5. regscale/integrations/commercial/__init__.py +15 -1
  6. regscale/integrations/commercial/amazon/amazon/__init__.py +0 -0
  7. regscale/integrations/commercial/amazon/amazon/common.py +204 -0
  8. regscale/integrations/commercial/amazon/common.py +48 -58
  9. regscale/integrations/commercial/aws/audit_manager_compliance.py +2671 -0
  10. regscale/integrations/commercial/aws/cli.py +3093 -55
  11. regscale/integrations/commercial/aws/cloudtrail_control_mappings.py +333 -0
  12. regscale/integrations/commercial/aws/cloudtrail_evidence.py +501 -0
  13. regscale/integrations/commercial/aws/cloudwatch_control_mappings.py +357 -0
  14. regscale/integrations/commercial/aws/cloudwatch_evidence.py +490 -0
  15. regscale/integrations/commercial/aws/config_compliance.py +914 -0
  16. regscale/integrations/commercial/aws/conformance_pack_mappings.py +198 -0
  17. regscale/integrations/commercial/aws/evidence_generator.py +283 -0
  18. regscale/integrations/commercial/aws/guardduty_control_mappings.py +340 -0
  19. regscale/integrations/commercial/aws/guardduty_evidence.py +1053 -0
  20. regscale/integrations/commercial/aws/iam_control_mappings.py +368 -0
  21. regscale/integrations/commercial/aws/iam_evidence.py +574 -0
  22. regscale/integrations/commercial/aws/inventory/__init__.py +223 -22
  23. regscale/integrations/commercial/aws/inventory/base.py +107 -5
  24. regscale/integrations/commercial/aws/inventory/resources/audit_manager.py +513 -0
  25. regscale/integrations/commercial/aws/inventory/resources/cloudtrail.py +315 -0
  26. regscale/integrations/commercial/aws/inventory/resources/cloudtrail_logs_metadata.py +476 -0
  27. regscale/integrations/commercial/aws/inventory/resources/cloudwatch.py +191 -0
  28. regscale/integrations/commercial/aws/inventory/resources/compute.py +66 -9
  29. regscale/integrations/commercial/aws/inventory/resources/config.py +464 -0
  30. regscale/integrations/commercial/aws/inventory/resources/containers.py +74 -9
  31. regscale/integrations/commercial/aws/inventory/resources/database.py +106 -31
  32. regscale/integrations/commercial/aws/inventory/resources/guardduty.py +286 -0
  33. regscale/integrations/commercial/aws/inventory/resources/iam.py +470 -0
  34. regscale/integrations/commercial/aws/inventory/resources/inspector.py +476 -0
  35. regscale/integrations/commercial/aws/inventory/resources/integration.py +175 -61
  36. regscale/integrations/commercial/aws/inventory/resources/kms.py +447 -0
  37. regscale/integrations/commercial/aws/inventory/resources/networking.py +103 -67
  38. regscale/integrations/commercial/aws/inventory/resources/s3.py +394 -0
  39. regscale/integrations/commercial/aws/inventory/resources/security.py +268 -72
  40. regscale/integrations/commercial/aws/inventory/resources/securityhub.py +473 -0
  41. regscale/integrations/commercial/aws/inventory/resources/storage.py +53 -29
  42. regscale/integrations/commercial/aws/inventory/resources/systems_manager.py +657 -0
  43. regscale/integrations/commercial/aws/inventory/resources/vpc.py +655 -0
  44. regscale/integrations/commercial/aws/kms_control_mappings.py +288 -0
  45. regscale/integrations/commercial/aws/kms_evidence.py +879 -0
  46. regscale/integrations/commercial/aws/ocsf/__init__.py +7 -0
  47. regscale/integrations/commercial/aws/ocsf/constants.py +115 -0
  48. regscale/integrations/commercial/aws/ocsf/mapper.py +435 -0
  49. regscale/integrations/commercial/aws/org_control_mappings.py +286 -0
  50. regscale/integrations/commercial/aws/org_evidence.py +666 -0
  51. regscale/integrations/commercial/aws/s3_control_mappings.py +356 -0
  52. regscale/integrations/commercial/aws/s3_evidence.py +632 -0
  53. regscale/integrations/commercial/aws/scanner.py +851 -206
  54. regscale/integrations/commercial/aws/security_hub.py +319 -0
  55. regscale/integrations/commercial/aws/session_manager.py +282 -0
  56. regscale/integrations/commercial/aws/ssm_control_mappings.py +291 -0
  57. regscale/integrations/commercial/aws/ssm_evidence.py +492 -0
  58. regscale/integrations/commercial/synqly/ticketing.py +27 -0
  59. regscale/integrations/compliance_integration.py +308 -38
  60. regscale/integrations/due_date_handler.py +3 -0
  61. regscale/integrations/scanner_integration.py +399 -84
  62. regscale/models/integration_models/cisa_kev_data.json +65 -5
  63. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  64. regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +17 -9
  65. regscale/models/regscale_models/assessment.py +2 -1
  66. regscale/models/regscale_models/control_objective.py +74 -5
  67. regscale/models/regscale_models/file.py +2 -0
  68. regscale/models/regscale_models/issue.py +2 -5
  69. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/METADATA +1 -1
  70. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/RECORD +113 -34
  71. tests/regscale/integrations/commercial/aws/__init__.py +0 -0
  72. tests/regscale/integrations/commercial/aws/test_audit_manager_compliance.py +1304 -0
  73. tests/regscale/integrations/commercial/aws/test_audit_manager_evidence_aggregation.py +341 -0
  74. tests/regscale/integrations/commercial/aws/test_aws_audit_manager_collector.py +1155 -0
  75. tests/regscale/integrations/commercial/aws/test_aws_cloudtrail_collector.py +534 -0
  76. tests/regscale/integrations/commercial/aws/test_aws_config_collector.py +400 -0
  77. tests/regscale/integrations/commercial/aws/test_aws_guardduty_collector.py +315 -0
  78. tests/regscale/integrations/commercial/aws/test_aws_iam_collector.py +458 -0
  79. tests/regscale/integrations/commercial/aws/test_aws_inspector_collector.py +353 -0
  80. tests/regscale/integrations/commercial/aws/test_aws_inventory_integration.py +530 -0
  81. tests/regscale/integrations/commercial/aws/test_aws_kms_collector.py +919 -0
  82. tests/regscale/integrations/commercial/aws/test_aws_s3_collector.py +722 -0
  83. tests/regscale/integrations/commercial/aws/test_aws_scanner_integration.py +722 -0
  84. tests/regscale/integrations/commercial/aws/test_aws_securityhub_collector.py +792 -0
  85. tests/regscale/integrations/commercial/aws/test_aws_systems_manager_collector.py +918 -0
  86. tests/regscale/integrations/commercial/aws/test_aws_vpc_collector.py +996 -0
  87. tests/regscale/integrations/commercial/aws/test_cli_evidence.py +431 -0
  88. tests/regscale/integrations/commercial/aws/test_cloudtrail_control_mappings.py +452 -0
  89. tests/regscale/integrations/commercial/aws/test_cloudtrail_evidence.py +788 -0
  90. tests/regscale/integrations/commercial/aws/test_config_compliance.py +298 -0
  91. tests/regscale/integrations/commercial/aws/test_conformance_pack_mappings.py +200 -0
  92. tests/regscale/integrations/commercial/aws/test_evidence_generator.py +386 -0
  93. tests/regscale/integrations/commercial/aws/test_guardduty_control_mappings.py +564 -0
  94. tests/regscale/integrations/commercial/aws/test_guardduty_evidence.py +1041 -0
  95. tests/regscale/integrations/commercial/aws/test_iam_control_mappings.py +718 -0
  96. tests/regscale/integrations/commercial/aws/test_iam_evidence.py +1375 -0
  97. tests/regscale/integrations/commercial/aws/test_kms_control_mappings.py +656 -0
  98. tests/regscale/integrations/commercial/aws/test_kms_evidence.py +1163 -0
  99. tests/regscale/integrations/commercial/aws/test_ocsf_mapper.py +370 -0
  100. tests/regscale/integrations/commercial/aws/test_org_control_mappings.py +546 -0
  101. tests/regscale/integrations/commercial/aws/test_org_evidence.py +1240 -0
  102. tests/regscale/integrations/commercial/aws/test_s3_control_mappings.py +672 -0
  103. tests/regscale/integrations/commercial/aws/test_s3_evidence.py +987 -0
  104. tests/regscale/integrations/commercial/aws/test_scanner_evidence.py +373 -0
  105. tests/regscale/integrations/commercial/aws/test_security_hub_config_filtering.py +539 -0
  106. tests/regscale/integrations/commercial/aws/test_session_manager.py +516 -0
  107. tests/regscale/integrations/commercial/aws/test_ssm_control_mappings.py +588 -0
  108. tests/regscale/integrations/commercial/aws/test_ssm_evidence.py +735 -0
  109. tests/regscale/integrations/commercial/test_aws.py +55 -56
  110. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/LICENSE +0 -0
  111. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/WHEEL +0 -0
  112. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/entry_points.txt +0 -0
  113. {regscale_cli-6.27.3.0.dist-info → regscale_cli-6.28.1.0.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,32 @@
1
1
  """AWS application integration resource collectors."""
2
2
 
3
- from typing import Dict, List, Any
3
+ from typing import Dict, List, Any, Optional
4
4
 
5
5
  from ..base import BaseCollector
6
6
 
7
7
 
8
8
  class IntegrationCollector(BaseCollector):
9
- """Collector for AWS application integration resources."""
9
+ """Collector for AWS application integration resources with filtering support."""
10
+
11
+ def __init__(
12
+ self,
13
+ session: Any,
14
+ region: str,
15
+ account_id: Optional[str] = None,
16
+ tags: Optional[Dict[str, str]] = None,
17
+ enabled_services: Optional[Dict[str, bool]] = None,
18
+ ):
19
+ """
20
+ Initialize integration collector with filtering support.
21
+
22
+ :param session: AWS session to use for API calls
23
+ :param str region: AWS region to collect from
24
+ :param str account_id: Optional AWS account ID to filter resources
25
+ :param dict tags: Optional tag filters (AND logic)
26
+ :param dict enabled_services: Optional dict of service names to boolean flags for enabling/disabling collection
27
+ """
28
+ super().__init__(session, region, account_id, tags)
29
+ self.enabled_services = enabled_services or {}
10
30
 
11
31
  def get_api_gateways(self) -> Dict[str, List[Dict[str, Any]]]:
12
32
  """
@@ -84,9 +104,75 @@ class IntegrationCollector(BaseCollector):
84
104
  self._handle_error(e, "API Gateway APIs")
85
105
  return apis
86
106
 
107
+ def _should_include_topic(self, sns, topic_arn: str) -> bool:
108
+ """
109
+ Check if topic should be included based on account and tag filters.
110
+
111
+ :param sns: SNS client
112
+ :param str topic_arn: Topic ARN
113
+ :return: True if topic should be included, False otherwise
114
+ :rtype: bool
115
+ """
116
+ if not self._matches_account(topic_arn):
117
+ return False
118
+
119
+ if self.tags:
120
+ try:
121
+ tags_response = sns.list_tags_for_resource(ResourceArn=topic_arn)
122
+ topic_tags = tags_response.get("Tags", [])
123
+ return self._matches_tags(topic_tags)
124
+ except Exception:
125
+ return False
126
+
127
+ return True
128
+
129
+ def _get_topic_subscriptions(self, sns, topic_arn: str) -> List[Dict[str, Any]]:
130
+ """
131
+ Get all subscriptions for a topic.
132
+
133
+ :param sns: SNS client
134
+ :param str topic_arn: Topic ARN
135
+ :return: List of subscriptions
136
+ :rtype: List[Dict[str, Any]]
137
+ """
138
+ subs = []
139
+ sub_paginator = sns.get_paginator("list_subscriptions_by_topic")
140
+ for sub_page in sub_paginator.paginate(TopicArn=topic_arn):
141
+ subs.extend(sub_page.get("Subscriptions", []))
142
+ return subs
143
+
144
+ def _build_topic_data(self, topic_arn: str, attrs: Dict[str, Any], subs: List[Dict[str, Any]]) -> Dict[str, Any]:
145
+ """
146
+ Build topic data dictionary.
147
+
148
+ :param str topic_arn: Topic ARN
149
+ :param attrs: Topic attributes
150
+ :param subs: List of subscriptions
151
+ :return: Processed topic data
152
+ :rtype: Dict[str, Any]
153
+ """
154
+ return {
155
+ "Region": self.region,
156
+ "TopicArn": topic_arn,
157
+ "Owner": attrs.get("Owner"),
158
+ "Policy": attrs.get("Policy"),
159
+ "DisplayName": attrs.get("DisplayName"),
160
+ "SubscriptionsConfirmed": attrs.get("SubscriptionsConfirmed"),
161
+ "SubscriptionsPending": attrs.get("SubscriptionsPending"),
162
+ "SubscriptionsDeleted": attrs.get("SubscriptionsDeleted"),
163
+ "Subscriptions": [
164
+ {
165
+ "SubscriptionArn": sub.get("SubscriptionArn"),
166
+ "Protocol": sub.get("Protocol"),
167
+ "Endpoint": sub.get("Endpoint"),
168
+ }
169
+ for sub in subs
170
+ ],
171
+ }
172
+
87
173
  def get_sns_topics(self) -> List[Dict[str, Any]]:
88
174
  """
89
- Get information about SNS topics.
175
+ Get information about SNS topics with filtering.
90
176
 
91
177
  :return: List of SNS topic information
92
178
  :rtype: List[Dict[str, Any]]
@@ -99,43 +185,73 @@ class IntegrationCollector(BaseCollector):
99
185
  for page in paginator.paginate():
100
186
  for topic in page.get("Topics", []):
101
187
  try:
102
- # Get topic attributes
103
- attrs = sns.get_topic_attributes(TopicArn=topic["TopicArn"])["Attributes"]
104
- # Get subscriptions
105
- subs = []
106
- sub_paginator = sns.get_paginator("list_subscriptions_by_topic")
107
- for sub_page in sub_paginator.paginate(TopicArn=topic["TopicArn"]):
108
- subs.extend(sub_page.get("Subscriptions", []))
109
-
110
- topics.append(
111
- {
112
- "Region": self.region,
113
- "TopicArn": topic.get("TopicArn"),
114
- "Owner": attrs.get("Owner"),
115
- "Policy": attrs.get("Policy"),
116
- "DisplayName": attrs.get("DisplayName"),
117
- "SubscriptionsConfirmed": attrs.get("SubscriptionsConfirmed"),
118
- "SubscriptionsPending": attrs.get("SubscriptionsPending"),
119
- "SubscriptionsDeleted": attrs.get("SubscriptionsDeleted"),
120
- "Subscriptions": [
121
- {
122
- "SubscriptionArn": sub.get("SubscriptionArn"),
123
- "Protocol": sub.get("Protocol"),
124
- "Endpoint": sub.get("Endpoint"),
125
- }
126
- for sub in subs
127
- ],
128
- }
129
- )
188
+ topic_arn = topic["TopicArn"]
189
+
190
+ if not self._should_include_topic(sns, topic_arn):
191
+ continue
192
+
193
+ attrs = sns.get_topic_attributes(TopicArn=topic_arn)["Attributes"]
194
+ subs = self._get_topic_subscriptions(sns, topic_arn)
195
+ topic_data = self._build_topic_data(topic_arn, attrs, subs)
196
+ topics.append(topic_data)
130
197
  except Exception as e:
131
198
  self._handle_error(e, f"SNS topic {topic['TopicArn']}")
132
199
  except Exception as e:
133
200
  self._handle_error(e, "SNS topics")
134
201
  return topics
135
202
 
203
+ def _should_include_queue(self, sqs, queue_arn: str, queue_url: str) -> bool:
204
+ """
205
+ Check if queue should be included based on account and tag filters.
206
+
207
+ :param sqs: SQS client
208
+ :param str queue_arn: Queue ARN
209
+ :param str queue_url: Queue URL
210
+ :return: True if queue should be included, False otherwise
211
+ :rtype: bool
212
+ """
213
+ if not self._matches_account(queue_arn):
214
+ return False
215
+
216
+ if self.tags:
217
+ try:
218
+ tags_response = sqs.list_queue_tags(QueueUrl=queue_url)
219
+ queue_tags = tags_response.get("Tags", {})
220
+ return self._matches_tags(queue_tags)
221
+ except Exception:
222
+ return False
223
+
224
+ return True
225
+
226
+ def _build_queue_data(self, queue_url: str, attrs: Dict[str, Any]) -> Dict[str, Any]:
227
+ """
228
+ Build queue data dictionary.
229
+
230
+ :param str queue_url: Queue URL
231
+ :param attrs: Queue attributes
232
+ :return: Processed queue data
233
+ :rtype: Dict[str, Any]
234
+ """
235
+ return {
236
+ "Region": self.region,
237
+ "QueueUrl": queue_url,
238
+ "QueueArn": attrs.get("QueueArn"),
239
+ "ApproximateNumberOfMessages": attrs.get("ApproximateNumberOfMessages"),
240
+ "ApproximateNumberOfMessagesNotVisible": attrs.get("ApproximateNumberOfMessagesNotVisible"),
241
+ "ApproximateNumberOfMessagesDelayed": attrs.get("ApproximateNumberOfMessagesDelayed"),
242
+ "CreatedTimestamp": attrs.get("CreatedTimestamp"),
243
+ "LastModifiedTimestamp": attrs.get("LastModifiedTimestamp"),
244
+ "VisibilityTimeout": attrs.get("VisibilityTimeout"),
245
+ "MaximumMessageSize": attrs.get("MaximumMessageSize"),
246
+ "MessageRetentionPeriod": attrs.get("MessageRetentionPeriod"),
247
+ "DelaySeconds": attrs.get("DelaySeconds"),
248
+ "Policy": attrs.get("Policy"),
249
+ "RedrivePolicy": attrs.get("RedrivePolicy"),
250
+ }
251
+
136
252
  def get_sqs_queues(self) -> List[Dict[str, Any]]:
137
253
  """
138
- Get information about SQS queues.
254
+ Get information about SQS queues with filtering.
139
255
 
140
256
  :return: List of SQS queue information
141
257
  :rtype: List[Dict[str, Any]]
@@ -148,29 +264,14 @@ class IntegrationCollector(BaseCollector):
148
264
  for page in paginator.paginate():
149
265
  for queue_url in page.get("QueueUrls", []):
150
266
  try:
151
- # Get queue attributes
152
267
  attrs = sqs.get_queue_attributes(QueueUrl=queue_url, AttributeNames=["All"])["Attributes"]
268
+ queue_arn = attrs.get("QueueArn", "")
153
269
 
154
- queues.append(
155
- {
156
- "Region": self.region,
157
- "QueueUrl": queue_url,
158
- "QueueArn": attrs.get("QueueArn"),
159
- "ApproximateNumberOfMessages": attrs.get("ApproximateNumberOfMessages"),
160
- "ApproximateNumberOfMessagesNotVisible": attrs.get(
161
- "ApproximateNumberOfMessagesNotVisible"
162
- ),
163
- "ApproximateNumberOfMessagesDelayed": attrs.get("ApproximateNumberOfMessagesDelayed"),
164
- "CreatedTimestamp": attrs.get("CreatedTimestamp"),
165
- "LastModifiedTimestamp": attrs.get("LastModifiedTimestamp"),
166
- "VisibilityTimeout": attrs.get("VisibilityTimeout"),
167
- "MaximumMessageSize": attrs.get("MaximumMessageSize"),
168
- "MessageRetentionPeriod": attrs.get("MessageRetentionPeriod"),
169
- "DelaySeconds": attrs.get("DelaySeconds"),
170
- "Policy": attrs.get("Policy"),
171
- "RedrivePolicy": attrs.get("RedrivePolicy"),
172
- }
173
- )
270
+ if not self._should_include_queue(sqs, queue_arn, queue_url):
271
+ continue
272
+
273
+ queue_data = self._build_queue_data(queue_url, attrs)
274
+ queues.append(queue_data)
174
275
  except Exception as e:
175
276
  self._handle_error(e, f"SQS queue {queue_url}")
176
277
  except Exception as e:
@@ -224,14 +325,27 @@ class IntegrationCollector(BaseCollector):
224
325
 
225
326
  def collect(self) -> Dict[str, Any]:
226
327
  """
227
- Collect all application integration resources.
328
+ Collect application integration resources based on enabled_services configuration.
228
329
 
229
- :return: Dictionary containing all application integration resource information
330
+ :return: Dictionary containing enabled application integration resource information
230
331
  :rtype: Dict[str, Any]
231
332
  """
232
- return {
233
- "APIGateway": self.get_api_gateways(),
234
- "SNSTopics": self.get_sns_topics(),
235
- "SQSQueues": self.get_sqs_queues(),
236
- "EventBridgeRules": self.get_eventbridge_rules(),
237
- }
333
+ result = {}
334
+
335
+ # API Gateway
336
+ if self.enabled_services.get("api_gateway", True):
337
+ result["APIGateway"] = self.get_api_gateways()
338
+
339
+ # SNS Topics
340
+ if self.enabled_services.get("sns", True):
341
+ result["SNSTopics"] = self.get_sns_topics()
342
+
343
+ # SQS Queues
344
+ if self.enabled_services.get("sqs", True):
345
+ result["SQSQueues"] = self.get_sqs_queues()
346
+
347
+ # EventBridge Rules
348
+ if self.enabled_services.get("eventbridge", True):
349
+ result["EventBridgeRules"] = self.get_eventbridge_rules()
350
+
351
+ return result