cartography 0.114.0__py3-none-any.whl → 0.116.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 cartography might be problematic. Click here for more details.

Files changed (58) hide show
  1. cartography/_version.py +2 -2
  2. cartography/cli.py +2 -2
  3. cartography/client/core/tx.py +12 -1
  4. cartography/intel/aws/config.py +7 -3
  5. cartography/intel/aws/ecr.py +9 -9
  6. cartography/intel/aws/ecr_image_layers.py +664 -0
  7. cartography/intel/aws/identitycenter.py +240 -13
  8. cartography/intel/aws/lambda_function.py +69 -2
  9. cartography/intel/aws/organizations.py +3 -1
  10. cartography/intel/aws/permission_relationships.py +3 -1
  11. cartography/intel/aws/redshift.py +9 -4
  12. cartography/intel/aws/resources.py +2 -0
  13. cartography/intel/aws/route53.py +53 -3
  14. cartography/intel/aws/securityhub.py +3 -1
  15. cartography/intel/azure/__init__.py +16 -0
  16. cartography/intel/azure/logic_apps.py +101 -0
  17. cartography/intel/azure/resource_groups.py +82 -0
  18. cartography/intel/create_indexes.py +2 -1
  19. cartography/intel/dns.py +5 -2
  20. cartography/intel/gcp/dns.py +2 -1
  21. cartography/intel/github/repos.py +3 -6
  22. cartography/intel/gsuite/api.py +17 -4
  23. cartography/intel/okta/applications.py +9 -4
  24. cartography/intel/okta/awssaml.py +5 -2
  25. cartography/intel/okta/factors.py +3 -1
  26. cartography/intel/okta/groups.py +5 -2
  27. cartography/intel/okta/organization.py +3 -1
  28. cartography/intel/okta/origins.py +3 -1
  29. cartography/intel/okta/roles.py +5 -2
  30. cartography/intel/okta/users.py +3 -1
  31. cartography/models/aws/ecr/image.py +21 -0
  32. cartography/models/aws/ecr/image_layer.py +107 -0
  33. cartography/models/aws/identitycenter/awspermissionset.py +24 -1
  34. cartography/models/aws/identitycenter/awssogroup.py +70 -0
  35. cartography/models/aws/identitycenter/awsssouser.py +37 -1
  36. cartography/models/aws/lambda_function/lambda_function.py +2 -0
  37. cartography/models/azure/logic_apps.py +56 -0
  38. cartography/models/azure/resource_groups.py +52 -0
  39. cartography/models/entra/user.py +18 -0
  40. cartography/rules/README.md +1 -0
  41. cartography/rules/__init__.py +0 -0
  42. cartography/rules/cli.py +342 -0
  43. cartography/rules/data/__init__.py +0 -0
  44. cartography/rules/data/frameworks/__init__.py +12 -0
  45. cartography/rules/data/frameworks/mitre_attack/__init__.py +14 -0
  46. cartography/rules/data/frameworks/mitre_attack/requirements/__init__.py +0 -0
  47. cartography/rules/data/frameworks/mitre_attack/requirements/t1190_exploit_public_facing_application/__init__.py +135 -0
  48. cartography/rules/formatters.py +46 -0
  49. cartography/rules/runners.py +338 -0
  50. cartography/rules/spec/__init__.py +0 -0
  51. cartography/rules/spec/model.py +88 -0
  52. cartography/rules/spec/result.py +46 -0
  53. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/METADATA +19 -4
  54. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/RECORD +58 -38
  55. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/entry_points.txt +1 -0
  56. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/WHEEL +0 -0
  57. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/licenses/LICENSE +0 -0
  58. {cartography-0.114.0.dist-info → cartography-0.116.0.dist-info}/top_level.txt +0 -0
