cartography 0.94.0rc2__py3-none-any.whl → 0.95.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 (34) hide show
  1. cartography/cli.py +42 -24
  2. cartography/config.py +12 -8
  3. cartography/data/indexes.cypher +0 -2
  4. cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json +13 -13
  5. cartography/driftdetect/cli.py +1 -1
  6. cartography/graph/job.py +8 -1
  7. cartography/intel/aws/permission_relationships.py +6 -2
  8. cartography/intel/gcp/__init__.py +110 -23
  9. cartography/intel/kandji/__init__.py +1 -1
  10. cartography/intel/semgrep/__init__.py +9 -2
  11. cartography/intel/semgrep/dependencies.py +201 -0
  12. cartography/intel/semgrep/deployment.py +67 -0
  13. cartography/intel/semgrep/findings.py +126 -110
  14. cartography/intel/snipeit/__init__.py +30 -0
  15. cartography/intel/snipeit/asset.py +74 -0
  16. cartography/intel/snipeit/user.py +75 -0
  17. cartography/intel/snipeit/util.py +35 -0
  18. cartography/models/semgrep/dependencies.py +77 -0
  19. cartography/models/semgrep/findings.py +3 -1
  20. cartography/models/snipeit/__init__.py +0 -0
  21. cartography/models/snipeit/asset.py +81 -0
  22. cartography/models/snipeit/tenant.py +17 -0
  23. cartography/models/snipeit/user.py +49 -0
  24. cartography/sync.py +2 -2
  25. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/LICENSE +1 -1
  26. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/METADATA +3 -5
  27. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/RECORD +30 -23
  28. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/WHEEL +1 -1
  29. cartography/data/jobs/cleanup/crxcavator_import_cleanup.json +0 -18
  30. cartography/intel/crxcavator/__init__.py +0 -44
  31. cartography/intel/crxcavator/crxcavator.py +0 -329
  32. cartography-0.94.0rc2.dist-info/NOTICE +0 -4
  33. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/entry_points.txt +0 -0
  34. {cartography-0.94.0rc2.dist-info → cartography-0.95.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,74 @@
1
+ import logging
2
+ from typing import Any
3
+ from typing import Dict
4
+ from typing import List
5
+
6
+ import neo4j
7
+
8
+ from .util import call_snipeit_api
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.snipeit.asset import SnipeitAssetSchema
12
+ from cartography.models.snipeit.tenant import SnipeitTenantSchema
13
+ from cartography.util import timeit
14
+
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ @timeit
20
+ def get(base_uri: str, token: str) -> List[Dict]:
21
+ api_endpoint = "/api/v1/hardware"
22
+ results: List[Dict[str, Any]] = []
23
+ while True:
24
+ offset = len(results)
25
+ api_endpoint = f"{api_endpoint}?order='asc'&offset={offset}"
26
+ response = call_snipeit_api(api_endpoint, base_uri, token)
27
+ results.extend(response['rows'])
28
+
29
+ total = response['total']
30
+ results_count = len(results)
31
+ if results_count >= total:
32
+ break
33
+
34
+ return results
35
+
36
+
37
+ @timeit
38
+ def load_assets(
39
+ neo4j_session: neo4j.Session,
40
+ common_job_parameters: Dict,
41
+ data: List[Dict[str, Any]],
42
+ ) -> None:
43
+ # Create the SnipeIT Tenant
44
+ load(
45
+ neo4j_session,
46
+ SnipeitTenantSchema(),
47
+ [{'id': common_job_parameters["TENANT_ID"]}],
48
+ lastupdated=common_job_parameters["UPDATE_TAG"],
49
+ )
50
+
51
+ load(
52
+ neo4j_session,
53
+ SnipeitAssetSchema(),
54
+ data,
55
+ lastupdated=common_job_parameters["UPDATE_TAG"],
56
+ TENANT_ID=common_job_parameters["TENANT_ID"],
57
+ )
58
+
59
+
60
+ @timeit
61
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
62
+ GraphJob.from_node_schema(SnipeitAssetSchema(), common_job_parameters).run(neo4j_session)
63
+
64
+
65
+ @timeit
66
+ def sync(
67
+ neo4j_session: neo4j.Session,
68
+ common_job_parameters: Dict,
69
+ base_uri: str,
70
+ token: str,
71
+ ) -> None:
72
+ assets = get(base_uri=base_uri, token=token)
73
+ load_assets(neo4j_session=neo4j_session, common_job_parameters=common_job_parameters, data=assets)
74
+ cleanup(neo4j_session, common_job_parameters)
@@ -0,0 +1,75 @@
1
+ import logging
2
+ from typing import Any
3
+ from typing import Dict
4
+ from typing import List
5
+
6
+ import neo4j
7
+
8
+ from .util import call_snipeit_api
9
+ from cartography.client.core.tx import load
10
+ from cartography.graph.job import GraphJob
11
+ from cartography.models.snipeit.tenant import SnipeitTenantSchema
12
+ from cartography.models.snipeit.user import SnipeitUserSchema
13
+ from cartography.util import timeit
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ @timeit
19
+ def get(base_uri: str, token: str) -> List[Dict]:
20
+ api_endpoint = "/api/v1/users"
21
+ results: List[Dict[str, Any]] = []
22
+ while True:
23
+ offset = len(results)
24
+ api_endpoint = f"{api_endpoint}?order='asc'&offset={offset}"
25
+ response = call_snipeit_api(api_endpoint, base_uri, token)
26
+ results.extend(response['rows'])
27
+
28
+ total = response['total']
29
+ results_count = len(results)
30
+ if results_count >= total:
31
+ break
32
+
33
+ return results
34
+
35
+
36
+ @timeit
37
+ def load_users(
38
+ neo4j_session: neo4j.Session,
39
+ common_job_parameters: Dict,
40
+ data: List[Dict[str, Any]],
41
+ ) -> None:
42
+ logger.debug(data[0])
43
+
44
+ # Create the SnipeIT Tenant
45
+ load(
46
+ neo4j_session,
47
+ SnipeitTenantSchema(),
48
+ [{'id': common_job_parameters["TENANT_ID"]}],
49
+ lastupdated=common_job_parameters["UPDATE_TAG"],
50
+ )
51
+
52
+ load(
53
+ neo4j_session,
54
+ SnipeitUserSchema(),
55
+ data,
56
+ lastupdated=common_job_parameters["UPDATE_TAG"],
57
+ TENANT_ID=common_job_parameters["TENANT_ID"],
58
+ )
59
+
60
+
61
+ @timeit
62
+ def cleanup(neo4j_session: neo4j.Session, common_job_parameters: Dict) -> None:
63
+ GraphJob.from_node_schema(SnipeitUserSchema(), common_job_parameters).run(neo4j_session)
64
+
65
+
66
+ @timeit
67
+ def sync(
68
+ neo4j_session: neo4j.Session,
69
+ common_job_parameters: Dict,
70
+ base_uri: str,
71
+ token: str,
72
+ ) -> None:
73
+ users = get(base_uri=base_uri, token=token)
74
+ load_users(neo4j_session, common_job_parameters, users)
75
+ cleanup(neo4j_session, common_job_parameters)
@@ -0,0 +1,35 @@
1
+ import logging
2
+ from typing import Any
3
+ from typing import Dict
4
+
5
+ import requests
6
+
7
+ from cartography.util import timeit
8
+
9
+ logger = logging.getLogger(__name__)
10
+ # Connect and read timeouts of 60 seconds each; see https://requests.readthedocs.io/en/master/user/advanced/#timeouts
11
+ _TIMEOUT = (60, 60)
12
+
13
+
14
+ @timeit
15
+ def call_snipeit_api(api_and_parameters: str, base_uri: str, token: str) -> Dict[str, Any]:
16
+ uri = base_uri + api_and_parameters
17
+ try:
18
+ logger.debug(
19
+ "SnipeIT: Get %s", uri,
20
+ )
21
+ response = requests.get(
22
+ uri,
23
+ headers={
24
+ 'Accept': 'application/json',
25
+ 'Authorization': f'Bearer {token}',
26
+ },
27
+ timeout=_TIMEOUT,
28
+ )
29
+ except requests.exceptions.Timeout:
30
+ # Add context and re-raise for callers to handle
31
+ logger.warning(f"SnipeIT: requests.get('{uri}') timed out.")
32
+ raise
33
+ # if call failed, use requests library to raise an exception
34
+ response.raise_for_status()
35
+ return response.json()
@@ -0,0 +1,77 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from cartography.models.core.common import PropertyRef
5
+ from cartography.models.core.nodes import CartographyNodeProperties
6
+ from cartography.models.core.nodes import CartographyNodeSchema
7
+ from cartography.models.core.nodes import ExtraNodeLabels
8
+ from cartography.models.core.relationships import CartographyRelProperties
9
+ from cartography.models.core.relationships import CartographyRelSchema
10
+ from cartography.models.core.relationships import LinkDirection
11
+ from cartography.models.core.relationships import make_target_node_matcher
12
+ from cartography.models.core.relationships import OtherRelationships
13
+ from cartography.models.core.relationships import TargetNodeMatcher
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class SemgrepDependencyNodeProperties(CartographyNodeProperties):
18
+ id: PropertyRef = PropertyRef('id')
19
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
20
+ name: PropertyRef = PropertyRef('name')
21
+ ecosystem: PropertyRef = PropertyRef('ecosystem')
22
+ version: PropertyRef = PropertyRef('version')
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class SemgrepDependencyToSemgrepDeploymentRelProperties(CartographyRelProperties):
27
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
28
+
29
+
30
+ @dataclass(frozen=True)
31
+ # (:SemgrepDependency)<-[:RESOURCE]-(:SemgrepDeployment)
32
+ class SemgrepDependencyToSemgrepDeploymentSchema(CartographyRelSchema):
33
+ target_node_label: str = 'SemgrepDeployment'
34
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
35
+ {'id': PropertyRef('DEPLOYMENT_ID', set_in_kwargs=True)},
36
+ )
37
+ direction: LinkDirection = LinkDirection.INWARD
38
+ rel_label: str = "RESOURCE"
39
+ properties: SemgrepDependencyToSemgrepDeploymentRelProperties = SemgrepDependencyToSemgrepDeploymentRelProperties()
40
+
41
+
42
+ @dataclass(frozen=True)
43
+ class SemgrepDependencyToGithubRepoRelProperties(CartographyRelProperties):
44
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
45
+ specifier: PropertyRef = PropertyRef('specifier')
46
+ transitivity: PropertyRef = PropertyRef('transitivity')
47
+ url: PropertyRef = PropertyRef('url')
48
+
49
+
50
+ @dataclass(frozen=True)
51
+ # (:SemgrepDependency)<-[:REQUIRES]-(:GitHubRepository)
52
+ class SemgrepDependencyToGithubRepoRel(CartographyRelSchema):
53
+ target_node_label: str = 'GitHubRepository'
54
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
55
+ {'id': PropertyRef('repo_url')},
56
+ )
57
+ direction: LinkDirection = LinkDirection.INWARD
58
+ rel_label: str = "REQUIRES"
59
+ properties: SemgrepDependencyToGithubRepoRelProperties = SemgrepDependencyToGithubRepoRelProperties()
60
+
61
+
62
+ @dataclass(frozen=True)
63
+ class SemgrepSCAFindngToDependencyRelProperties(CartographyRelProperties):
64
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
65
+
66
+
67
+ @dataclass(frozen=True)
68
+ class SemgrepGoLibrarySchema(CartographyNodeSchema):
69
+ label: str = 'GoLibrary'
70
+ extra_node_labels: Optional[ExtraNodeLabels] = ExtraNodeLabels(['Dependency', 'SemgrepDependency'])
71
+ properties: SemgrepDependencyNodeProperties = SemgrepDependencyNodeProperties()
72
+ sub_resource_relationship: SemgrepDependencyToSemgrepDeploymentSchema = SemgrepDependencyToSemgrepDeploymentSchema()
73
+ other_relationships: OtherRelationships = OtherRelationships(
74
+ [
75
+ SemgrepDependencyToGithubRepoRel(),
76
+ ],
77
+ )
@@ -17,6 +17,7 @@ class SemgrepSCAFindingNodeProperties(CartographyNodeProperties):
17
17
  lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
18
18
  rule_id: PropertyRef = PropertyRef('ruleId', extra_index=True)
19
19
  repository: PropertyRef = PropertyRef('repositoryName', extra_index=True)
20
+ branch: PropertyRef = PropertyRef('branch')
20
21
  summary: PropertyRef = PropertyRef('title', extra_index=True)
21
22
  description: PropertyRef = PropertyRef('description')
22
23
  package_manager: PropertyRef = PropertyRef('ecosystem')
@@ -32,8 +33,9 @@ class SemgrepSCAFindingNodeProperties(CartographyNodeProperties):
32
33
  dependency_file: PropertyRef = PropertyRef('dependencyFileLocation_path', extra_index=True)
33
34
  dependency_file_url: PropertyRef = PropertyRef('dependencyFileLocation_url', extra_index=True)
34
35
  scan_time: PropertyRef = PropertyRef('openedAt')
35
- published_time: PropertyRef = PropertyRef('announcedAt')
36
36
  fix_status: PropertyRef = PropertyRef('fixStatus')
37
+ triage_status: PropertyRef = PropertyRef('triageStatus')
38
+ confidence: PropertyRef = PropertyRef('confidence')
37
39
 
38
40
 
39
41
  @dataclass(frozen=True)
File without changes
@@ -0,0 +1,81 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import OtherRelationships
11
+ from cartography.models.core.relationships import TargetNodeMatcher
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class SnipeitAssetNodeProperties(CartographyNodeProperties):
16
+ """
17
+ https://snipe-it.readme.io/reference/hardware-list
18
+ """
19
+ # Common properties
20
+ id: PropertyRef = PropertyRef('id')
21
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
22
+
23
+ # SnipeIT specific properties
24
+ asset_tag: PropertyRef = PropertyRef('asset_tag')
25
+ assigned_to: PropertyRef = PropertyRef('assigned_to.email')
26
+ category: PropertyRef = PropertyRef('category.name')
27
+ company: PropertyRef = PropertyRef('company.name')
28
+ manufacturer: PropertyRef = PropertyRef('manufacturer.name')
29
+ model: PropertyRef = PropertyRef('model.name')
30
+ serial: PropertyRef = PropertyRef('serial', extra_index=True)
31
+
32
+
33
+ ###
34
+ # (:SnipeitAsset)<-[:ASSET]-(:SnipeitTenant)
35
+ ###
36
+ @dataclass(frozen=True)
37
+ class SnipeitTenantToSnipeitAssetRelProperties(CartographyRelProperties):
38
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
39
+
40
+
41
+ @dataclass(frozen=True)
42
+ class SnipeitTenantToSnipeitAssetRel(CartographyRelSchema):
43
+ target_node_label: str = 'SnipeitTenant'
44
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
45
+ {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
46
+ )
47
+ direction: LinkDirection = LinkDirection.INWARD
48
+ rel_label: str = "HAS_ASSET"
49
+ properties: SnipeitTenantToSnipeitAssetRelProperties = SnipeitTenantToSnipeitAssetRelProperties()
50
+
51
+
52
+ ###
53
+ # (:SnipeitUser)-[:HAS_CHECKED_OUT]->(:SnipeitAsset)
54
+ ###
55
+ @dataclass(frozen=True)
56
+ class SnipeitUserToSnipeitAssetProperties(CartographyRelProperties):
57
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
58
+
59
+
60
+ @dataclass(frozen=True)
61
+ class SnipeitUserToSnipeitAssetRel(CartographyRelSchema):
62
+ target_node_label: str = 'SnipeitUser'
63
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
64
+ {'email': PropertyRef('assigned_to.email')},
65
+ )
66
+ direction: LinkDirection = LinkDirection.INWARD
67
+ rel_label: str = "HAS_CHECKED_OUT"
68
+ properties: SnipeitUserToSnipeitAssetProperties = SnipeitUserToSnipeitAssetProperties()
69
+
70
+
71
+ ###
72
+ @dataclass(frozen=True)
73
+ class SnipeitAssetSchema(CartographyNodeSchema):
74
+ label: str = 'SnipeitAsset' # The label of the node
75
+ properties: SnipeitAssetNodeProperties = SnipeitAssetNodeProperties() # An object representing all properties
76
+ sub_resource_relationship: SnipeitTenantToSnipeitAssetRel = SnipeitTenantToSnipeitAssetRel()
77
+ other_relationships: OtherRelationships = OtherRelationships(
78
+ [
79
+ SnipeitUserToSnipeitAssetRel(),
80
+ ],
81
+ )
@@ -0,0 +1,17 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+
7
+
8
+ @dataclass(frozen=True)
9
+ class SnipeitTenantNodeProperties(CartographyNodeProperties):
10
+ id: PropertyRef = PropertyRef('id')
11
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class SnipeitTenantSchema(CartographyNodeSchema):
16
+ label: str = 'SnipeitTenant' # The label of the node
17
+ properties: SnipeitTenantNodeProperties = SnipeitTenantNodeProperties() # An object representing all properties
@@ -0,0 +1,49 @@
1
+ from dataclasses import dataclass
2
+
3
+ from cartography.models.core.common import PropertyRef
4
+ from cartography.models.core.nodes import CartographyNodeProperties
5
+ from cartography.models.core.nodes import CartographyNodeSchema
6
+ from cartography.models.core.relationships import CartographyRelProperties
7
+ from cartography.models.core.relationships import CartographyRelSchema
8
+ from cartography.models.core.relationships import LinkDirection
9
+ from cartography.models.core.relationships import make_target_node_matcher
10
+ from cartography.models.core.relationships import TargetNodeMatcher
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class SnipeitUserNodeProperties(CartographyNodeProperties):
15
+ """
16
+ Ref: https://snipe-it.readme.io/reference/users
17
+ """
18
+ # Common properties
19
+ id: PropertyRef = PropertyRef('id')
20
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
21
+
22
+ # SnipeIT specific properties
23
+ company: PropertyRef = PropertyRef('company_id.name', extra_index=True)
24
+ email: PropertyRef = PropertyRef('email', extra_index=True)
25
+ username: PropertyRef = PropertyRef('username')
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class SnipeitTenantToSnipeitUserRelProperties(CartographyRelProperties):
30
+ lastupdated: PropertyRef = PropertyRef('lastupdated', set_in_kwargs=True)
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ # (:SnipeitTenant)-[:HAS_USER]->(:SnipeitUser)
35
+ class SnipeitTenantToSnipeitUserRel(CartographyRelSchema):
36
+ target_node_label: str = 'SnipeitTenant'
37
+ target_node_matcher: TargetNodeMatcher = make_target_node_matcher(
38
+ {'id': PropertyRef('TENANT_ID', set_in_kwargs=True)},
39
+ )
40
+ direction: LinkDirection = LinkDirection.INWARD
41
+ rel_label: str = "HAS_USER"
42
+ properties: SnipeitTenantToSnipeitUserRelProperties = SnipeitTenantToSnipeitUserRelProperties()
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class SnipeitUserSchema(CartographyNodeSchema):
47
+ label: str = 'SnipeitUser' # The label of the node
48
+ properties: SnipeitUserNodeProperties = SnipeitUserNodeProperties() # An object representing all properties
49
+ sub_resource_relationship: SnipeitTenantToSnipeitUserRel = SnipeitTenantToSnipeitUserRel()
cartography/sync.py CHANGED
@@ -17,7 +17,6 @@ import cartography.intel.azure
17
17
  import cartography.intel.bigfix