cartography/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.114.0'
32
- __version_tuple__ = version_tuple = (0, 114, 0)
31
+ __version__ = version = '0.116.0'
32
+ __version_tuple__ = version_tuple = (0, 116, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
cartography/cli.py CHANGED
@@ -967,8 +967,8 @@ class CLI:
967
967
  logger.warning("A Kandji base URI was provided but a token was not.")
968
968
  config.kandji_token = None
969
969
  else:
970
- logger.warning("A Kandji base URI was not provided.")
971
970
  config.kandji_base_uri = None
971
+ config.kandji_token = None
972
972
 
973
973
  if config.statsd_enabled:
974
974
  logger.debug(
@@ -1096,8 +1096,8 @@ class CLI:
1096
1096
  logger.warning("A SnipeIT base URI was provided but a token was not.")
1097
1097
  config.snipeit_token = None
1098
1098
  else:
1099
- logger.warning("A SnipeIT base URI was not provided.")
1100
1099
  config.snipeit_base_uri = None
1100
+ config.snipeit_token = None
1101
1101
 
1102
1102
  # Tailscale config
1103
1103
  if config.tailscale_token_env_var:
@@ -19,6 +19,17 @@ from cartography.util import batch
19
19
  logger = logging.getLogger(__name__)
20
20
 
21
21
 
22
+ def run_write_query(
23
+ neo4j_session: neo4j.Session, query: str, **parameters: Any
24
+ ) -> None:
25
+ """Execute a write query inside a managed transaction."""
26
+
27
+ def _run_query_tx(tx: neo4j.Transaction) -> None:
28
+ tx.run(query, **parameters).consume()
29
+
30
+ neo4j_session.execute_write(_run_query_tx)
31
+
32
+
22
33
  def read_list_of_values_tx(
23
34
  tx: neo4j.Transaction,
24
35
  query: str,
@@ -31,7 +42,7 @@ def read_list_of_values_tx(
31
42
  Example usage:
32
43
  query = "MATCH (a:TestNode) RETURN a.name ORDER BY a.name"
33
44
 
34
- values = neo4j_session.read_transaction(read_list_of_values_tx, query)
45
+ values = neo4j_session.execute_read(read_list_of_values_tx, query)
35
46
 
36
47
  :param tx: A neo4j read transaction object
37
48
  :param query: A neo4j query string that returns a list of single values. For example,
@@ -5,6 +5,7 @@ from typing import List
5
5
  import boto3
6
6
  import neo4j
7
7
 
8
+ from cartography.client.core.tx import run_write_query
8
9
  from cartography.util import aws_handle_regions
9
10
  from cartography.util import run_cleanup_job
10
11
  from cartography.util import timeit
@@ -80,7 +81,8 @@ def load_configuration_recorders(
80
81
  for recorder in data:
81
82
  recorder["_id"] = f'{recorder["name"]}:{current_aws_account_id}:{region}'
82
83
 
83
- neo4j_session.run(
84
+ run_write_query(
85
+ neo4j_session,
84
86
  ingest_configuration_recorders,
85
87
  Recorders=data,
86
88
  Region=region,
@@ -120,7 +122,8 @@ def load_delivery_channels(
120
122
  for channel in data:
121
123
  channel["_id"] = f'{channel["name"]}:{current_aws_account_id}:{region}'
122
124
 
123
- neo4j_session.run(
125
+ run_write_query(
126
+ neo4j_session,
124
127
  ingest_delivery_channels,
125
128
  Channels=data,
126
129
  Region=region,
@@ -167,7 +170,8 @@ def load_config_rules(
167
170
  for detail in rule["Source"]["SourceDetails"]:
168
171
  details.append(f"{detail}")
169
172
  rule["_source_details"] = details
170
- neo4j_session.run(
173
+ run_write_query(
174
+ neo4j_session,
171
175
  ingest_config_rules,
172
176
  Rules=data,
173
177
  Region=region,
@@ -57,15 +57,15 @@ def get_ecr_repository_images(
57
57
  )
58
58
  for response in describe_response:
59
59
  image_details = response["imageDetails"]
60
- image_details = [
61
- (
62
- {**detail, "imageTag": detail["imageTags"][0]}
63
- if detail.get("imageTags")
64
- else detail
65
- )
66
- for detail in image_details
67
- ]
68
- ecr_repository_images.extend(image_details)
60
+ for detail in image_details:
61
+ tags = detail.get("imageTags") or []
62
+ if tags:
63
+ for tag in tags:
64
+ image_detail = {**detail, "imageTag": tag}
65
+ image_detail.pop("imageTags", None)
66
+ ecr_repository_images.append(image_detail)
67
+ else:
68
+ ecr_repository_images.append({**detail})
69
69
  return ecr_repository_images
70
70
 
71
71