18
18
  import cartography.intel.create_indexes
19
19
  import cartography.intel.crowdstrike
20
- import cartography.intel.crxcavator.crxcavator
21
20
  import cartography.intel.cve
22
21
  import cartography.intel.digitalocean
23
22
  import cartography.intel.duo
@@ -30,6 +29,7 @@ import cartography.intel.lastpass
30
29
  import cartography.intel.oci
31
30
  import cartography.intel.okta
32
31
  import cartography.intel.semgrep
32
+ import cartography.intel.snipeit
33
33
  from cartography.config import Config
34
34
  from cartography.stats import set_stats_client
35
35
  from cartography.util import STATUS_FAILURE
@@ -45,7 +45,6 @@ TOP_LEVEL_MODULES = OrderedDict({ # preserve order so that the default sync alw
45
45
  'crowdstrike': cartography.intel.crowdstrike.start_crowdstrike_ingestion,
46
46
  'gcp': cartography.intel.gcp.start_gcp_ingestion,
47
47
  'gsuite': cartography.intel.gsuite.start_gsuite_ingestion,
48
- 'crxcavator': cartography.intel.crxcavator.start_extension_ingestion,
49
48
  'cve': cartography.intel.cve.start_cve_ingestion,
50
49
  'oci': cartography.intel.oci.start_oci_ingestion,
51
50
  'okta': cartography.intel.okta.start_okta_ingestion,
@@ -57,6 +56,7 @@ TOP_LEVEL_MODULES = OrderedDict({ # preserve order so that the default sync alw
57
56
  'bigfix': cartography.intel.bigfix.start_bigfix_ingestion,
58
57
  'duo': cartography.intel.duo.start_duo_ingestion,
59
58
  'semgrep': cartography.intel.semgrep.start_semgrep_ingestion,
59
+ 'snipeit': cartography.intel.snipeit.start_snipeit_ingestion,
60
60
  'analysis': cartography.intel.analysis.run,
61
61
  })
62
62
 
@@ -187,7 +187,7 @@
187
187
  same "printed page" as the copyright notice for easier
188
188
  identification within third-party archives.
189
189
 
190
- Copyright 2019 Lyft, Inc.
190
+ Copyright 2024 The Linux Foundation
191
191
 
192
192
  Licensed under the Apache License, Version 2.0 (the "License");
193
193
  you may not use this file except in compliance with the License.
@@ -1,10 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartography
3
- Version: 0.94.0rc2
3
+ Version: 0.95.0
4
4
  Summary: Explore assets and their relationships across your technical infrastructure.
5
- Home-page: https://www.github.com/lyft/cartography
6
- Maintainer: Lyft
7
- Maintainer-email: security@lyft.com
5
+ Home-page: https://www.github.com/cartography-cncf/cartography
6
+ Maintainer: Cartography Contributors
8
7
  License: apache2
9
8
  Classifier: Development Status :: 4 - Beta
10
9
  Classifier: Intended Audience :: Developers
@@ -18,7 +17,6 @@ Classifier: Topic :: Software Development :: Libraries
18
17
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
18
  Description-Content-Type: text/markdown
20
19
  License-File: LICENSE
21
- License-File: NOTICE
22
20
  Requires-Dist: backoff >=2.1.2
23
21
  Requires-Dist: boto3 >=1.15.1
24
22
  Requires-Dist: botocore >=1.18.1
@@ -1,10 +1,10 @@
1
1
  cartography/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  cartography/__main__.py,sha256=JftXT_nUPkqcEh8uxCCT4n-OyHYqbldEgrDS-4ygy0U,101
3
- cartography/cli.py,sha256=ot9_gMxw5_irVS7KYfWf5HIr2Xkb10RDEbOTY1nzUcw,31787
4
- cartography/config.py,sha256=rL1zgxZO47_R7S6E9e0CwxmhzRSN0X_q93NtcPR1G00,11368
3
+ cartography/cli.py,sha256=tfIPOMh3DtQG7Dgmg9rNNqoTcxgocBu45k88CAM09Nk,32368
4
+ cartography/config.py,sha256=QbFqwUb6P8-wdkf4ljE5HJhduXl_3Gt2xzBQRayq0sg,11566
5
5
  cartography/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  cartography/stats.py,sha256=dbybb9V2FuvSuHjjNwz6Vjwnd1hap2C7h960rLoKcl8,4406
7
- cartography/sync.py,sha256=a80r_IzrZcWGSmRDRrxkesNYPiOuLte5YHvDQT3L-Lw,9730
7
+ cartography/sync.py,sha256=ziD63T_774gXSuD5zdz6fLGvv1Kt2ntQySSVbmcCZb8,9708
8
8
  cartography/util.py,sha256=umfnjX8jVLu0rpYA75X-WvRpYzHQxns9qZiPwfyAlwQ,14478
9
9
  cartography/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  cartography/client/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -12,7 +12,7 @@ cartography/client/aws/iam.py,sha256=dYsGikc36DEsSeR2XVOVFFUDwuU9yWj_EVkpgVYCFgM
12
12
  cartography/client/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  cartography/client/core/tx.py,sha256=4_kTBxrtlwsOM-e8Xtjf7wmmzwZ-DGRJL0rPFp0Xj0Q,10805
14
14
  cartography/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- cartography/data/indexes.cypher,sha256=PTQEUbC_Kmjj_wM-j6NJqLvETRIORreeqF6WlKmnHKg,27395
15
+ cartography/data/indexes.cypher,sha256=Ha8VemktSz8ikIS4On-8FTiv2-WwRx5j3l02gQnSWXk,27262
16
16
  cartography/data/permission_relationships.yaml,sha256=RuKGGc_3ZUQ7ag0MssB8k_zaonCkVM5E8I_svBWTmGc,969
17
17
  cartography/data/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  cartography/data/jobs/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -88,7 +88,6 @@ cartography/data/jobs/cleanup/azure_storage_account_cleanup.json,sha256=XZdjKDOj
88
88
  cartography/data/jobs/cleanup/azure_subscriptions_cleanup.json,sha256=bowUBCjHYlC4Xd60lv33sxRi-bv1wiT5gAOStaHMX4k,430
89
89
  cartography/data/jobs/cleanup/azure_tenant_cleanup.json,sha256=jcjmZH6kfVGZ9q68rfvnroF0kNNHZ2uTZQ17Rmd4FH0,220
90
90
  cartography/data/jobs/cleanup/crowdstrike_import_cleanup.json,sha256=bBPwftvz1iMUKrqKFCFZEH3LgVRzg-t5fRUh6Chx-vo,1426
91
- cartography/data/jobs/cleanup/crxcavator_import_cleanup.json,sha256=IvGVD_lRR-0nEPorq3vhVKmO2R1bKBpivujJIxVo3hE,607
92
91
  cartography/data/jobs/cleanup/digitalocean_droplet_cleanup.json,sha256=f26TdPUPYnIp45ipPys5M6VVfConUZySIbkgSr3iQno,703
93
92
  cartography/data/jobs/cleanup/digitalocean_project_cleanup.json,sha256=5mo9vPshCdUZfgTWd_22_TLSyfe6hd41u7z-B8H1qgY,702
94
93
  cartography/data/jobs/cleanup/gcp_compute_firewall_cleanup.json,sha256=FVNJ8EPaPhmQ_sh4vyTdMyEgs6Y-DIoFTdWJaELgz44,1904
@@ -118,11 +117,11 @@ cartography/data/jobs/cleanup/okta_groups_cleanup.json,sha256=cBI3f_okl4pnVH48L1
118
117
  cartography/data/jobs/cleanup/okta_import_cleanup.json,sha256=4XQwYpY9vITLhnLpijMVa5PxO0Tm38CcMydnbPdQPm0,3798
119
118
  cartography/data/jobs/cleanup/pagerduty_import_cleanup.json,sha256=RJqG_Uw_QEGTer_-s2IuZ3a2kykhUcCdDNZu0S7SEB4,4457
120
119
  cartography/data/jobs/scoped_analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json,sha256=Nlx4xRISmn_RQjVoRO1qAc2KtkiGy8i4mUB1NBPjCVc,6451
120
+ cartography/data/jobs/scoped_analysis/semgrep_sca_risk_analysis.json,sha256=eIYxbl5TdgVzN8En2JozWoyKAiIh3Dp8wUMkTDPGZY0,6485
122
121
  cartography/driftdetect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
122
  cartography/driftdetect/__main__.py,sha256=Sz24Kxy5x6RC3GQEkuUDXzjOV3SvlHVkZdvPl1GLl5E,125
124
123
  cartography/driftdetect/add_shortcut.py,sha256=COtcCW9T0ss-bP1B2y9gEk3kN6HA01kkurSiDBNLzco,2377
125
- cartography/driftdetect/cli.py,sha256=0Du2lMSHs6TySrUfTk5TLc2lw1d85kyy93WCJIFqZ-8,9170
124
+ cartography/driftdetect/cli.py,sha256=SiNTsVtxCyMUoTzjCMkSUQ-TYPceGoZ67hp8eejp71k,9172
126
125
  cartography/driftdetect/config.py,sha256=wHx1RmKRU3fJ9xD8Nf62uIFGOoaohgyqrFIAy-Fc_xM,2974
127
126
  cartography/driftdetect/detect_deviations.py,sha256=pfNce5VWfs_oNNI2-PFgOAOzZ8YPprrE7LxdBo27kqU,4349
128
127
  cartography/driftdetect/get_states.py,sha256=iAAoIqItZx-dHV9OmWIhHy0YjhHA1AH8DGtUwp6YO1c,5965
@@ -135,7 +134,7 @@ cartography/driftdetect/util.py,sha256=Lqxv8QoFn3_3Fz18qCOjkjJ6yBwgrHjrxXmArBAEd
135
134
  cartography/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
135
  cartography/graph/cleanupbuilder.py,sha256=87vFrOJo66hOrrqeNwXp18WrNQEheHTlZko9KUkXWhY,8021
137
136
  cartography/graph/context.py,sha256=RGxGb8EnxowcqjR0nFF86baNhgRHeUF9wjIoFUoG8LU,1230
138
- cartography/graph/job.py,sha256=VBKc0VLbDz1zm5jslF49nbPbQS7DkdQwfPG7rdLSc1w,7288
137
+ cartography/graph/job.py,sha256=RZWsbNhHuJlcSpw4C73ZuovRTp7kGrcm3X9yUH8vT1Q,7488
139
138
  cartography/graph/querybuilder.py,sha256=MMXzUEg4td-YmHMNM97KAqDZ6-1wNClO2jmJoG47BTY,20108
140
139
  cartography/graph/statement.py,sha256=VsqG46ty_Mm87fr8YdIwfr6a82OUXU7yZe6S-Py9hZg,5345
141
140
  cartography/intel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -157,7 +156,7 @@ cartography/intel/aws/inspector.py,sha256=S22ZgRKEnmnBTJ-u0rodqRPB7_LkSIek47NeBx
157
156
  cartography/intel/aws/kms.py,sha256=bZUzMxAH_DsAcGTJBs08gg2tLKYu-QWjvMvV9C-6v50,11731
158
157
  cartography/intel/aws/lambda_function.py,sha256=KKTyn53xpaMI9WvIqxmsOASFwflHt-2_5ow-zUFc2wg,9890
159
158
  cartography/intel/aws/organizations.py,sha256=HaQZ3J5XF15BuykuDypqFORDYpnoHuRRr4DuceewH4s,4485
160
- cartography/intel/aws/permission_relationships.py,sha256=PhOnag0a1gZHtUg82546MKhj-8IcGJ7wLbvPASUBXlg,14792
159
+ cartography/intel/aws/permission_relationships.py,sha256=IarV9gt5BaplZ5TPo_mfypt9bTKfT9qDtqC3Ob89qGI,14904
161
160
  cartography/intel/aws/rds.py,sha256=vnlNYmrO2Cc0PNn31CeG2QwYhwjVosbQFE9Ol1vQyLE,25252
162
161
  cartography/intel/aws/redshift.py,sha256=KOqiXIllHmtPTeaNGl-cX4srY5pFE6o12j8MQ5-zWpc,6694
163
162
  cartography/intel/aws/resourcegroupstaggingapi.py,sha256=aq4kPF6t8QZZoTxdkQVLXH65Di41CDJVM9llJNe6iaY,10278
@@ -206,8 +205,6 @@ cartography/intel/crowdstrike/__init__.py,sha256=dAtgI-0vZAQZ3cTFQhMEzzt7aqiNSNu
206
205
  cartography/intel/crowdstrike/endpoints.py,sha256=tdqokMDW3p4fK3dHKKb2T1DTogvOJBCpwyrxdQlbUhw,3815
207
206
  cartography/intel/crowdstrike/spotlight.py,sha256=yNhj44-RYF6ubck-hHMKhKiNU0fCfhQf4Oagopc31EM,4754
208
207
  cartography/intel/crowdstrike/util.py,sha256=gfJ6Ptr6YdbBS9Qj9a_-Jc-IJroADDRcXqjh5TW0qXE,277
209
- cartography/intel/crxcavator/__init__.py,sha256=VM6N_7dMagzuQQjUeFgqrt2_d2Is9ugDMTrgKke2c0g,1606
210
- cartography/intel/crxcavator/crxcavator.py,sha256=tnx6bq8Oz020mhMDmx8gKZ_ro_0UvUGeWrshmFr7bBw,13797
211
208
  cartography/intel/cve/__init__.py,sha256=A7XjKQSanmwMSIXSum1qJSegtYcQCuz_713RU-bFQz8,2504
212
209
  cartography/intel/cve/feed.py,sha256=JkfRV18JoydOuncKR1y3s8esuN2Xk4gIB6viKNXU_X0,10020
213
210
  cartography/intel/digitalocean/__init__.py,sha256=SMYB7LGIQOj_EgGSGVjWZk7SJNbP43hQuOfgOu6xYm4,1526
@@ -222,7 +219,7 @@ cartography/intel/duo/phones.py,sha256=ueJheqSLD2xYcMus5eOiixPYS3_xVjgQzeomjV2a6
222
219
  cartography/intel/duo/tokens.py,sha256=bEEnjfc4waQnkRHVSnZLAeGE8wHOOZL7FA9m80GGQdQ,2396
223
220
  cartography/intel/duo/users.py,sha256=lc7ly_XKeUjJ50szw31WT_GiCrZfGKJv1zVUpmTchh4,4097
224
221
  cartography/intel/duo/web_authn_credentials.py,sha256=IbDf3CWqfEyI7f9zJugUvoDd6vZOECfb_7ANZaRYzuk,2636
225
- cartography/intel/gcp/__init__.py,sha256=kxRvAc1DPNkE2JCy3_QjbwLebZ4irKOlSol3TxnN37E,12158
222
+ cartography/intel/gcp/__init__.py,sha256=jJOT6Ys97qm1W0jGXFwtSOOSGPa7q-Xxr1YIR8fKejo,15849
226
223
  cartography/intel/gcp/compute.py,sha256=CH2cBdOwbLZCAbkfRJkkI-sFybXVKRWEUGDJANQmvyA,48333
227
224
  cartography/intel/gcp/crm.py,sha256=Uw5PILhVFhpM8gq7uu2v7F_YikDW3gsTZ3d7-e8Z1_k,12324
228
225
  cartography/intel/gcp/dns.py,sha256=y2pvbmV04cnrMyuu_nbW3oc7uwHX6yEzn1n7veCsjmk,7748
@@ -238,7 +235,7 @@ cartography/intel/gsuite/api.py,sha256=J0dkNdfBVMrEv8vvStQu7YKVxXSyV45WueFhUS4aO
238
235
  cartography/intel/jamf/__init__.py,sha256=Nof-LrUeevoieo6oP2GyfTwx8k5TUIgreW6hSj53YjQ,419
239
236
  cartography/intel/jamf/computers.py,sha256=EfjlupQ-9HYTjOrmuwrGuJDy9ApAnJvk8WrYcp6_Jkk,1673
240
237
  cartography/intel/jamf/util.py,sha256=EAyP8VpOY2uAvW3HtX6r7qORNjGa1Tr3fuqezuLQ0j4,1017
241
- cartography/intel/kandji/__init__.py,sha256=OHZJNzuNibIfJ51OkL3XL2EdA_ZmvPHPeWCQUld4J64,1079
238
+ cartography/intel/kandji/__init__.py,sha256=Y38bVRmrGVJRy0mSof8xU-cuEyJ7N_oI7KekYjYyuiQ,1076
242
239
  cartography/intel/kandji/devices.py,sha256=j_rP6rQ5VPT_XEcGXx7Yt6eCOm1Oe3I2qWIxXODXEcA,2224
243
240
  cartography/intel/kubernetes/__init__.py,sha256=jaOTEanWnTrYvcBN1XUC5oqBhz1AJbFmzoT9uu_VBSg,1481
244
241
  cartography/intel/kubernetes/namespaces.py,sha256=6o-FgAX_Ai5NCj2xOWM-RNWEvn0gZjVQnZSGCJlcIhw,2710
@@ -270,8 +267,14 @@ cartography/intel/pagerduty/services.py,sha256=Cjm37mWmuBNXSY49-xUQ3xV0DZ391GTLv
270
267
  cartography/intel/pagerduty/teams.py,sha256=aRubUXgEVVReyLrXAX_be1E_QBJv3Qlr4n779Jkkz8Q,2498
271
268
  cartography/intel/pagerduty/users.py,sha256=oltGssxrnzYsV6QTGP1SsPoA1rCUDStj6vGlGWY695g,1623
272
269
  cartography/intel/pagerduty/vendors.py,sha256=WlDHExrWRBegDQKtxBV5nJiYgwoTLxNee4HrQDJ-Pdg,1559
273
- cartography/intel/semgrep/__init__.py,sha256=94vjdszGEosvXiKtYWKD34BRKwRbJxlBO1PZcKdxnFA,619
274
- cartography/intel/semgrep/findings.py,sha256=hbH_wL1XJDZDDrbIV_FjPv4A7oS2xM_hhMAbZlRm9po,9025
270
+ cartography/intel/semgrep/__init__.py,sha256=XhfixZPJXBIA9SRQDxe2wY26KW447lTPR0Q_DV7aFTU,1150
271
+ cartography/intel/semgrep/dependencies.py,sha256=2Uq86WLDlfO-lNPot__z0TXPbe_cXC_5HFLyYqfbVKU,6742
272
+ cartography/intel/semgrep/deployment.py,sha256=sh-yJHtdgZjxIJimNnA-DxsM-MYgMhQ_WX2E7w4PWiM,2012
273
+ cartography/intel/semgrep/findings.py,sha256=GDqZmfl9-HiZ93u0jhlkZ1w_qzrD1cFFFJtVc7DFdPk,9761
274
+ cartography/intel/snipeit/__init__.py,sha256=0uIh8NbuI7IbfgaOrPHg4Nfm1yO6mTRC_qaFiIjR2FA,992
275
+ cartography/intel/snipeit/asset.py,sha256=KkGRUgIydvf_6SHtgpVLT-TjtEGz029SrOaoh0qDW6E,1997
276
+ cartography/intel/snipeit/user.py,sha256=hm9v_p29bphHtGe9LKVo1FD_rQcbCigrCRf8YsmteXA,1971
277
+ cartography/intel/snipeit/util.py,sha256=fXlzdFQXm01Oaa2REYNN7x3y3k2l3zCVhf_BxcRUELY,1040
275
278
  cartography/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
279
  cartography/models/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
280
  cartography/models/aws/emr.py,sha256=TkuwoZnw_VHbJ5bwkac7-ZfwSLe_TeK3gxkuwGQOUk4,3037
@@ -329,13 +332,17 @@ cartography/models/lastpass/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
329
332
  cartography/models/lastpass/tenant.py,sha256=TG-9LFo9Sfzb9UgcTt_gFVTKocLItbgQMMPkN_iprXU,618
330
333
  cartography/models/lastpass/user.py,sha256=SMTTYN6jgccc9k76hY3rVImElJOhHhZ9f1aZ6JzcrHw,3487
331
334
  cartography/models/semgrep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
+ cartography/models/semgrep/dependencies.py,sha256=QcvlqKKvX1bi4iqcM0ioYb1ZfGfisJ9E2o2CMnEf2CE,3399
332
336
  cartography/models/semgrep/deployment.py,sha256=or5qZDuR51MXzINpH15jZrqmSUvXQevCNYWJ7D6v-JI,745
333
- cartography/models/semgrep/findings.py,sha256=xrn8sgXpNMrNJbKQagaAVxaCG9bVjTATSRR2XRBR4rg,5386
337
+ cartography/models/semgrep/findings.py,sha256=RPd-QzvP38fbTIqFARx6XpcZSsd5JM3KIg-ZlJA7NlE,5490
334
338
  cartography/models/semgrep/locations.py,sha256=kSk7Nn5Mn4Ob84MVZOo2GR0YFi-9Okq9pgA3FfC6_bk,3061
335
- cartography-0.94.0rc2.dist-info/LICENSE,sha256=489ZXeW9G90up6ep-D1n-lJgk9ciNT2yxXpFgRSidtk,11341
336
- cartography-0.94.0rc2.dist-info/METADATA,sha256=UEwu0NxrNz1H3YQWCQT4grTn4p_yvqC1nFoou0HCvig,1991
337
- cartography-0.94.0rc2.dist-info/NOTICE,sha256=YOGAsjFtbyKj5tslYIg6V5jEYRuEvnSsIuDOUKj0Qj4,97
338
- cartography-0.94.0rc2.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
339
- cartography-0.94.0rc2.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
340
- cartography-0.94.0rc2.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
341
- cartography-0.94.0rc2.dist-info/RECORD,,
339
+ cartography/models/snipeit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
+ cartography/models/snipeit/asset.py,sha256=FyRAaeXuZjMy0eUQcSDFcgEAF5lbLMlvqp1Tv9d3Lv4,3238
341
+ cartography/models/snipeit/tenant.py,sha256=p4rFnpNNuF1W5ilGBbexDaETWTwavfb38RcQGoImkQI,679
342
+ cartography/models/snipeit/user.py,sha256=MsB4MiCVNTH6JpESime7cOkB89autZOXQpL6Z0l7L6o,2113
343
+ cartography-0.95.0.dist-info/LICENSE,sha256=kvLEBRYaQ1RvUni6y7Ti9uHeooqnjPoo6n_-0JO1ETc,11351
344
+ cartography-0.95.0.dist-info/METADATA,sha256=ucYZ9aFJYHMxhZ6NnBDXxLEOerbuFq4k7NaPCw_-jzY,1963
345
+ cartography-0.95.0.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
346
+ cartography-0.95.0.dist-info/entry_points.txt,sha256=GVIAWD0o0_K077qMA_k1oZU4v-M0a8GLKGJR8tZ-qH8,112
347
+ cartography-0.95.0.dist-info/top_level.txt,sha256=BHqsNJQiI6Q72DeypC1IINQJE59SLhU4nllbQjgJi9g,12
348
+ cartography-0.95.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5