Compare commits

..
Author SHA1 Message Date
Alan Buscaglia d7d96df300 fix(docs): use Mintlify-compatible image markup 2026-07-31 14:34:25 +02:00
Alan Buscaglia 5e60402469 docs: document Prowler Cloud feedback widget
- Explain how to submit and dismiss product feedback
- Add widget and confirmation screenshots
- Add the guide to Prowler Cloud navigation
2026-07-31 14:09:28 +02:00
176 changed files with 332 additions and 8914 deletions

No files matched your search

+1 -2
View File
@@ -36,7 +36,7 @@ jobs:
- name: Enable release freeze
env:
GH_TOKEN: ${{ secrets.PROWLER_BOT_ACCESS_TOKEN }}
GH_TOKEN: ${{ github.token }}
run: |
gh variable set RELEASE_FREEZE --body true --repo "${GITHUB_REPOSITORY}"
@@ -389,4 +389,3 @@ jobs:
if: always()
run: |
rm -f prowler_changelog.md api_changelog.md ui_changelog.md mcp_changelog.md combined_changelog.md
-23
View File
@@ -4,29 +4,6 @@ All notable changes to the **Prowler API** are documented in this file.
<!-- changelog: release notes start -->
## [1.38.0] (Prowler v5.37.0)
### 🚀 Added
- Attack Paths: four AWS privilege-escalation detection queries from pathfinding.cloud: cross-account role trust (STS-002), wildcard role trust (STS-003), user permissions-boundary removal (IAM-022), and IAM Identity Center permission-set escalation (SSO-001) [(#11460)](https://github.com/prowler-cloud/prowler/pull/11460)
### 🐞 Fixed
- Attack Paths IAM privilege-escalation queries no longer build an all-nodes × all-resource-items cartesian product, fixing runtime errors and timeouts on accounts with many IAM roles, users, or groups [(#12136)](https://github.com/prowler-cloud/prowler/pull/12136)
- `task_args` serialization no longer returns HTTP 500 errors when Celery truncates stored task keyword arguments [(#12165)](https://github.com/prowler-cloud/prowler/pull/12165)
- Attack Paths predefined queries on migrated graphs are now scoped with the provider label, letting the graph database seed from its label index instead of a global label scan and preventing query timeouts on Neptune [(#12167)](https://github.com/prowler-cloud/prowler/pull/12167)
- Authentication with an API key whose owning user was deleted now returns `401` instead of an unhandled `AttributeError`, and user deletion now revokes the user's API keys across all their tenants [(#12210)](https://github.com/prowler-cloud/prowler/pull/12210)
- AWS Security Hub integrations now persist successful connection checks during finding delivery so their connection status and last checked timestamp stay current [(#12212)](https://github.com/prowler-cloud/prowler/pull/12212)
- SAML users without a `userType` attribute and without an existing role in the SAML tenant now receive a least-privilege `read_only` fallback role; a numeric suffix is used when that name belongs to a role with different permissions [(#12223)](https://github.com/prowler-cloud/prowler/pull/12223)
- Social signups create users and authentication records in one database transaction, preventing incomplete accounts when provisioning fails [(#12245)](https://github.com/prowler-cloud/prowler/pull/12245)
- Requesting integrations with a sparse fieldset that leaves out `configuration` no longer returns HTTP 500 errors when the tenant has a Jira integration [(#12261)](https://github.com/prowler-cloud/prowler/pull/12261)
### 🔐 Security
- Provider deletion and connection checks, scan creation, provider secrets, provider groups, and daily schedules now respect role provider-group visibility [(#12216)](https://github.com/prowler-cloud/prowler/pull/12216)
---
## [1.37.0] (Prowler v5.36.0)
### 🔄 Changed
+1
View File
@@ -0,0 +1 @@
Authentication with an API key whose owning user was deleted now returns `401` instead of an unhandled `AttributeError`, and user deletion now revokes the user's API keys across all their tenants
@@ -0,0 +1 @@
Attack Paths IAM privilege-escalation queries no longer build an all-nodes × all-resource-items cartesian product, fixing runtime errors and timeouts on accounts with many IAM roles, users, or groups
@@ -0,0 +1 @@
Attack Paths adds four AWS privilege-escalation detection queries from pathfinding.cloud: cross-account role trust (STS-002), wildcard role trust (STS-003), user permissions-boundary removal (IAM-022), and IAM Identity Center permission-set escalation (SSO-001)
@@ -0,0 +1 @@
Attack Paths predefined queries on migrated graphs are now scoped with the provider label, letting the graph database seed from its label index instead of a global label scan and preventing query timeouts on Neptune
@@ -0,0 +1 @@
`task_args` serialization no longer returns HTTP 500 errors when Celery truncates stored task keyword arguments
@@ -0,0 +1 @@
Provider deletion and connection checks, scan creation, provider secrets, provider groups, and daily schedules now respect role provider-group visibility
@@ -0,0 +1 @@
SAML users without a `userType` attribute and without an existing role in the SAML tenant now receive a least-privilege `read_only` fallback role; a numeric suffix is used when that name belongs to a role with different permissions
@@ -0,0 +1 @@
AWS Security Hub integrations now persist successful connection checks during finding delivery so their connection status and last checked timestamp stay current
@@ -0,0 +1 @@
Social signups create users and authentication records in one database transaction, preventing incomplete accounts when provisioning fails
+1 -1
View File
@@ -45,7 +45,7 @@ dependencies = [
"gunicorn==26.0.0",
"uvloop==0.22.1",
"lxml==6.1.0",
"prowler @ git+https://github.com/prowler-cloud/prowler.git@v5.37",
"prowler @ git+https://github.com/prowler-cloud/prowler.git@master",
"psycopg2-binary==2.9.9",
"pytest-celery[redis] (==1.3.0)",
"sentry-sdk[django] (==2.56.0)",
+32 -33
View File
@@ -2,7 +2,6 @@ import json
from unittest.mock import ANY, Mock, patch
import pytest
from api.db_utils import rls_transaction
from api.models import (
Integration,
IntegrationProviderRelationship,
@@ -1292,6 +1291,22 @@ class TestLimitedVisibility:
response.json()["data"]["relationships"]["providers"]["meta"]["count"] == 1
)
@pytest.fixture
def jira_integration(self, tenants_fixture):
# Jira is a tenant-wide integration: it is not attached to any provider
return Integration.objects.create(
tenant_id=tenants_fixture[0].id,
enabled=True,
connected=True,
integration_type=Integration.IntegrationChoices.JIRA,
configuration={"projects": {"TEST": "Test project"}},
credentials={
"domain": "test",
"user_mail": "a@b.com",
"api_token": "token",
},
)
@pytest.fixture
def out_of_scope_integration(self, tenants_fixture, provider_factory):
tenant_id = tenants_fixture[0].id
@@ -1317,7 +1332,7 @@ class TestLimitedVisibility:
self,
authenticated_client_rbac_limited,
integrations_fixture,
jira_integration_fixture,
jira_integration,
aws_provider_pair,
):
# Integration 2 is attached to both providers, so make both visible to the role
@@ -1333,16 +1348,13 @@ class TestLimitedVisibility:
assert response.status_code == status.HTTP_200_OK
integration_ids = [item["id"] for item in response.json()["data"]]
# The tenant-wide Jira integration is visible without unlimited visibility
assert str(jira_integration_fixture.id) in integration_ids
assert str(jira_integration.id) in integration_ids
# Integrations attached to more than one visible provider are not duplicated
assert integration_ids.count(str(integrations_fixture[1].id)) == 1
assert response.json()["meta"]["pagination"]["count"] == len(integration_ids)
def test_integrations_list_without_provider_groups_keeps_tenant_wide_integration(
self,
authenticated_client_rbac_limited,
integrations_fixture,
jira_integration_fixture,
self, authenticated_client_rbac_limited, integrations_fixture, jira_integration
):
# A role with no provider group at all sees no provider, but still needs Jira
RoleProviderGroupRelationship.objects.all().delete()
@@ -1351,7 +1363,7 @@ class TestLimitedVisibility:
assert response.status_code == status.HTTP_200_OK
integration_ids = [item["id"] for item in response.json()["data"]]
assert integration_ids == [str(jira_integration_fixture.id)]
assert integration_ids == [str(jira_integration.id)]
def test_integrations_include_providers_hides_out_of_scope_providers(
self, authenticated_client_rbac_limited, integrations_fixture, aws_provider_pair
@@ -1370,19 +1382,13 @@ class TestLimitedVisibility:
assert str(hidden_provider.id) not in included_ids
def test_integrations_list_with_sparse_fields(
self,
authenticated_client_rbac_limited,
integrations_fixture,
jira_integration_fixture,
self, authenticated_client_rbac_limited, integrations_fixture
):
response = authenticated_client_rbac_limited.get(
reverse("integration-list"), {"fields[integrations]": "enabled"}
)
assert response.status_code == status.HTTP_200_OK
assert str(jira_integration_fixture.id) in [
item["id"] for item in response.json()["data"]
]
assert all(
list(item["attributes"].keys()) == ["enabled"]
for item in response.json()["data"]
@@ -1418,10 +1424,7 @@ class TestLimitedVisibility:
assert response.status_code == status.HTTP_404_NOT_FOUND
def test_integration_update_allowed_when_fully_visible(
self,
authenticated_client_rbac_limited,
integrations_fixture,
jira_integration_fixture,
self, authenticated_client_rbac_limited, integrations_fixture, jira_integration
):
# Integration 1 is only related to provider1, which the role can access
integration = integrations_fixture[0]
@@ -1455,21 +1458,20 @@ class TestLimitedVisibility:
payload = {
"data": {
"type": "integrations",
"id": str(jira_integration_fixture.id),
"id": str(jira_integration.id),
"attributes": {"enabled": False},
}
}
response = authenticated_client_rbac_limited.patch(
reverse("integration-detail", kwargs={"pk": jira_integration_fixture.id}),
reverse("integration-detail", kwargs={"pk": jira_integration.id}),
data=json.dumps(payload),
content_type="application/vnd.api+json",
)
assert response.status_code == status.HTTP_200_OK
with rls_transaction(str(jira_integration_fixture.tenant_id)):
jira_integration_fixture.refresh_from_db()
assert jira_integration_fixture.enabled is False
jira_integration.refresh_from_db()
assert jira_integration.enabled is False
def test_integration_create_rejects_out_of_scope_provider(
self, authenticated_client_rbac_limited, aws_provider_pair
@@ -1569,10 +1571,7 @@ class TestLimitedVisibility:
assert Integration.objects.filter(id=integration.id).exists()
def test_integration_delete_allowed_when_fully_visible(
self,
authenticated_client_rbac_limited,
integrations_fixture,
jira_integration_fixture,
self, authenticated_client_rbac_limited, integrations_fixture, jira_integration
):
# Integration 1 is only related to provider1, which the role can access
integration = integrations_fixture[0]
@@ -1586,20 +1585,20 @@ class TestLimitedVisibility:
# Tenant-wide integrations have no provider restricting the role
response = authenticated_client_rbac_limited.delete(
reverse("integration-detail", kwargs={"pk": jira_integration_fixture.id})
reverse("integration-detail", kwargs={"pk": jira_integration.id})
)
assert response.status_code == status.HTTP_204_NO_CONTENT
def test_jira_issue_types_allowed_without_unlimited_visibility(
self, authenticated_client_rbac_limited, jira_integration_fixture
self, authenticated_client_rbac_limited, jira_integration
):
with patch("api.v1.views.initialize_prowler_integration") as mock_jira:
mock_jira.return_value.get_available_issue_types.return_value = ["Task"]
response = authenticated_client_rbac_limited.get(
reverse(
"integration-jira-issue-types",
kwargs={"integration_pk": jira_integration_fixture.id},
kwargs={"integration_pk": jira_integration.id},
),
{"project_key": "TEST"},
)
@@ -1635,12 +1634,12 @@ class TestLimitedVisibility:
assert response.status_code == status.HTTP_404_NOT_FOUND
def test_jira_dispatches_allowed_without_unlimited_visibility(
self, authenticated_client_rbac_limited, jira_integration_fixture
self, authenticated_client_rbac_limited, jira_integration
):
response = authenticated_client_rbac_limited.post(
reverse(
"integration-jira-dispatches",
kwargs={"integration_pk": jira_integration_fixture.id},
kwargs={"integration_pk": jira_integration.id},
),
data=json.dumps({}),
content_type="application/vnd.api+json",
@@ -6,13 +6,10 @@ from api.v1.serializer_utils.integrations import (
from api.v1.serializer_utils.providers import ProviderSecretField
from api.v1.serializers import (
ImageProviderSecret,
IntegrationSerializer,
IntegrationUpdateSerializer,
KubernetesProviderSecret,
OracleCloudProviderSecret,
)
from rest_framework.exceptions import ValidationError
from rest_framework.test import APIRequestFactory
class TestS3ConfigSerializer:
@@ -355,25 +352,3 @@ current-context: test-context
assert not serializer.is_valid()
assert "kubeconfig_content" in serializer.errors
@pytest.mark.django_db
class TestIntegrationSerializerJiraDomain:
"""The serialized Jira `domain` must not reach the model instance."""
@pytest.mark.parametrize(
"serializer_class", [IntegrationSerializer, IntegrationUpdateSerializer]
)
def test_to_representation_does_not_mutate_configuration(
self, serializer_class, jira_integration_fixture
):
# `IntegrationUpdateSerializer` exposes a `HyperlinkedIdentityField`
context = {"request": APIRequestFactory().get("/")}
representation = serializer_class(
jira_integration_fixture, context=context
).data
assert representation["configuration"]["domain"] == "test"
assert jira_integration_fixture.configuration == {
"projects": {"TEST": "Test project"}
}
-68
View File
@@ -23,7 +23,6 @@ from api.attack_paths import (
)
from api.compliance import get_compliance_frameworks
from api.db_router import MainRouter
from api.db_utils import rls_transaction
from api.models import (
AttackSurfaceOverview,
ComplianceOverviewSummary,
@@ -13499,73 +13498,6 @@ class TestIntegrationViewSet:
f"Expected type '{expected_type}' not found in included data"
)
# Serializing a Jira integration reads `configuration` to add the domain from the
# credentials, and a sparse fieldset can leave that field out of the representation
def test_integrations_list_sparse_fields_without_configuration(
self, authenticated_client, jira_integration_fixture
):
response = authenticated_client.get(
reverse("integration-list"),
{"fields[integrations]": "enabled,integration_type"},
)
assert response.status_code == status.HTTP_200_OK
attributes = response.json()["data"][0]["attributes"]
assert sorted(attributes.keys()) == ["enabled", "integration_type"]
def test_integrations_retrieve_sparse_fields_without_configuration(
self, authenticated_client, jira_integration_fixture
):
response = authenticated_client.get(
reverse("integration-detail", kwargs={"pk": jira_integration_fixture.id}),
{"fields[integrations]": "enabled,integration_type"},
)
assert response.status_code == status.HTTP_200_OK
assert "configuration" not in response.json()["data"]["attributes"]
def test_integrations_partial_update_sparse_fields_without_configuration(
self, authenticated_client, jira_integration_fixture
):
data = {
"data": {
"type": "integrations",
"id": str(jira_integration_fixture.id),
"attributes": {"enabled": False},
}
}
url = reverse("integration-detail", kwargs={"pk": jira_integration_fixture.id})
response = authenticated_client.patch(
f"{url}?fields[integrations]=enabled,integration_type",
data=json.dumps(data),
content_type="application/vnd.api+json",
)
assert response.status_code == status.HTTP_200_OK
assert "configuration" not in response.json()["data"]["attributes"]
with rls_transaction(str(jira_integration_fixture.tenant_id)):
jira_integration_fixture.refresh_from_db()
assert jira_integration_fixture.enabled is False
# Omitting `configuration` from the fieldset must not rewrite it, and the
# serialized `domain` must not leak into the stored value
assert jira_integration_fixture.configuration == {
"projects": {"TEST": "Test project"}
}
def test_integrations_retrieve_jira_keeps_domain_in_configuration(
self, authenticated_client, jira_integration_fixture
):
response = authenticated_client.get(
reverse("integration-detail", kwargs={"pk": jira_integration_fixture.id})
)
assert response.status_code == status.HTTP_200_OK
configuration = response.json()["data"]["attributes"]["configuration"]
assert configuration["domain"] == "test"
assert configuration["projects"] == {"TEST": "Test project"}
@pytest.mark.parametrize(
"integration_type, configuration, credentials",
[
+9 -19
View File
@@ -3006,15 +3006,10 @@ class IntegrationSerializer(IntegrationProviderVisibilityMixin, RLSSerializer):
representation = self.hide_restricted_providers(
super().to_representation(instance)
)
# `configuration` is missing when the request asks for a subset of the fields
if (
instance.integration_type == Integration.IntegrationChoices.JIRA
and "configuration" in representation
):
representation["configuration"] = {
**representation["configuration"],
"domain": instance.credentials.get("domain"),
}
if instance.integration_type == Integration.IntegrationChoices.JIRA:
representation["configuration"].update(
{"domain": instance.credentials.get("domain")}
)
return representation
@@ -3148,16 +3143,11 @@ class IntegrationUpdateSerializer(
representation = self.hide_restricted_providers(
super().to_representation(instance)
)
# Ensure JIRA integrations show updated domain in configuration from credentials.
# `configuration` is missing when the request asks for a subset of the fields
if (
instance.integration_type == Integration.IntegrationChoices.JIRA
and "configuration" in representation
):
representation["configuration"] = {
**representation["configuration"],
"domain": instance.credentials.get("domain"),
}
# Ensure JIRA integrations show updated domain in configuration from credentials
if instance.integration_type == Integration.IntegrationChoices.JIRA:
representation["configuration"].update(
{"domain": instance.credentials.get("domain")}
)
return representation
-20
View File
@@ -1450,26 +1450,6 @@ def integrations_fixture(aws_provider_pair):
return integration1, integration2
@pytest.fixture
def jira_integration_fixture(tenants_fixture):
# Jira is a tenant-wide integration: it is not attached to any provider, and its
# `domain` is read from the credentials when the integration is serialized
tenant_id = tenants_fixture[0].id
with rls_transaction(str(tenant_id)):
return Integration.objects.create(
tenant_id=tenant_id,
enabled=True,
connected=True,
integration_type=Integration.IntegrationChoices.JIRA,
configuration={"projects": {"TEST": "Test project"}},
credentials={
"domain": "test",
"user_mail": "a@b.com",
"api_token": "token",
},
)
@pytest.fixture
def backfill_scan_metadata_fixture(scans_fixture, findings_fixture):
for scan_instance in scans_fixture:
Generated
+3 -216
View File
@@ -3357,134 +3357,6 @@ http2 = [
{ name = "h2" },
]
[[package]]
name = "huaweicloudsdkcore"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "defusedxml" },
{ name = "pyasn1" },
{ name = "pymongo" },
{ name = "pyyaml" },
{ name = "requests-toolbelt" },
{ name = "simplejson" },
{ name = "six" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/e4/f5/65e90764ea3bbfef50fb68cd5e12340acf1f51e9276b11745fbf5feb7e0e/huaweicloudsdkcore-3.1.204-py3-none-any.whl", hash = "sha256:9ae17744795ebdc8ce9291373a3a27bf72e90aa98677cfce0ea9394376875a95", size = 69578, upload-time = "2026-07-09T09:01:59.715Z" },
]
[[package]]
name = "huaweicloudsdkcts"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/58/32/d06328e35375d4aa606719a27856cdf57b1f7fb0c49d4dfd22a9609dba19/huaweicloudsdkcts-3.1.204-py3-none-any.whl", hash = "sha256:9def561aa784a6ee13b46bfc96888cd1df5bfc42f8a89e60b42c91c608bf6d60", size = 121768, upload-time = "2026-07-09T09:02:08.16Z" },
]
[[package]]
name = "huaweicloudsdkecs"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/88/66/f8e4a3b9ca70d3ea79c4d200f928ed9ffdf4910ac01be4864967408c8f18/huaweicloudsdkecs-3.1.204-py3-none-any.whl", hash = "sha256:dc5715d782c0260b901c793d009d5e632257acb04257b6f2c6631e415c589343", size = 765699, upload-time = "2026-07-09T09:02:39.272Z" },
]
[[package]]
name = "huaweicloudsdkelb"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/34/4b/9bdc7e2066419d967e9b812cfacfb9c4996a8e977dc39853309a3c1ac9e2/huaweicloudsdkelb-3.1.204-py3-none-any.whl", hash = "sha256:620247c2b2a7f20e7da8b18fe9c64e29972055f015bc35270fb5b43243dc4830", size = 1292397, upload-time = "2026-07-09T09:02:45.656Z" },
]
[[package]]
name = "huaweicloudsdkevs"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/cf/531dc55fd9d0f3bbd3eef24c7e4d78c6a1ba8eb80fa506e3574d72bcc98a/huaweicloudsdkevs-3.1.204-py3-none-any.whl", hash = "sha256:9118ac4c576e54aa7eaa926949e2b6824c5f038a2274b51d9a304d37fc0d7e2f", size = 251404, upload-time = "2026-07-09T09:02:50.05Z" },
]
[[package]]
name = "huaweicloudsdkiam"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/f7/9a/7da0fbe9b83bc7a7f6d586366b81e829ed355a57419d2184b7dd51f8c2a3/huaweicloudsdkiam-3.1.204-py3-none-any.whl", hash = "sha256:0021e204f81ceef2640017e517adb72ba56c9ced03f071a0265b10bc9759badf", size = 1251350, upload-time = "2026-07-09T09:03:05.467Z" },
]
[[package]]
name = "huaweicloudsdkkms"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/28/3a/7392617d585cb2005f7d9ade0b0e0e493a7a88daf56e8dc39e4e219cc5d0/huaweicloudsdkkms-3.1.204-py3-none-any.whl", hash = "sha256:378986f33113ce99f445ef318d1c7dda89e361d16c008e5ef9793981d8385376", size = 275690, upload-time = "2026-07-09T09:03:29.833Z" },
]
[[package]]
name = "huaweicloudsdkobs"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/af/49/28a09e1e33d1c039be22ee4171efaa739351653c7aa88d3a2f7a78d90217/huaweicloudsdkobs-3.1.204-py3-none-any.whl", hash = "sha256:8c5830fa30293185964d98e524887fc510c8e17ca2fadb4563dad10910f37b13", size = 235360, upload-time = "2026-07-09T09:03:52.171Z" },
]
[[package]]
name = "huaweicloudsdkrds"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/18/7d/721f162c46e3de604a73674223bf6c6bc6cf7ade25b3751a71288f4dd122/huaweicloudsdkrds-3.1.204-py3-none-any.whl", hash = "sha256:a790b5b3c457a608e5679c101f463b4d037dd9a8a66f6e46144a9e5a4b37780f", size = 1626906, upload-time = "2026-07-09T09:04:06.936Z" },
]
[[package]]
name = "huaweicloudsdkvpc"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/de/b5/4baa27c3a275ea92806068e35e06f249a30add8dd57c777bb45841f63406/huaweicloudsdkvpc-3.1.204-py3-none-any.whl", hash = "sha256:c57d6b6d2f70deca91e86f7956b33fc9ac4991b431f0d608c3632231119f8970", size = 1124332, upload-time = "2026-07-09T09:04:39.797Z" },
]
[[package]]
name = "huaweicloudsdkwaf"
version = "3.1.204"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huaweicloudsdkcore" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/21/01590dce200be487756451f5e9efb99da7810688062d177e4b58d6062465/huaweicloudsdkwaf-3.1.204-py3-none-any.whl", hash = "sha256:b2355276e0029808f45e2d1bd3eb14b37d2da9417e61e642ffe0e2b748ca8283", size = 1337762, upload-time = "2026-07-09T09:04:43.688Z" },
]
[[package]]
name = "humanfriendly"
version = "10.0"
@@ -4801,8 +4673,8 @@ wheels = [
[[package]]
name = "prowler"
version = "5.37.0"
source = { git = "https://github.com/prowler-cloud/prowler.git?rev=v5.37#5cd673787bb98f28109f671898295a77fd755622" }
version = "5.35.0"
source = { git = "https://github.com/prowler-cloud/prowler.git?rev=master#f5ea116763aeffede9f399c8934fc280eaccd315" }
dependencies = [
{ name = "alibabacloud-actiontrail20200706" },
{ name = "alibabacloud-credentials" },
@@ -4857,17 +4729,6 @@ dependencies = [
{ name = "google-api-python-client" },
{ name = "google-auth-httplib2" },
{ name = "h2" },
{ name = "huaweicloudsdkcore" },
{ name = "huaweicloudsdkcts" },
{ name = "huaweicloudsdkecs" },
{ name = "huaweicloudsdkelb" },
{ name = "huaweicloudsdkevs" },
{ name = "huaweicloudsdkiam" },
{ name = "huaweicloudsdkkms" },
{ name = "huaweicloudsdkobs" },
{ name = "huaweicloudsdkrds" },
{ name = "huaweicloudsdkvpc" },
{ name = "huaweicloudsdkwaf" },
{ name = "jsonschema" },
{ name = "kingfisher-bin" },
{ name = "kubernetes" },
@@ -5001,7 +4862,7 @@ requires-dist = [
{ name = "matplotlib", specifier = "==3.10.8" },
{ name = "neo4j", specifier = "==6.1.0" },
{ name = "openai", specifier = "==1.109.1" },
{ name = "prowler", git = "https://github.com/prowler-cloud/prowler.git?rev=v5.37" },
{ name = "prowler", git = "https://github.com/prowler-cloud/prowler.git?rev=master" },
{ name = "psycopg2-binary", specifier = "==2.9.9" },
{ name = "pytest-celery", extras = ["redis"], specifier = "==1.3.0" },
{ name = "reportlab", specifier = "==4.4.10" },
@@ -5326,37 +5187,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/2e/ff/7f52c1461d8ceaefa989d2700a027f84427879bb7571145bbffdec5d5f4a/pylint-3.2.5-py3-none-any.whl", hash = "sha256:32cd6c042b5004b8e857d727708720c54a676d1e22917cf1a2df9b4d4868abd6", size = 519603, upload-time = "2024-06-28T13:10:23.526Z" },
]
[[package]]
name = "pymongo"
version = "4.15.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "dnspython" },
]
sdist = { url = "https://files.pythonhosted.org/packages/22/f5/c0c6732fbd358b75a07e17d7e588fd23d481b9812ca96ceeff90bbf879fc/pymongo-4.15.1.tar.gz", hash = "sha256:b9f379a4333dc3779a6bf7adfd077d4387404ed1561472743486a9c58286f705", size = 2470613, upload-time = "2025-09-16T16:39:47.24Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c9/da/89066930a70b4299844f1155fc23baaa7e30e77c8a0cbf62a2ae06ee34a5/pymongo-4.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:363445cc0e899b9e55ac9904a868c8a16a6c81f71c48dbadfd78c98e0b54de27", size = 865410, upload-time = "2025-09-16T16:38:16.279Z" },
{ url = "https://files.pythonhosted.org/packages/99/8f/a1d0402d52e5ebd14283718abefdc0c16f308cf10bee56cdff04b1f5119b/pymongo-4.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:da0a13f345f4b101776dbab92cec66f0b75015df0b007b47bd73bfd0305cc56a", size = 865695, upload-time = "2025-09-16T16:38:18.015Z" },
{ url = "https://files.pythonhosted.org/packages/53/38/d1ef69028923f86fd00638d9eb16400d4e60a89eabd2011fe631fd3186cf/pymongo-4.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9481a492851e432122a83755d4e69c06aeb087bbf8370bac9f96d112ac1303fd", size = 1434758, upload-time = "2025-09-16T16:38:20.141Z" },
{ url = "https://files.pythonhosted.org/packages/b0/eb/a8d5dff748a2dd333610b2e4c8120b623e38ea2b5e30ad190d0ce2803840/pymongo-4.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:625dec3e9cd7c3d336285a20728c01bfc56d37230a99ec537a6a8625af783a43", size = 1485716, upload-time = "2025-09-16T16:38:21.607Z" },
{ url = "https://files.pythonhosted.org/packages/c4/d4/17ba457a828b733182ddc01a202872fef3006eed6b54450b20dc95a2f77d/pymongo-4.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26a31af455bffcc64537a7f67e2f84833a57855a82d05a085a1030c471138990", size = 1460160, upload-time = "2025-09-16T16:38:23.509Z" },
{ url = "https://files.pythonhosted.org/packages/c3/25/42b8662c09f5ca9c81d18d160f48e58842e0fa4c314ea02613c5e5d54542/pymongo-4.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea4415970d2a074d5890696af10e174d84cb735f1fa7673020c7538431e1cb6e", size = 1439284, upload-time = "2025-09-16T16:38:25.248Z" },
{ url = "https://files.pythonhosted.org/packages/b3/bb/46b9d978161828eb91973bd441a3f05f73c789203e976332a8de2832d5db/pymongo-4.15.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51ee050a2e026e2b224d2ed382830194be20a81c78e1ef98f467e469071df3ac", size = 1407933, upload-time = "2025-09-16T16:38:27.045Z" },
{ url = "https://files.pythonhosted.org/packages/4b/55/bd5af98f675001f4b06f7314b3918e45809424a7ad3510f823f6703cd8f2/pymongo-4.15.1-cp311-cp311-win32.whl", hash = "sha256:9aef07d33839f6429dc24f2ef36e4ec906979cb4f628c57a1c2676cc66625711", size = 844328, upload-time = "2025-09-16T16:38:28.513Z" },
{ url = "https://files.pythonhosted.org/packages/c3/78/90989a290dd458ed43a8a04fa561ac9c7b3391f395cdacd42e21f0f22ce4/pymongo-4.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ea6e5ff4d6747e7b64966629a964db3089e9c1e0206d8f9cc8720c90f5a7af1", size = 858951, upload-time = "2025-09-16T16:38:30.074Z" },
{ url = "https://files.pythonhosted.org/packages/de/bb/d4d23f06e166cd773f2324cff73841a62d78a1ad16fb799cf7c5490ce32c/pymongo-4.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:bb783d9001b464a6ef3ee76c30ebbb6f977caee7bbc3a9bb1bd2ff596e818c46", size = 848290, upload-time = "2025-09-16T16:38:31.741Z" },
{ url = "https://files.pythonhosted.org/packages/7e/31/bc4525312083706a59fffe6e8de868054472308230fdee8db0c452c2b831/pymongo-4.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bab357c5ff36ba2340dfc94f3338ef399032089d35c3d257ce0c48630b7848b2", size = 920261, upload-time = "2025-09-16T16:38:33.614Z" },
{ url = "https://files.pythonhosted.org/packages/ae/55/4d99aec625494f21151b8b31e12e06b8ccd3b9dcff609b0dd1acf9bbbc0e/pymongo-4.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:46d1af3eb2c274f07815372b5a68f99ecd48750e8ab54d5c3ff36a280fb41c8e", size = 919956, upload-time = "2025-09-16T16:38:35.121Z" },
{ url = "https://files.pythonhosted.org/packages/be/60/8f1afa41521df950e13f6490ecdef48155fc63b78f926e7649045e07afd1/pymongo-4.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dc31357379318881186213dc5fc49b62601c955504f65c8e72032b5048950a1", size = 1698596, upload-time = "2025-09-16T16:38:36.586Z" },
{ url = "https://files.pythonhosted.org/packages/bc/3f/e48d50ee8d6aa0a4cda7889dd73076ec2ab79a232716a5eb0b9df070ffcf/pymongo-4.15.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12140d29da1ecbaefee2a9e65433ef15d6c2c38f97bc6dab0ff246a96f9d20cd", size = 1762833, upload-time = "2025-09-16T16:38:38.09Z" },
{ url = "https://files.pythonhosted.org/packages/63/87/db976859efc617f608754e051e1468459d9a818fe1ad5d0862e8af57720b/pymongo-4.15.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf193d2dcd91fa1d1dfa1fd036a3b54f792915a4842d323c0548d23d30461b59", size = 1731875, upload-time = "2025-09-16T16:38:39.742Z" },
{ url = "https://files.pythonhosted.org/packages/18/59/3643ad52a5064ad3ef8c32910de6da28eb658234c25f2db5366f16bffbfb/pymongo-4.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2c0bdcf4d57e4861ed323ba430b585ad98c010a83e46cb8aa3b29c248a82be1", size = 1701853, upload-time = "2025-09-16T16:38:41.333Z" },
{ url = "https://files.pythonhosted.org/packages/d8/96/441c190823f855fc6445ea574b39dca41156acf723c5e6a69ee718421700/pymongo-4.15.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43fcfc19446e0706bbfe86f683a477d1e699b02369dd9c114ec17c7182d1fe2b", size = 1660978, upload-time = "2025-09-16T16:38:42.877Z" },
{ url = "https://files.pythonhosted.org/packages/47/49/bd7e783fb78aaf9bdaa3f88cc238449be5bc5546e930ec98845ef235f809/pymongo-4.15.1-cp312-cp312-win32.whl", hash = "sha256:e5fedea0e7b3747da836cd5f88b0fa3e2ec5a394371f9b6a6b15927cfeb5455d", size = 891175, upload-time = "2025-09-16T16:38:44.658Z" },
{ url = "https://files.pythonhosted.org/packages/2e/28/7de5858bdeaa07ea4b277f9eb06123ea358003659fe55e72e4e7c898b321/pymongo-4.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:330a17c1c89e2c3bf03ed391108f928d5881298c17692199d3e0cdf097a20082", size = 910619, upload-time = "2025-09-16T16:38:46.124Z" },
{ url = "https://files.pythonhosted.org/packages/17/87/c39f4f8415e7c65f8b66413f53a9272211ff7dfe78a5128b27027bf88864/pymongo-4.15.1-cp312-cp312-win_arm64.whl", hash = "sha256:756b7a2a80ec3dd5b89cd62e9d13c573afd456452a53d05663e8ad0c5ff6632b", size = 896229, upload-time = "2025-09-16T16:38:48.563Z" },
]
[[package]]
name = "pymsalruntime"
version = "0.18.1"
@@ -5726,18 +5556,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" },
]
[[package]]
name = "requests-toolbelt"
version = "1.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "requests" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" },
]
[[package]]
name = "requestsexceptions"
version = "1.4.0"
@@ -5956,37 +5774,6 @@ dependencies = [
]
sdist = { url = "https://files.pythonhosted.org/packages/c5/06/c6dcc975a1e7d89bc764fd271da8138b318e18080b48e7f1acd2ab63df28/shodan-1.31.0.tar.gz", hash = "sha256:c73275386ea02390e196c35c660706a28dd4d537c5a21eb387ab6236fac251f6", size = 57939, upload-time = "2023-12-17T01:42:02.426Z" }
[[package]]
name = "simplejson"
version = "4.1.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/0e/2a/54837395a3487c725669428d513293612a48d82b95a0642c936932e5d898/simplejson-4.1.1.tar.gz", hash = "sha256:c08eb9f7a90f77ae470e19a07472e9a79ebc0d1c2315d86a72767665bd5ba79f", size = 118860, upload-time = "2026-04-24T19:24:59.819Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/1e/25/39013ffe279d90093ec1c848565b3683c586906c10fa55d9000ec29d046b/simplejson-4.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2867c64d92abd1992c15666fae198203093f593e43d6b81adf176bae530d493a", size = 111538, upload-time = "2026-04-24T19:22:49.051Z" },
{ url = "https://files.pythonhosted.org/packages/f2/ae/2c272971c8a87e2539c54a98eb6ff037bee1e2e93943c3986cf7500a4f3a/simplejson-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c47c46e16c8ea9e4850061e6ed5aa2b9cd2074cb2274bfd9c138cba15ce7453", size = 90594, upload-time = "2026-04-24T19:22:50.408Z" },
{ url = "https://files.pythonhosted.org/packages/4e/a2/6eebfb99dedc139f549200f61ade6d1890ac5707c5d427bdfa6fe39c9313/simplejson-4.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e294e33dbf316a9bbdd4030d46503c9b0f19470ae7ad6af5bae6c426bc2e869f", size = 90718, upload-time = "2026-04-24T19:22:51.694Z" },
{ url = "https://files.pythonhosted.org/packages/80/7e/c9e6c0c4ad8415e64dad0c47f619b556b02680a41631b4dbc281d55dc54d/simplejson-4.1.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7ce252b28fddbdd83db5bd7d93dad2a8a591d7ada098afec9c1b23d6b722a7a4", size = 180901, upload-time = "2026-04-24T19:22:53.025Z" },
{ url = "https://files.pythonhosted.org/packages/34/09/69e331e3994b1ed9be6ce9ace4ade704e7ed503edf869929ca7bb404eda8/simplejson-4.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c44ef6b02a4eb67ed17a72342341792149b3ff46f15426c26e970e49addf327", size = 178133, upload-time = "2026-04-24T19:22:54.574Z" },
{ url = "https://files.pythonhosted.org/packages/5d/40/ed806f24afef295c1032448f5ff6f6f2979392d5645ddb9f4fed7f38194d/simplejson-4.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82bfca2b85a34178c25829c703f0a9e9f113a5af7539285bd3efb583a0bf1ba3", size = 188155, upload-time = "2026-04-24T19:22:56.044Z" },
{ url = "https://files.pythonhosted.org/packages/38/94/8d6f515b827b0f7881a49c8c1ac6920b7ae9428939ef04238c973278b42a/simplejson-4.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e4b23f71dd781f8830f1663dc01a4944d3dbf87a1f93d78fba1cf64722d0ccf", size = 176225, upload-time = "2026-04-24T19:22:57.981Z" },
{ url = "https://files.pythonhosted.org/packages/c9/fd/6dffb4956563d48bbe46b91ff341adae34920e94008fd6b8d728072abfc7/simplejson-4.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82fee635d7b73ad801030b05a75fbd34a098da0c2ecf600667a03636d09e1e42", size = 185535, upload-time = "2026-04-24T19:22:59.618Z" },
{ url = "https://files.pythonhosted.org/packages/de/d2/a509ee37763e79aec75d68f8521db1440306edeba3b8b4064ab4ee8bf1d9/simplejson-4.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:68e62eda21192c5ea9bb92d571ca46a4477fef48762f50d433de2b4253051551", size = 179302, upload-time = "2026-04-24T19:23:01.324Z" },
{ url = "https://files.pythonhosted.org/packages/d8/23/5b343bfd2a79d3b6818e4db3586c405a001a090d4c89d336e31273ce7177/simplejson-4.1.1-cp311-cp311-win32.whl", hash = "sha256:ffd3d82294b47f5ec64050021ace95fd62628a0c1cc8bbf4d06d2d1fb697e055", size = 88408, upload-time = "2026-04-24T19:23:02.808Z" },
{ url = "https://files.pythonhosted.org/packages/38/04/df9b37aedbd524dca20840d25ebe01d6ae486b89792aeff5d15b9c4114f7/simplejson-4.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:78a3fe0995be42bed62a26aa78e0e0b4d87c6545785346b9cc898f3389569a35", size = 90526, upload-time = "2026-04-24T19:23:04.408Z" },
{ url = "https://files.pythonhosted.org/packages/60/25/e90998fe8e480eb43b966c09e835379887d427567ebd496563d3b1e16b19/simplejson-4.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:19040a17154dc03d289bab68d73ce0a6a0be01de30c584bbdd93490bead14b22", size = 112414, upload-time = "2026-04-24T19:23:06.084Z" },
{ url = "https://files.pythonhosted.org/packages/9c/a0/abd4785f36c3400f1fbb21f517be39295a750a714f04b7ee175adf6ef580/simplejson-4.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a94ebaecdbaa80d9551a3ec6bf0c9302fc8b53ab6c1b2bfd498a1df4cb28158d", size = 91120, upload-time = "2026-04-24T19:23:07.877Z" },
{ url = "https://files.pythonhosted.org/packages/b8/78/fc060d2e3b13c6ec59288574b8efac64075e316b2afba4396a56b2422f78/simplejson-4.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:67341c95c0a168ab4a6d1e807e50463f1c8da932c3286d81e201266c427061fa", size = 91055, upload-time = "2026-04-24T19:23:09.264Z" },
{ url = "https://files.pythonhosted.org/packages/0c/b6/156a8de1e1b47694f0e7de6675866936608d45dc68388fd017d36f8693be/simplejson-4.1.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:45ec18e337fec538b7e902d489505c450b2454653d1290f3f50385e6fd8aa607", size = 190297, upload-time = "2026-04-24T19:23:11.226Z" },
{ url = "https://files.pythonhosted.org/packages/86/1c/e4d0eab695be3eb21d0f46bce820752031f03e7113f9c80a9b3c73ee7157/simplejson-4.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:820c69a4710400e9b248d5670647d60be58824369282d3925e516b3ff1a7cd82", size = 187002, upload-time = "2026-04-24T19:23:12.982Z" },
{ url = "https://files.pythonhosted.org/packages/76/0e/7f5a59d29426b062d5928fb88b403c3f797129d53be7102f955dbe51aa44/simplejson-4.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e708d373a10e4378ef2d59f8361850c7150fd907ed49efe49bc5492160476d1", size = 195146, upload-time = "2026-04-24T19:23:14.517Z" },
{ url = "https://files.pythonhosted.org/packages/78/18/9943db224dd4d5fa3c090c3e56a94c37b254338c83995ec5680285111c40/simplejson-4.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:980fc33353f81fd12d8c49d44f8c2760d1dc8192285e627c5180d141035b228a", size = 183931, upload-time = "2026-04-24T19:23:16.742Z" },
{ url = "https://files.pythonhosted.org/packages/c2/08/9a690da9a766161c06c627d805362cf159f1abe480969372b2897649b955/simplejson-4.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:de2ed102fff88dacf543699f53ee3a533cc11539a39baa176b7e09dd783069d6", size = 192228, upload-time = "2026-04-24T19:23:18.33Z" },
{ url = "https://files.pythonhosted.org/packages/05/88/bd8aad36b451ffb0e0a3f721d695a88befa6d1ac7d1e02ae788ca7ff4029/simplejson-4.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785ff8edc0e28bf773a32543a6bbed46351453c997b3f6709c744e3c2f7eabb", size = 187808, upload-time = "2026-04-24T19:23:21.165Z" },
{ url = "https://files.pythonhosted.org/packages/04/ee/14f91db0d1f481533b651dafbf8cd0da088d9817f7af30c68f7f19f9c847/simplejson-4.1.1-cp312-cp312-win32.whl", hash = "sha256:2e0d5ead6d14610467ec356ec1f6b5d8a56aa216abaad8d41c8b873b16cf313f", size = 88512, upload-time = "2026-04-24T19:23:22.764Z" },
{ url = "https://files.pythonhosted.org/packages/b9/c4/90de06b2d8737c68c05ff9274113f854dbf6a5f28b7a955212111672cb57/simplejson-4.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:63a5451f557d6be48a231bae932458655c620902b868170b2f1c8afed496f6b4", size = 90748, upload-time = "2026-04-24T19:23:24.494Z" },
{ url = "https://files.pythonhosted.org/packages/ce/6a/8b74c52ffd33dbbde00fe7251fee6a0acdc8cea33f7a43805aed258fb79b/simplejson-4.1.1-py3-none-any.whl", hash = "sha256:2ce92b3748f02423e26d2bfb636fb9d7a8f67c8f5854dcae69d350d123b2eee2", size = 69195, upload-time = "2026-04-24T19:24:57.962Z" },
]
[[package]]
name = "six"
version = "1.17.0"
+4 -4
View File
@@ -39,7 +39,7 @@ The AWS provider implementation follows the general [Provider structure](/develo
- **Key AWS Responsibilities:**
- Receives an `AwsProvider` instance to access session, identity, and configuration.
- Manages clients for all services by regions.
- Provides `__threading_call__` method to make boto3 calls in parallel. By default, these calls are made by region, but it can be overridden with the first parameter of the method and use by resource.
- Provides `__threading_call__` method to make boto3 calls in parallel. By default, this calls are made by region, but it can be overridden with the first parameter of the method and use by resource.
- Exposes common audit context (`audited_account`, `audited_account_arn`, `audited_partition`, `audited_resources`) to subclasses.
### Exception Handling
@@ -59,7 +59,7 @@ The generic service pattern is described in [service page](/developer-guide/serv
- Directly in the code, in location [`prowler/providers/aws/services/`](https://github.com/prowler-cloud/prowler/tree/master/prowler/providers/aws/services)
- In the [Prowler Hub](https://hub.prowler.com/). For a more human-readable view.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used across all AWS services.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used accross all AWS services.
### AWS Service Common Patterns
@@ -68,7 +68,7 @@ The best reference to understand how to implement a new service is following the
- The constructor (`__init__`) always calls `super().__init__` with the service name and provider (e.g. `super().__init__(__class__.__name__, provider))`). Ensure that the service name in boto3 is the same that you use in the constructor. Usually is used the `__class__.__name__` to get the service name because it is the same as the class name.
- Resource containers **must** be initialized in the constructor. They should be dictionaries, with the key being the resource ARN or equivalent unique identifier and the value being the resource object.
- Resource discovery and attribute collection are parallelized using `self.__threading_call__`, typically by region or resource, for performance. The first parameter of the method is the iterator, if not provided, it will be the region; but if present indicate an array of the resources to be processed.
- Resource filtering is consistently enforced using `self.audit_resources` attribute and `is_resource_filtered` function, it is used to see if user has provided some resource that is not in the audit scope, so we can skip it in the service logic. Normally it is used before storing the resource in the service container as follows: `if not self.audit_resources or (is_resource_filtered(resource["arn"], self.audit_resources)):`.
- Resource filtering is consistently enforced using `self.audit_resources` attribute and `is_resource_filtered` function, it is used to see if user has provided some resource that is not in the audit scope, so we can skip it in the service logic. Normally it is used befor storing the resource in the service container as follows: `if not self.audit_resources or (is_resource_filtered(resource["arn"], self.audit_resources)):`.
- All AWS resources are represented as Pydantic `BaseModel` classes, providing type safety and structured access to resource attributes.
- AWS API calls are wrapped in try/except blocks, with specific handling for `ClientError` and generic exceptions, always logging errors.
- If ARN is not present for some resource, it can be constructed using string interpolation, always including partition, service, region, account, and resource ID.
@@ -162,7 +162,7 @@ When you instantiate `Check_Report_AWS`, you must provide the check metadata and
If the resource object does not contain the required attributes, you must set them manually in the check logic.
Other attributes are inherited from the `Check_Report` class, from those you **always** have to set the `status` and `status_extended` attributes in the check logic.
Other attributes are inherited from the `Check_Report` class, from that ones you **always** have to set the `status` and `status_extended` attributes in the check logic.
#### Example Usage
+1 -1
View File
@@ -57,7 +57,7 @@ The generic service pattern is described in [service page](/developer-guide/serv
- Directly in the code, in location [`prowler/providers/azure/services/`](https://github.com/prowler-cloud/prowler/tree/master/prowler/providers/azure/services)
- In the [Prowler Hub](https://hub.prowler.com/) for a more human-readable view.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used across all Azure services.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used accross all Azure services.
### Azure Service Common Patterns
+1 -1
View File
@@ -172,7 +172,7 @@ else:
### Resource Identification in Prowler
Each check **must** populate the report with a unique identifier for the audited resource. This identifier or identifiers are going to depend on the provider and the resource that is being audited. Here are the criteria for each provider:
Each check **must** populate the report with an unique identifier for the audited resource. This identifier or identifiers are going to depend on the provider and the resource that is being audited. Here are the criteria for each provider:
- AWS
- Amazon Resource ID — `report.resource_id`.
+3 -3
View File
@@ -102,7 +102,7 @@ The generic service pattern is described in [service page](/developer-guide/serv
- Directly in the code, in location [`prowler/providers/gcp/services/`](https://github.com/prowler-cloud/prowler/tree/master/prowler/providers/gcp/services)
- In the [Prowler Hub](https://hub.prowler.com/) for a more human-readable view.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used across all GCP services.
The best reference to understand how to implement a new service is following the [service implementation documentation](/developer-guide/services#adding-a-new-service) and taking other services already implemented as reference. In next subsection you can find a list of common patterns that are used accross all GCP services.
### GCP Service Common Patterns
@@ -113,7 +113,7 @@ The best reference to understand how to implement a new service is following the
- Only projects with the API enabled are included in the audit scope.
- Resource discovery and attribute collection can be parallelized using `self.__threading_call__`, typically by region/zone or resource.
- All GCP resources are represented as Pydantic `BaseModel` classes, providing type safety and structured access to resource attributes.
- Each GCP API call is wrapped in try/except blocks, always logging errors.
- Each GCP API calls are wrapped in try/except blocks, always logging errors.
- **Retry Configuration**: All `request.execute()` calls must include `num_retries=DEFAULT_RETRY_ATTEMPTS` for automatic retry on rate limiting errors (HTTP 429).
- Tags and additional attributes that cannot be retrieved from the default call should be collected and stored for each resource using dedicated methods and threading.
@@ -161,7 +161,7 @@ When you instantiate `Check_Report_GCP`, you must provide the check metadata and
- Defaults to "global" if none are available.
All these attributes can be overridden by passing the corresponding argument to the constructor. If the resource object does not contain the required attributes, you must set them manually.
Other attributes are inherited from the `Check_Report` class, from those you **always** have to set the `status` and `status_extended` attributes in the check logic.
Others attributes are inherited from the `Check_Report` class, from that ones you **always** have to set the `status` and `status_extended` attributes in the check logic.
#### Example Usage
+1 -1
View File
@@ -75,7 +75,7 @@ Remember, our community is here to help! If you need guidance, do not hesitate t
## Setting Up Your Development Environment
## Setting up your development environment
### Prerequisites
+1 -1
View File
@@ -352,7 +352,7 @@ result = await self.api_client.poll_task_until_complete(
### Tool Docstrings
Tool docstrings become the description that is going to be read by the LLM. Provide clear usage instructions and common workflows:
Tool docstrings become description that is going to be read by the LLM. Provide clear usage instructions and common workflows:
```python
async def search_items(self, status: str = Field(...)) -> dict:
+1 -1
View File
@@ -31,7 +31,7 @@ Before implementing a new provider, you need to determine which type it belongs
#### Decision Criteria
Once you have decided the provider you want or need to add to Prowler, the next step is to study how to retrieve data from it. Based on that, the provider will fall into one of the following types: SDK, API or Tool/Wrapper (maybe in the future there will be new types but for now these are the only ones).
Once you have decided the provider you want or need to add to Prowler, the next step is to study how to retrieve data from it. Based on that, the provider will fall into one of the following types: SDK, API or Tool/Wrapper (maybe in the future there will be new types but for now this are the only ones).
**Choose SDK Provider if:**
@@ -658,7 +658,7 @@ uv run pytest -n auto \
tests/lib/outputs/compliance/
```
## Version Handling
## Version handling
Prowler matches frameworks by concatenating `Framework` and `Version`. A missing or empty `Version` collapses several frameworks to the same key and breaks CLI filtering with `--compliance`.
@@ -756,7 +756,7 @@ uv run pytest -n auto tests/lib/check/universal_compliance_models_test.py \
For guidance on writing Prowler SDK tests, refer to [Unit Testing](/developer-guide/unit-testing).
## Running and Listing Your Framework
## Running and listing your framework
Once the file is in place, the CLI auto-discovers it:
@@ -769,7 +769,7 @@ prowler <provider> --compliance <framework_key> --list-compliance-requirements <
For end-user-facing tutorials (recommended for high-profile frameworks), add a dedicated page under `docs/user-guide/compliance/tutorials/` and register it in the `"Compliance"` group of `docs/docs.json`. See `docs/user-guide/compliance/tutorials/threatscore.mdx` as a reference.
## Submitting the Pull Request
## Submitting the pull request
Before opening the pull request:
@@ -794,7 +794,7 @@ The following issues are the most common when contributing a compliance framewor
- **CSV file is missing after the scan (legacy).** The transformer class is not registered in `prowler/lib/outputs/compliance/compliance_output.py`, or `transform()` raises silently. Run the scan with `--log-level DEBUG`.
- **Findings do not roll up under a requirement.** A check listed in `Checks` either does not exist for that provider or is spelled incorrectly. Run `--list-checks | grep <check_name>` to confirm, or run the check-existence cross-check from "Validating Your Framework".
## Reference Examples
## Reference examples
Use the following files as templates when modeling a new contribution.
+4 -4
View File
@@ -9,7 +9,7 @@ First ensure that the provider you want to add the service is already created. I
</Note>
## Introduction
In Prowler, a **service** represents a specific solution or resource offered by one of the supported [Prowler Providers](/developer-guide/provider), for example, [EC2](https://aws.amazon.com/ec2/) in AWS, or [Microsoft Exchange](https://www.microsoft.com/en-us/microsoft-365/exchange/exchange-online) in M365. Services are the building blocks that allow Prowler to interact directly with the various resources exposed by each provider.
In Prowler, a **service** represents a specific solution or resource offered by one of the supported [Prowler Providers](/developer-guide/provider), for example, [EC2](https://aws.amazon.com/ec2/) in AWS, or [Microsoft Exchange](https://www.microsoft.com/en-us/microsoft-365/exchange/exchange-online) in M365. Services are the building blocks that allow Prowler interact directly with the various resources exposed by each provider.
Each service is implemented as a class that encapsulates all the logic, data models, and API interactions required to gather and store information about that service's resources. All of this data is used by the [Prowler checks](/developer-guide/checks) to generate the security findings.
@@ -21,9 +21,9 @@ Within this folder the following files are also to be created:
- `__init__.py` (empty) – Ensures Python recognizes this folder as a package.
- `<new_service_name>_service.py` – Contains all the logic and API calls of the service.
- `<new_service_name>_client.py` – Contains the initialization of the freshly created service's class so that the checks can use it.
- `<new_service_name>_client_.py` – Contains the initialization of the freshly created service's class so that the checks can use it.
Once the files are created, you can check that the service has been created by running the following command: `uv run python prowler-cli.py <provider> --list-services | grep <new_service_name>`.
Once the files are create, you can check that the service has been created by running the following command: `uv run python prowler-cli.py <provider> --list-services | grep <new_service_name>`.
## Service Structure and Initialisation
@@ -31,7 +31,7 @@ The Prowler's service structure is as outlined below. To initialise it, just imp
### Service Base Class
All Prowler provider services should inherit from a common base class to avoid code duplication. This base class handles initialization and storage of functions and objects needed across services. The exact implementation depends on the provider's API requirements, but the following are the most common responsibilities:
All Prowler provider service should inherit from a common base class to avoid code duplication. This base class handles initialization and storage of functions and objects needed across services. The exact implementation depends on the provider's API requirements, but the following are the most common responsibilities:
- Initialize/store clients to interact with the provider's API.
- Store the audit and fixer configuration.
+1
View File
@@ -143,6 +143,7 @@
"group": "Prowler Cloud",
"pages": [
"user-guide/tutorials/prowler-app",
"user-guide/tutorials/prowler-cloud-feedback",
{
"group": "Authentication & Access",
"pages": [
@@ -16,7 +16,7 @@ prowler <provider>
![Prowler Execution](/images/short-display.png)
<Note>
Running the `prowler` command without options will use environment variable credentials. Refer to the Authentication section of each provider for credential configuration details.
Running the `prowler` command without options will uses environment variable credentials. Refer to the Authentication section of each provider for credential configuration details.
</Note>
## Verbose Output
@@ -6,7 +6,7 @@ title: 'Microsoft Defender for Cloud'
---
## Overview
## **Overview**
If you're using Microsoft Defender for Cloud to monitor your Azure infrastructure, Prowler can complement it with fully transparent, customizable scans across Azure, AWS, GCP, and Kubernetes. Prowler helps you validate policies, automate compliance, and gain deeper visibility—all from the CLI, API or our Prowler UI.
@@ -19,7 +19,7 @@ You can run Prowler alongside Defender for Cloud to:
---
## Why Use Prowler with Defender for Cloud
## **Why use Prowler with Defender for Cloud**
Microsoft Defender for Cloud offers centralized dashboards, alerting, and some cross-cloud coverage. Prowler provides full transparency and control over what’s being checked and how those checks work—no vendor lock-in, no surprises.
@@ -32,11 +32,11 @@ Use them together to get:
---
## Quickstart
## **Quickstart**
Here’s how to install Prowler and run a scan in your Azure account.
### 1\. Install Prowler
### **1\. Install Prowler**
```
git clone https://github.com/prowler-cloud/prowler
@@ -44,7 +44,7 @@ cd prowler
./install.sh
```
### 2\. Authenticate with Azure
### **2\. Authenticate with Azure**
Make sure you're signed in and select your subscription:
@@ -53,7 +53,7 @@ az login
export AZURE_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
```
### 3\. Run a Scan
### **3\. Run a scan**
```
./prowler -p Azure -f az-aks -f az-general
@@ -61,7 +61,7 @@ export AZURE_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
This will run checks focused on Azure Kubernetes Service (AKS) and general Azure best practices.
### 4\. Review Results
### **4\. Review results**
```
cat output/prowler-output-*.json
@@ -72,7 +72,7 @@ You can export findings in JSON, CSV, JUnit, HTML, or AWS Security Hub–compati
---
## Compare Capabilities
## **Compare capabilities**
| Feature | Microsoft Defender for Cloud | Prowler |
| ----- | ----- | ----- |
@@ -86,7 +86,7 @@ You can export findings in JSON, CSV, JUnit, HTML, or AWS Security Hub–compati
---
## Common Use Cases
## **Common use cases**
**✅ Validate policies**
Run Prowler to confirm your Azure policies are configured as expected and compliant with frameworks like CIS or NIST.
@@ -178,9 +178,9 @@ The available versions of Prowler Local Server are the following:
- `v4-latest`: in sync with `v4` branch (please note that it is not a stable version)
- `v3-latest`: in sync with `v3` branch (please note that it is not a stable version)
- `<x.y.z>` (release): you can find the releases [here](https://github.com/prowler-cloud/prowler/releases), those are stable releases.
- `stable`: this tag always points to the latest release.
- `v4-stable`: this tag always points to the latest release for v4.
- `v3-stable`: this tag always points to the latest release for v3.
- `stable`: this tag always point to the latest release.
- `v4-stable`: this tag always point to the latest release for v4.
- `v3-stable`: this tag always point to the latest release for v3.
The container images are available here:
@@ -234,9 +234,9 @@ The available versions of Prowler CLI are the following:
- `v4-latest`: in sync with `v4` branch (please note that it is not a stable version)
- `v3-latest`: in sync with `v3` branch (please note that it is not a stable version)
- `<x.y.z>` (release): you can find the releases [here](https://github.com/prowler-cloud/prowler/releases), those are stable releases.
- `stable`: this tag always points to the latest release.
- `v4-stable`: this tag always points to the latest release for v4.
- `v3-stable`: this tag always points to the latest release for v3.
- `stable`: this tag always point to the latest release.
- `v4-stable`: this tag always point to the latest release for v4.
- `v3-stable`: this tag always point to the latest release for v3.
The container images are available here:
@@ -4,7 +4,7 @@ title: "AWS Marketplace"
This section contains the instructions to subscribe to **Prowler Cloud** through the **AWS Marketplace**.
## How to Subscribe
## How to subscribe
To get to the **Prowler Cloud** product listing in the AWS Marketplace, and click the `View purchase options` button:
@@ -16,15 +16,15 @@ To get to the **Prowler Cloud** product listing in the AWS Marketplace, and clic
![](/images/aws-marketplace/marketplace-subscribe.png)
## Set Up Your Account
## Set up your account
After you have subscribed to the **Prowler Cloud** product, you will need to set up your **Prowler Cloud** account:
1. Click the `Set up your account` button:
1. Click the `Set up your account` button:
![](/images/aws-marketplace/marketplace-message.png)
2. You will be redirected to **Prowler Cloud Sign In** page. You can sign in with an existing account or sign up with a new account:
2. You will be redirected to **Prowler Cloud Sign In** page. You can sign in with an exsiting account or sign up with a new account.:
![](/images/aws-marketplace/marketplace-sign-up.png)
@@ -4,7 +4,7 @@ title: "Overview"
[Prowler Cloud](https://prowler.com) makes Cloud Security easy and enables your team to build trust in their deployed services and applications.
Prowler Cloud automates scanning single or multiple accounts and has all of the benefits of Prowler Open Source, plus hands-off continuous monitoring, auto-scaling workers for faster execution, integrations, personalized support options and out of the box social authentication.
Prowler Cloud Automates scanning single or multiple accounts and has all of the benefits of Prowler Open Source, plus hands-off continuous monitoring, auto-scaling workers for faster execution, integrations, personalized support options and out of the box social authentication.
![](/images/products/overview.png)
@@ -96,7 +96,7 @@ Lighthouse AI supports three providers:
For detailed configuration instructions, see [Using Multiple LLM Providers with Lighthouse](/user-guide/tutorials/prowler-app-lighthouse-multi-llm).
**2. Why don't some models appear in Lighthouse AI?**
**2. Why some models don't appear in Lighthouse AI?**
LLM providers offer different types of models. Not every model can be integrated with Lighthouse AI (for example, text-to-speech, vision, embedding, computer use, etc.).
Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

+1 -1
View File
@@ -94,7 +94,7 @@ Prowler supports a wide range of providers organized by category:
For more information about the checks and compliance of each provider, visit [Prowler Hub](https://hub.prowler.com).
## Where to Go Next?
## Where to go next?
<Columns cols={2}>
<Card title="User Guide" icon="terminal" href="/user-guide/tutorials/prowler-app">
+1
View File
@@ -94,6 +94,7 @@ li[id="/user-guide/tutorials/prowler-app-findings-triage"] a > div > div > span:
li[id="/user-guide/tutorials/prowler-app-scan-configuration"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-cloud-aws-organizations"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-cloud-azure-management-groups"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-cloud-feedback"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-cloud-gcp-organizations"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-cloud-lighthouse-multi-llm"] a > div > div > span:first-child::after,
li[id="/user-guide/tutorials/prowler-import-findings"] a > div > div > span:first-child::after,
+1 -1
View File
@@ -168,7 +168,7 @@ A `.codex/config.toml` inside a project is loaded **only when the project is tru
### Tools Do Not Appear After Editing the Config
Restart Codex. Configuration is read at startup. In the app, quit completely and reopen it, sometimes just closing the window is not enough.
Restart Codex. Configuration is read at startup. In the app, quit completely and reopen it, sometimes just clous the window is not enough.
## Next Steps
+3 -3
View File
@@ -36,7 +36,7 @@ This page allows for multiple functions:
- Apply filters:
- Assessment Date
- Assesment Date
- Account
- Region
- Severity
@@ -45,7 +45,7 @@ This page allows for multiple functions:
- Status
- Category
- See which files have been scanned to generate the dashboard by placing your mouse on the `?` icon:
- See which files has been scanned to generate the dashboard by placing your mouse on the `?` icon:
{" "}
<img src="/images/cli/dashboard/dashboard-files-scanned.png" />
@@ -67,7 +67,7 @@ This page shows all the info related to the compliance selected. Multiple filter
To add your own compliance to compliance page, add a file with the compliance name (using `_` instead of `.`) to the path `/dashboard/compliance`.
In this file use the format present in the other compliance files to create the table. Example for CIS 2.0:
In this file use the format present in the others compliance files to create the table. Example for CIS 2.0:
```python
import warnings
@@ -37,5 +37,5 @@ To configure the Slack Integration, follow the next steps:
![Slack App Channel Integration](/images/cli/integrate-slack-app.png)
4. Set the following environment variables that Prowler will read:
- `SLACK_API_TOKEN`: the *Slack App OAuth Token* that was previously obtained.
- `SLACK_API_TOKEN`: the *Slack App OAuth Token* that was previously get.
- `SLACK_CHANNEL_NAME`: the name of your Slack Channel where Prowler will send the message.
+1 -1
View File
@@ -2,7 +2,7 @@
title: 'Logging'
---
Prowler has a logging feature to be as transparent as possible, so that you can see every action that is being performed whilst the tool is being executed.
Prowler has a logging feature to be as transparent as possible, so that you can see every action that is being performed whilst the tool is being executing.
## Set Log Level
+2 -2
View File
@@ -318,7 +318,7 @@ The DynamoDB Table must have the following String keys:
The Mutelist Table must have the following columns:
- Accounts (String): This field can contain either an Account ID or an `*` (which applies to all the accounts that use this table as a mutelist).
- Accounts (String): This field can contain either an Account ID or an `*` (which applies to all the accounts that use this table as an mutelist).
- Checks (String): This field can contain either a Prowler Check Name or an `*` (which applies to all the scanned checks).
@@ -358,7 +358,7 @@ Make sure that the credentials that Prowler uses can invoke the Lambda Function:
Resource: arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME
```
The Lambda Function can then generate a Mutelist dynamically. Here is the code of an example Python Lambda Function that generates a Mutelist:
The Lambda Function can then generate an Mutelist dynamically. Here is the code an example Python Lambda Function that generates an Mutelist:
```
def handler(event, context):
@@ -133,9 +133,9 @@ Write-Host "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - All jobs completed"
Output will be stored in `C:\Users\YOUR-USER\Documents\output\`
## Combining the Output Files
## Combining the output files
Guidance is provided for the CSV file format. From the output directory, execute either the following Bash or PowerShell script. The script will collect the output from the CSV files, only include the header from the first file, and then output the result as CombinedCSV.csv in the current working directory.
Guidance is provided for the CSV file format. From the ouput directory, execute either the following Bash or PowerShell script. The script will collect the output from the CSV files, only include the header from the first file, and then output the result as CombinedCSV.csv in the current working directory.
There is no logic implemented in terms of which CSV files it will combine. If you have additional CSV files from other actions, such as running a quick inventory, you will need to move that out of the current (or any nested) directory, or move the output you want to combine into its own folder and run the script from there.
@@ -18,7 +18,7 @@ Currently, it is only available for AWS provider.
By default, it extracts resources from all the regions, you could use `-f`/`--filter-region` to specify the regions to execute the analysis.
</Note>
- This feature specifies both the number of resources for each service and for each resource type.
- This feature specify both the number of resources for each service and for each resource type.
- Also, it creates by default a CSV and JSON to see detailed information about the resources extracted.
+1 -1
View File
@@ -49,7 +49,7 @@ prowler <provider> -M csv json-ocsf json-asff -o <custom_report_directory>
Both flags can be used simultaneously to provide a custom directory and filename. `console prowler <provider> -M csv json-ocsf json-asff \ -F <custom_report_name> -o <custom_report_directory>`
</Note>
## Output Timestamp Format
## Output timestamp format
By default, the timestamp format of the output files is ISO 8601. This can be changed with the flag `--unix-timestamp` generating the timestamp fields in pure unix timestamp format.
@@ -49,6 +49,6 @@ For testing or modifying Prowler's behavior, use the following steps to confirm
* Run prowler with `--log-level DEBUG` and `--log-file debuglogs.txt`
* Search for retry attempts using `grep -i 'Retry needed' debuglogs.txt`
This approach follows the [AWS documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/retries.html#checking-retry-attempts-in-your-client-logs), which states that if a retry is performed, a message starting with "Retry needed" will be prompted.
This approach follows the [AWS documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/retries.html#checking-retry-attempts-in-your-client-logs), which states that if a retry is performed, a message starting with "Retry needed” will be prompted.
It is possible to determine the total number of calls made using `grep -i 'Sending http request' debuglogs.txt | wc -l`
+1 -1
View File
@@ -2,7 +2,7 @@
title: 'Installing Prowler in AWS CloudShell'
---
## Following the Migration of AWS CloudShell from Amazon Linux 2 to Amazon Linux 2023
## Following the migration of AWS CloudShell from Amazon Linux 2 to Amazon Linux 2023
AWS CloudShell has migrated from Amazon Linux 2 to Amazon Linux 2023 [[1]](https://aws.amazon.com/about-aws/whats-new/2023/12/aws-cloudshell-migrated-al2023/) [[2]](https://docs.aws.amazon.com/cloudshell/latest/userguide/cloudshell-AL2023-migration.html). With this transition, Python 3.9 is now included by default in AL2023, eliminating the need for manual compilation.
@@ -16,7 +16,7 @@ To scan specific accounts one at a time:
ACCOUNTS_LIST='11111111111 2222222222 333333333'
```
- Run Prowler with an IAM role that exists in all target accounts: (replace the `<role_name>` with yours, that is to be consistent throughout all accounts):
- Run Prowler with an IAM role that exists in all target accounts: (replace the `<role_name>` with to yours, that is to be consistent throughout all accounts):
```
ROLE_TO_ASSUME=<role_name>
@@ -35,7 +35,7 @@ Define the AWS accounts to be scanned with a variable:
ACCOUNTS_LIST='11111111111 2222222222 333333333'
```
- Run Prowler with an IAM role that exists in all target accounts: (replace the `<role_name>` with yours, that is to be consistent throughout all accounts). The following example executes scanning across three accounts in parallel:
- Run Prowler with an IAM role that exists in all target accounts: (replace the `<role_name>` with to yours, that is to be consistent throughout all accounts). The following example executes scanning across three accounts in parallel:
```
ROLE_TO_ASSUME=<role_name>
@@ -78,7 +78,7 @@ aws securityhub enable-import-findings-for-product --region eu-west-1 --product-
```
<Note>
Specify the AWS region where you want to enable the integration. Ensure the region is correctly set within the ARN value. This command requires the `securityhub:EnableImportFindingsForProduct` permission.
Specify the AWS region where you want to enable the integration. Ensure the region is correctly set within the ARN value. This command requires the`securityhub:securityhub:EnableImportFindingsForProduct` permission.
</Note>
## Sending Findings to AWS Security Hub
@@ -100,7 +100,7 @@ prowler --security-hub --region eu-west-1
<Note>
It is recommended to send only fails to Security Hub and that is possible adding `--status FAIL` to the command. You can use, instead of the `--status FAIL` argument, the `--send-sh-only-fails` argument to save all the findings in the Prowler outputs but just to send FAIL findings to AWS Security Hub.
Since Prowler performs checks to all regions by default you may need to filter by region when running Security Hub integration, as shown in the example above. Remember to enable Security Hub in the region or regions you need by calling `aws securityhub enable-security-hub --region <region>` and run Prowler with the option `-f/--region <region>` (if no region is used it will try to push findings in all regions hubs). Prowler will send findings to the Security Hub on the region where the scanned resource is located.
Since Prowler perform checks to all regions by default you may need to filter by region when running Security Hub integration, as shown in the example above. Remember to enable Security Hub in the region or regions you need by calling `aws securityhub enable-security-hub --region <region>` and run Prowler with the option `-f/--region <region>` (if no region is used it will try to push findings in all regions hubs). Prowler will send findings to the Security Hub on the region where the scanned resource is located.
To have updated findings in Security Hub you have to run Prowler periodically. Once a day or every certain amount of hours.
@@ -19,7 +19,7 @@ checks_v4_v3_to_v2_mapping = {
"apigateway_restapi_public": "extra745",
"apigateway_restapi_logging_enabled": "extra722",
"apigateway_restapi_waf_acl_attached": "extra744",
"apigatewayv2_api_access_logging_enabled": "extra7156",
“apigatewayv2_api_access_logging_enabled": "extra7156",
"apigatewayv2_api_authorizers_enabled": "extra7157",
"appstream_fleet_default_internet_access_disabled": "extra7193",
"appstream_fleet_maximum_session_duration": "extra7190",
@@ -145,7 +145,7 @@ The checks requiring this `ProwlerRole` can be found in this [section](/user-gui
1. To create a new custom role, open a terminal and execute the following command:
```console
az role definition create --role-definition '{
az role definition create --role-definition '{ 640ms  lun 16 dic 17:04:17 2024
"Name": "ProwlerRole",
"IsCustom": true,
"Description": "Role used for checks that require read-only access to Azure resources and are not covered by the Reader role.",
@@ -551,7 +551,7 @@ Installing PowerShell is different depending on your OS:
</Tab>
<Tab title="Docker">
[Docker](https://learn.microsoft.com/es-es/powershell/scripting/install/powershell-in-docker?view=powershell-7.5#use-powershell-in-a-container): The following command downloads the latest stable versions of PowerShell:
[Docker](https://learn.microsoft.com/es-es/powershell/scripting/install/powershell-in-docker?view=powershell-7.5#use-powershell-in-a-container): The following command download the latest stable versions of PowerShell:
```console
docker pull mcr.microsoft.com/dotnet/sdk:9.0
@@ -13,4 +13,4 @@ To learn more about how to install PowerShell and which versions are supported,
## Required Modules
The necessary modules will not be installed automatically by Prowler. Nevertheless, if you want Prowler to install them for you, you can execute the provider with the flag `--init-modules`, which will run the script to install and import them.
If you want to learn more about this process or you are running into some issues with this, click [here](/user-guide/providers/microsoft365/authentication#required-powershell-modules).
If you want to learn more about this process or you are running some issues with this, click [here](/user-guide/providers/microsoft365/authentication#required-powershell-modules).
@@ -14,7 +14,7 @@ Prowler for Scaleway scans IAM resources in your Scaleway organization for secur
Prowler authenticates to Scaleway with a Scaleway API key. See [Scaleway Authentication in Prowler](./authentication) for the full setup, environment variables, CLI flags, and required permissions.
## Run a Scan
## Run a scan
```bash
export SCW_ACCESS_KEY="SCW..."
@@ -30,7 +30,7 @@ To run only the IAM root-key check:
prowler scaleway --check iam_api_keys_no_root_owned
```
## Checks Shipped
## Checks shipped
| Check ID | Severity | Description |
|---|---|---|
@@ -166,7 +166,7 @@ Mutelist:
- "*"
Resources:
- "app-vnet-peering-*"
Description: "Mute App Function Vnet findings related with the resources pattern"
Description: "Mute App Function Vnet findings related with the reources pattern"
```
#### Azure Resource Group Muting
@@ -69,7 +69,7 @@ To remove **another** user from your organization, use the [_Expel from organiza
#### Inviting Users
<Note>
Please be aware that at this time, an email address can only be associated with a single Prowler account.
Please be aware that at this time, an email address can only be associated with a single Prowler account_.
</Note>
Follow these steps to invite a user to your account:
+1 -1
View File
@@ -142,7 +142,7 @@ To download these files, click the **Download** button. This button becomes avai
<img src="/images/download_output.png" alt="Download output" width="700" />
The `zip` file unpacks into a folder named like `prowler-output-<provider_id>-<timestamp>`, which includes all of the above outputs. In the example below, you can see the `.csv`, `.json`, and `.html` reports alongside a subfolder for detailed compliance checks.
The `zip` file unpacks into a folder named like `prowler-output-<provider_id>-<timestamp>`, which includes all of the above outputs. In the example below, you can see the `.csv`, .`json`, and `.html` reports alongside a subfolder for detailed compliance checks.
<img src="/images/output_folder.png" alt="Output folder" width="700" />
@@ -0,0 +1,65 @@
---
title: 'Share Product Feedback'
sidebarTitle: 'Share Feedback'
description: 'Send product feedback from the floating Feedback widget in Prowler Cloud.'
---
import { VersionBadge } from "/snippets/version-badge.mdx"
<VersionBadge version="5.37.0" />
Prowler Cloud provides a floating **Feedback** button for sending product feedback without leaving the current page. The button opens a short free-text form and confirms when the response has been submitted.
<Note>
The widget appears only in Prowler Cloud when feedback collection and a compatible survey are available. It does not appear in Prowler Local Server. The question, supporting text, input placeholder, submit button text, and confirmation message can change over time.
</Note>
## Send Feedback
To submit product feedback:
1. Sign in to Prowler Cloud.
2. Locate the floating **Feedback** button near the lower-right corner of the page.
3. Click **Feedback** to open the form.
4. Enter the feedback in the text area.
5. Click the submit button. The button remains unavailable until the response contains text other than spaces.
6. Wait for the confirmation message to replace the form. If no custom confirmation is configured, Prowler displays **"Thanks for the feedback!"**.
<Frame>
<img src="/images/feedback/feedback-widget-form.png" alt="Feedback form open in Prowler Cloud" />
</Frame>
<Frame>
<img src="/images/feedback/feedback-widget-confirmation.png" alt="Feedback submission confirmation in Prowler Cloud" />
</Frame>
The widget stays available while navigating authenticated Prowler Cloud pages, so feedback can be submitted from the page where the relevant experience occurs.
<Warning>
Do not include passwords, API keys, access tokens, or other sensitive information. For account assistance or an issue that requires a response, contact [Prowler Support](https://support.prowler.com). The feedback widget does not open a support request.
</Warning>
## Dismiss the Form Without Submitting
To close the form without sending a response, press **Esc**, click outside the form, or click **Feedback** again. Reopening the form clears any text that was not submitted.
## Troubleshooting
### The Feedback Button Does Not Appear
The widget is available only after signing in to a supported Prowler Cloud environment. If the button is absent:
1. Confirm that Prowler Cloud is open on an authenticated page. The widget is not available on sign-in or other public pages.
2. Reload the page to request the current feedback survey again.
3. Check whether a browser privacy extension or network policy blocks optional feedback services, then reload the page.
4. Contact [Prowler Support](https://support.prowler.com) if the widget should be available but remains absent.
The button also remains hidden when feedback collection is disabled or no compatible free-text survey is currently available. These conditions are managed by Prowler and do not require users to configure tokens or deployment settings.
### The Submit Button Is Unavailable
Enter at least one non-space character in the text area. Empty responses and responses containing only spaces cannot be submitted.
### The Form Does Not Confirm Submission
Reload Prowler Cloud, reopen the widget, and submit the feedback again. If the form still does not show a confirmation message, contact [Prowler Support](https://support.prowler.com) and include the page where the problem occurred. Do not include credentials or other sensitive information.
@@ -17,7 +17,7 @@ checks_v4_v3_to_v2_mapping = {
"apigateway_restapi_public": "extra745",
"apigateway_restapi_logging_enabled": "extra722",
"apigateway_restapi_waf_acl_attached": "extra744",
"apigatewayv2_api_access_logging_enabled": "extra7156",
“apigatewayv2_api_access_logging_enabled": "extra7156",
"apigatewayv2_api_authorizers_enabled": "extra7157",
"appstream_fleet_default_internet_access_disabled": "extra7193",
"appstream_fleet_maximum_session_duration": "extra7190",
-19
View File
@@ -4,25 +4,6 @@ All notable changes to the **Prowler MCP Server** are documented in this file.
<!-- changelog: release notes start -->
## [0.9.0] (Prowler v5.37.0)
### 🚀 Added
- Read-only user management tools `prowler_list_users`, `prowler_get_user`, and `prowler_get_current_user` for listing tenant users with their emails and identifying the authenticated user [(#12088)](https://github.com/prowler-cloud/prowler/pull/12088)
- RBAC role tools `prowler_list_roles`, `prowler_get_role`, `prowler_get_user_roles`, and `prowler_set_user_role` for browsing roles and setting the role a user holds [(#12088)](https://github.com/prowler-cloud/prowler/pull/12088)
- Integrations tools to manage Amazon S3, AWS Security Hub and Jira integrations, and to send findings to Jira [(#12138)](https://github.com/prowler-cloud/prowler/pull/12138)
### 🔄 Changed
- README now documents the Cloud-only `prowler_cloud_*` tools available on the hosted Prowler MCP (alerts, findings triage, scan scheduling, scan configurations), and corrects the Prowler Hub check count and the scan orchestration capabilities [(#12266)](https://github.com/prowler-cloud/prowler/pull/12266)
### 🐞 Fixed
- Memory leak in HTTP mode caused by streamable-HTTP sessions being retained for the process lifetime when clients never sent `DELETE /mcp`; the server now runs stateless [(#12235)](https://github.com/prowler-cloud/prowler/pull/12235)
- `prowler_list_integrations` failing with a 500 error on tenants with a Jira integration, caused by the request leaving `configuration` out of the sparse fieldset [(#12259)](https://github.com/prowler-cloud/prowler/pull/12259)
---
## [0.8.0] (Prowler v5.35.0)
### 🔄 Changed
@@ -0,0 +1 @@
Integrations tools to manage Amazon S3, AWS Security Hub and Jira integrations, and to send findings to Jira
@@ -0,0 +1 @@
`prowler_list_integrations` failing with a 500 error on tenants with a Jira integration, caused by the request leaving `configuration` out of the sparse fieldset
@@ -0,0 +1 @@
README now documents the Cloud-only `prowler_cloud_*` tools available on the hosted Prowler MCP (alerts, findings triage, scan scheduling, scan configurations), and corrects the Prowler Hub check count and the scan orchestration capabilities
@@ -0,0 +1 @@
Memory leak in HTTP mode caused by streamable-HTTP sessions being retained for the process lifetime when clients never sent `DELETE /mcp`; the server now runs stateless
@@ -0,0 +1 @@
RBAC role tools `prowler_list_roles`, `prowler_get_role`, `prowler_get_user_roles`, and `prowler_set_user_role` for browsing roles and setting the role a user holds
@@ -0,0 +1 @@
Read-only user management tools `prowler_list_users`, `prowler_get_user`, and `prowler_get_current_user` for listing tenant users with their emails and identifying the authenticated user
-26
View File
@@ -4,32 +4,6 @@ All notable changes to the **Prowler SDK** are documented in this file.
<!-- changelog: release notes start -->
## [5.37.0] (Prowler v5.37.0)
### 🚀 Added
- OCSF detection finding output now populates `finding_info.analytic` as the Prowler check rule and `finding_info.attacks` as MITRE ATT&CK technique and tactic objects for findings with MITRE-ATTACK compliance metadata [(#11492)](https://github.com/prowler-cloud/prowler/pull/11492)
- `codecommit` service and `codecommit_repository_no_secrets` check for AWS provider, scanning files tracked at the tip of each repository's default branch for hardcoded secrets [(#11846)](https://github.com/prowler-cloud/prowler/pull/11846)
- Huawei Cloud provider, with CTS, ECS, ELB, EVS, IAM, KMS, OBS, RDS, VPC and WAF services and a CIS 1.0 compliance benchmark [(#11950)](https://github.com/prowler-cloud/prowler/pull/11950)
- `glue_catalog_connection_no_secrets` check to detect secrets in Glue Data Catalog connection properties [(#11963)](https://github.com/prowler-cloud/prowler/pull/11963)
- `ec2_instance_stopped_older_than_specific_days` check for AWS provider, detecting EC2 instances stopped longer than a configurable number of days (default 30) [(#12076)](https://github.com/prowler-cloud/prowler/pull/12076)
- `sagemaker_endpoint_config_kms_encryption_enabled` check verifying SageMaker endpoint configurations use a KMS key for storage volume encryption [(#12118)](https://github.com/prowler-cloud/prowler/pull/12118)
- 11 AWS Nitro Enclaves security checks providing the first CSPM coverage for confidential computing workloads, covering both host environment (`ec2_confidential_workload_host_*`) and KMS attestation policy (`kms_key_enclave_*`), fully passive via boto3 and CloudTrail LookupEvents [(#12283)](https://github.com/prowler-cloud/prowler/pull/12283)
### 🐞 Fixed
- Scan configuration schema no longer exposes SDK/CLI-only providers such as `e2enetworks`; the aggregated schema served by `/scan-configurations/schema` now includes only app providers (`sdk_only = False`) [(#12094)](https://github.com/prowler-cloud/prowler/pull/12094)
- GCP Cloud Functions gen2 IAM policy retrieval now uses a per-request HTTP client, preventing a process crash from concurrent thread-unsafe `httplib2` access when a project has several gen2 functions [(#12107)](https://github.com/prowler-cloud/prowler/pull/12107)
- GCP firewall SSH and RDP checks now detect exposed target ports in any position within multi-port rules [(#12115)](https://github.com/prowler-cloud/prowler/pull/12115)
- Secret ignore patterns now use Kingfisher-compatible LF line indexing for scanned content containing ASCII control characters [(#12141)](https://github.com/prowler-cloud/prowler/pull/12141)
- Jira descriptions with inline code nested in bold or italic Markdown now render as valid ADF [(#12158)](https://github.com/prowler-cloud/prowler/pull/12158)
### 🔐 Security
- HTML reports escape provider-originated finding fields to prevent stored cross-site scripting through malicious cloud resource tags [(#12221)](https://github.com/prowler-cloud/prowler/pull/12221)
---
## [5.36.0] (Prowler v5.36.0)
### 🚀 Added
@@ -0,0 +1 @@
`codecommit` service and `codecommit_repository_no_secrets` check for AWS provider, scanning files tracked at the tip of each repository's default branch for hardcoded secrets
@@ -0,0 +1 @@
`ec2_instance_stopped_older_than_specific_days` check for AWS provider, detecting EC2 instances stopped longer than a configurable number of days (default 30)
@@ -0,0 +1 @@
GCP Cloud Functions gen2 IAM policy retrieval now uses a per-request HTTP client, preventing a process crash from concurrent thread-unsafe `httplib2` access when a project has several gen2 functions
@@ -0,0 +1 @@
GCP firewall SSH and RDP checks now detect exposed target ports in any position within multi-port rules
@@ -0,0 +1 @@
Add glue_catalog_connection_no_secrets check to detect secrets in Glue Data Catalog connection properties
@@ -0,0 +1 @@
HTML reports escape provider-originated finding fields to prevent stored cross-site scripting through malicious cloud resource tags
@@ -0,0 +1 @@
Support for the Huawei Cloud provider, with CTS, ECS, ELB, EVS, IAM, KMS, OBS, RDS, VPC and WAF services and a CIS 1.0 compliance benchmark
@@ -0,0 +1 @@
Jira descriptions with inline code nested in bold or italic Markdown now render as valid ADF
@@ -0,0 +1 @@
Secret ignore patterns now use Kingfisher-compatible LF line indexing for scanned content containing ASCII control characters
@@ -0,0 +1 @@
OCSF detection finding output now populates `finding_info.analytic` as the Prowler check rule and `finding_info.attacks` as MITRE ATT&CK technique and tactic objects for findings with MITRE-ATTACK compliance metadata
@@ -0,0 +1 @@
`sagemaker_endpoint_config_kms_encryption_enabled` check verifying SageMaker endpoint configurations use a KMS key for storage volume encryption
@@ -0,0 +1 @@
Scan configuration schema no longer exposes SDK/CLI-only providers such as `e2enetworks`; the aggregated schema served by `/scan-configurations/schema` now includes only app providers (`sdk_only = False`)
@@ -187,15 +187,10 @@
"Section": "Infrastructure Security",
"SubSection": "Compute Isolation",
"Service": "ec2",
"Type": "Automated"
"Type": "Manual"
}
],
"Checks": [
"kms_key_enclave_attestation_not_enforced",
"kms_key_enclave_attestation_bypassable_path",
"kms_key_enclave_attestation_no_deployment_binding",
"kms_key_enclave_attestation_pcr_mismatch"
]
"Checks": []
},
{
"Id": "AISF-IAM-01",
@@ -904,9 +899,7 @@
"Checks": [
"cloudtrail_threat_detection_llm_jacking",
"cloudtrail_threat_detection_privilege_escalation",
"cloudtrail_threat_detection_enumeration",
"kms_key_enclave_debug_attestation_detected",
"kms_key_enclave_attestation_unknown_image"
"cloudtrail_threat_detection_enumeration"
]
},
{
@@ -53,8 +53,7 @@
"opensearch_service_domains_audit_logging_enabled",
"opensearch_service_domains_cloudwatch_logging_enabled",
"rds_instance_enhanced_monitoring_enabled",
"rds_instance_integration_cloudwatch_logs",
"ec2_confidential_workload_host_not_running"
"rds_instance_integration_cloudwatch_logs"
]
},
{
@@ -324,8 +324,7 @@
"Checks": [
"ec2_instance_imdsv2_enabled",
"ec2_instance_profile_attached",
"cloudwatch_cross_account_sharing_disabled",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"cloudwatch_cross_account_sharing_disabled"
]
},
{
@@ -498,8 +497,7 @@
"sqs_queues_not_publicly_accessible",
"ssm_documents_set_as_public",
"ec2_securitygroup_allow_wide_open_public_ipv4",
"ec2_ami_public",
"ec2_confidential_workload_host_public_ip"
"ec2_ami_public"
]
},
{
@@ -835,8 +833,7 @@
"ec2_instance_internet_facing_with_instance_profile",
"opensearch_service_domains_updated_to_the_latest_service_software_version",
"redshift_cluster_automatic_upgrades",
"ssm_managed_compliant_patching",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"ssm_managed_compliant_patching"
]
},
{
+4 -8
View File
@@ -2439,8 +2439,7 @@
"ssm_documents_set_as_public",
"vpc_subnet_no_public_ip_by_default",
"vpc_subnet_separate_private_public",
"workspaces_vpc_2private_1public_subnets_nat",
"ec2_confidential_workload_host_public_ip"
"workspaces_vpc_2private_1public_subnets_nat"
]
},
{
@@ -6730,8 +6729,7 @@
"kms_cmk_not_deleted_unintentionally",
"kms_cmk_not_multi_region",
"kms_key_not_publicly_accessible",
"ec2_ebs_volume_encryption",
"kms_key_enclave_attestation_not_enforced"
"ec2_ebs_volume_encryption"
],
"ConfigRequirements": [
{
@@ -6842,8 +6840,7 @@
"kms_cmk_rotation_enabled",
"kms_key_not_publicly_accessible",
"s3_bucket_kms_encryption",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_attestation_not_enforced"
"sns_topics_kms_encryption_at_rest_enabled"
]
},
{
@@ -7788,8 +7785,7 @@
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_postgres_5432",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_redis_6379",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_sql_server_1433_1434",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_telnet_23",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_telnet_23"
]
},
{
+3 -6
View File
@@ -1258,8 +1258,7 @@
"Checks": [
"ec2_securitygroup_allow_ingress_from_internet_to_all_ports",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_3389",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_3389"
],
"Attributes": [
{
@@ -1282,8 +1281,7 @@
"Checks": [
"ec2_securitygroup_allow_ingress_from_internet_to_all_ports",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_3389",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_3389"
],
"Attributes": [
{
@@ -1346,8 +1344,7 @@
"Id": "5.6",
"Description": "Ensure that EC2 Metadata Service only allows IMDSv2",
"Checks": [
"ec2_instance_imdsv2_enabled",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"ec2_instance_imdsv2_enabled"
],
"Attributes": [
{
+4 -11
View File
@@ -2289,8 +2289,7 @@
}
],
"Checks": [
"ec2_securitygroup_allow_ingress_from_internet_to_all_ports",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_securitygroup_allow_ingress_from_internet_to_all_ports"
]
},
{
@@ -4328,9 +4327,7 @@
"Dependencias": []
}
],
"Checks": [
"kms_key_enclave_attestation_not_enforced"
]
"Checks": []
},
{
"Id": "op.exp.10.aws.cmk.7",
@@ -4354,9 +4351,7 @@
"Dependencias": []
}
],
"Checks": [
"kms_key_enclave_attestation_bypassable_path"
]
"Checks": []
},
{
"Id": "op.exp.10.aws.cmk.8",
@@ -4380,9 +4375,7 @@
"Dependencias": []
}
],
"Checks": [
"kms_key_enclave_attestation_pcr_mismatch"
]
"Checks": []
},
{
"Id": "op.cont.2.aws.az.1",
@@ -79,8 +79,7 @@
"rds_cluster_multi_az",
"vpc_subnet_auto_assign_public_ip_disabled",
"vpc_default_security_group_restricts_traffic",
"vpc_peering_connection_routing_tables_with_least_privilege",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"vpc_peering_connection_routing_tables_with_least_privilege"
]
},
{
@@ -203,9 +202,7 @@
"redshift_cluster_audit_logging",
"s3_bucket_server_access_logging_enabled",
"vpc_flow_logs_enabled",
"wafv2_webacl_logging_enabled",
"kms_key_enclave_debug_attestation_detected",
"kms_key_enclave_attestation_unknown_image"
"wafv2_webacl_logging_enabled"
]
},
{
@@ -313,8 +310,7 @@
"s3_bucket_secure_transport_policy",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"sqs_queue_server_side_encryption_enabled",
"kms_key_enclave_attestation_not_enforced"
"sqs_queue_server_side_encryption_enabled"
]
},
{
@@ -313,9 +313,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_not_enforced"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -345,8 +343,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -427,9 +424,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_bypassable_path"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -759,8 +754,7 @@
"guardduty_is_enabled",
"rds_instance_enhanced_monitoring_enabled",
"redshift_cluster_audit_logging",
"securityhub_enabled",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"securityhub_enabled"
],
"ConfigRequirements": [
{
@@ -827,8 +821,7 @@
],
"Checks": [
"ec2_instance_managed_by_ssm",
"ssm_managed_compliant_patching",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ssm_managed_compliant_patching"
]
},
{
@@ -1331,8 +1324,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -1367,8 +1359,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -1431,9 +1422,7 @@
],
"Checks": [
"acm_certificates_expiration_check",
"kms_cmk_rotation_enabled",
"kms_key_enclave_attestation_not_enforced",
"kms_key_enclave_attestation_bypassable_path"
"kms_cmk_rotation_enabled"
]
},
{
@@ -1495,8 +1484,7 @@
"s3_bucket_default_encryption",
"s3_bucket_default_encryption",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_debug_attestation_detected"
"sns_topics_kms_encryption_at_rest_enabled"
]
},
{
@@ -1601,9 +1589,7 @@
"ec2_instance_imdsv2_enabled",
"guardduty_is_enabled",
"redshift_cluster_audit_logging",
"securityhub_enabled",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_debug_attestation_detected"
"securityhub_enabled"
],
"ConfigRequirements": [
{
@@ -1772,8 +1758,7 @@
}
],
"Checks": [
"cloudtrail_log_file_validation_enabled",
"kms_key_enclave_attestation_pcr_mismatch"
"cloudtrail_log_file_validation_enabled"
]
},
{
+1 -2
View File
@@ -879,8 +879,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
+2 -4
View File
@@ -58,8 +58,7 @@
"cloudwatch_log_metric_filter_root_usage",
"cloudwatch_log_metric_filter_security_group_changes",
"cloudwatch_log_metric_filter_unauthorized_api_calls",
"vpc_flow_logs_enabled",
"kms_key_enclave_attestation_not_enforced"
"vpc_flow_logs_enabled"
],
"ConfigRequirements": [
{
@@ -140,8 +139,7 @@
"s3_bucket_default_encryption",
"s3_bucket_secure_transport_policy",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_attestation_not_enforced"
"sns_topics_kms_encryption_at_rest_enabled"
]
}
]
@@ -109,9 +109,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -197,9 +195,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
+8 -19
View File
@@ -85,8 +85,7 @@
"sns_topics_kms_encryption_at_rest_enabled",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -116,8 +115,7 @@
"redshift_cluster_audit_logging",
"s3_bucket_server_access_logging_enabled",
"securityhub_enabled",
"vpc_flow_logs_enabled",
"kms_key_enclave_debug_attestation_detected"
"vpc_flow_logs_enabled"
],
"ConfigRequirements": [
{
@@ -643,10 +641,7 @@
"s3_bucket_public_access",
"s3_bucket_policy_public_write_access",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_bypassable_path"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -720,8 +715,7 @@
"s3_bucket_default_encryption",
"s3_bucket_secure_transport_policy",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_attestation_not_enforced"
"sns_topics_kms_encryption_at_rest_enabled"
]
},
{
@@ -752,8 +746,7 @@
"redshift_cluster_audit_logging",
"s3_bucket_server_access_logging_enabled",
"securityhub_enabled",
"vpc_flow_logs_enabled",
"kms_key_enclave_debug_attestation_detected"
"vpc_flow_logs_enabled"
],
"ConfigRequirements": [
{
@@ -787,8 +780,7 @@
"ec2_ebs_volume_encryption",
"s3_bucket_default_encryption",
"s3_bucket_secure_transport_policy",
"s3_bucket_object_versioning",
"kms_key_enclave_attestation_pcr_mismatch"
"s3_bucket_object_versioning"
]
},
{
@@ -809,8 +801,7 @@
"s3_bucket_default_encryption",
"s3_bucket_secure_transport_policy",
"s3_bucket_object_versioning",
"vpc_flow_logs_enabled",
"kms_key_enclave_attestation_unknown_image"
"vpc_flow_logs_enabled"
]
},
{
@@ -852,9 +843,7 @@
"s3_bucket_secure_transport_policy",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_unrestricted_ingress",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
+6 -22
View File
@@ -1190,8 +1190,7 @@
],
"Checks": [
"guardduty_is_enabled",
"guardduty_no_high_severity_findings",
"kms_key_enclave_attestation_pcr_mismatch"
"guardduty_no_high_severity_findings"
],
"ConfigRequirements": [
{
@@ -1492,9 +1491,7 @@
"cloudwatch_log_metric_filter_root_usage",
"cloudwatch_log_metric_filter_security_group_changes",
"cloudwatch_log_metric_filter_sign_in_without_mfa",
"cloudwatch_log_metric_filter_unauthorized_api_calls",
"kms_key_enclave_debug_attestation_detected",
"kms_key_enclave_attestation_unknown_image"
"cloudwatch_log_metric_filter_unauthorized_api_calls"
]
},
{
@@ -1631,11 +1628,7 @@
"ec2_securitygroup_from_launch_wizard",
"ec2_securitygroup_not_used",
"ec2_securitygroup_with_many_ingress_egress_rules",
"ec2_transitgateway_auto_accept_vpc_attachments",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_transitgateway_auto_accept_vpc_attachments"
]
},
{
@@ -1730,10 +1723,7 @@
"ec2_securitygroup_from_launch_wizard",
"ec2_securitygroup_not_used",
"ec2_securitygroup_with_many_ingress_egress_rules",
"ec2_transitgateway_auto_accept_vpc_attachments",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_transitgateway_auto_accept_vpc_attachments"
]
},
{
@@ -1828,10 +1818,7 @@
"ec2_securitygroup_from_launch_wizard",
"ec2_securitygroup_not_used",
"ec2_securitygroup_with_many_ingress_egress_rules",
"ec2_transitgateway_auto_accept_vpc_attachments",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_transitgateway_auto_accept_vpc_attachments"
]
},
{
@@ -1937,10 +1924,7 @@
"kms_cmk_are_used",
"kms_cmk_not_deleted_unintentionally",
"kms_cmk_not_multi_region",
"kms_cmk_rotation_enabled",
"kms_key_enclave_attestation_not_enforced",
"kms_key_enclave_attestation_bypassable_path",
"kms_key_enclave_attestation_no_deployment_binding"
"kms_cmk_rotation_enabled"
]
},
{
@@ -1647,9 +1647,7 @@
"vpc_peering_routing_tables_with_least_privilege",
"vpc_subnet_no_public_ip_by_default",
"vpc_subnet_separate_private_public",
"workspaces_vpc_2private_1public_subnets_nat",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"workspaces_vpc_2private_1public_subnets_nat"
],
"Attributes": [
{
@@ -1747,9 +1745,7 @@
"sagemaker_notebook_instance_root_access_disabled",
"ses_identity_not_publicly_accessible",
"ssm_documents_set_as_public",
"vpc_endpoint_connections_trust_boundaries",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_unrestricted_ingress"
"vpc_endpoint_connections_trust_boundaries"
],
"Attributes": [
{
@@ -2180,8 +2176,7 @@
"secretsmanager_secret_rotated_periodically",
"secretsmanager_secret_unused",
"sns_topics_kms_encryption_at_rest_enabled",
"storagegateway_fileshare_encryption_enabled",
"kms_key_enclave_attestation_not_enforced"
"storagegateway_fileshare_encryption_enabled"
],
"Attributes": [
{
@@ -3373,10 +3368,7 @@
"wafv2_webacl_with_rules",
"wellarchitected_workload_no_high_or_medium_risks",
"workspaces_volume_encryption_enabled",
"workspaces_vpc_2private_1public_subnets_nat",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"workspaces_vpc_2private_1public_subnets_nat"
],
"ConfigRequirements": [
{
@@ -1646,9 +1646,7 @@
"vpc_peering_routing_tables_with_least_privilege",
"vpc_subnet_no_public_ip_by_default",
"vpc_subnet_separate_private_public",
"workspaces_vpc_2private_1public_subnets_nat",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"workspaces_vpc_2private_1public_subnets_nat"
],
"Attributes": [
{
@@ -1747,9 +1745,7 @@
"sagemaker_notebook_instance_root_access_disabled",
"ses_identity_not_publicly_accessible",
"ssm_documents_set_as_public",
"vpc_endpoint_connections_trust_boundaries",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_unrestricted_ingress"
"vpc_endpoint_connections_trust_boundaries"
],
"Attributes": [
{
@@ -2182,8 +2178,7 @@
"secretsmanager_secret_rotated_periodically",
"secretsmanager_secret_unused",
"sns_topics_kms_encryption_at_rest_enabled",
"storagegateway_fileshare_encryption_enabled",
"kms_key_enclave_attestation_not_enforced"
"storagegateway_fileshare_encryption_enabled"
],
"Attributes": [
{
@@ -3376,10 +3371,7 @@
"wafv2_webacl_with_rules",
"wellarchitected_workload_no_high_or_medium_risks",
"workspaces_volume_encryption_enabled",
"workspaces_vpc_2private_1public_subnets_nat",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_unrestricted_ingress"
"workspaces_vpc_2private_1public_subnets_nat"
],
"ConfigRequirements": [
{
+5 -13
View File
@@ -33,9 +33,7 @@
"inspector2_is_enabled",
"inspector2_active_findings_exist",
"awslambda_function_not_publicly_accessible",
"ec2_instance_public_ip",
"ec2_confidential_workload_host_public_ip",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_instance_public_ip"
],
"ConfigRequirements": [
{
@@ -226,9 +224,7 @@
"organizations_account_part_of_organizations",
"organizations_delegated_administrators",
"organizations_scp_check_deny_regions",
"securityhub_enabled",
"kms_key_enclave_attestation_bypassable_path",
"kms_key_enclave_attestation_unknown_image"
"securityhub_enabled"
],
"ConfigRequirements": [
{
@@ -726,8 +722,7 @@
"securityhub_enabled",
"guardduty_is_enabled",
"inspector2_is_enabled",
"inspector2_active_findings_exist",
"kms_key_enclave_debug_attestation_detected"
"inspector2_active_findings_exist"
],
"ConfigRequirements": [
{
@@ -1198,9 +1193,7 @@
"ecs_task_definitions_no_environment_secrets",
"eks_cluster_kms_cmk_encryption_in_secrets_enabled",
"ssm_document_secrets",
"secretsmanager_automatic_rotation_enabled",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_not_enforced"
"secretsmanager_automatic_rotation_enabled"
],
"ConfigRequirements": [
{
@@ -2360,8 +2353,7 @@
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_postgres_5432",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_redis_6379",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_sql_server_1433_1434",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_telnet_23",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_telnet_23"
],
"ConfigRequirements": [
{
+1 -2
View File
@@ -1345,8 +1345,7 @@
"autoscaling_group_launch_configuration_requires_imdsv2",
"ec2_instance_account_imdsv2_enabled",
"ec2_instance_imdsv2_enabled",
"ec2_launch_template_imdsv2_required",
"ec2_confidential_workload_host_imdsv2_not_enforced"
"ec2_launch_template_imdsv2_required"
],
"Attributes": [
{
@@ -552,8 +552,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"ssm_managed_compliant_patching",
"ec2_securitygroup_default_restrict_traffic",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_securitygroup_default_restrict_traffic"
]
},
{
@@ -571,8 +570,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -1060,8 +1058,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -1122,8 +1119,7 @@
"s3_bucket_default_encryption",
"s3_bucket_secure_transport_policy",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_attestation_not_enforced"
"sns_topics_kms_encryption_at_rest_enabled"
]
},
{
@@ -337,9 +337,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_not_enforced"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -1104,8 +1102,7 @@
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -1239,9 +1236,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_imdsv2_not_enforced",
"kms_key_enclave_attestation_bypassable_path"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -2975,8 +2970,7 @@
"s3_account_level_public_access_blocks",
"ec2_securitygroup_default_restrict_traffic",
"vpc_flow_logs_enabled",
"ec2_networkacl_allow_ingress_any_port",
"kms_key_enclave_attestation_pcr_mismatch"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -2992,8 +2986,7 @@
}
],
"Checks": [
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_vsock_proxy_exposed"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -3435,8 +3428,7 @@
"rds_instance_backup_enabled",
"rds_instance_multi_az",
"redshift_cluster_automated_snapshot",
"s3_bucket_object_versioning",
"ec2_confidential_workload_host_not_running"
"s3_bucket_object_versioning"
]
},
{
@@ -3647,8 +3639,7 @@
"rds_instance_backup_enabled",
"rds_instance_multi_az",
"redshift_cluster_automated_snapshot",
"s3_bucket_object_versioning",
"ec2_confidential_workload_host_not_running"
"s3_bucket_object_versioning"
]
},
{
@@ -5016,8 +5007,7 @@
"s3_bucket_policy_public_write_access",
"s3_account_level_public_access_blocks",
"s3_bucket_public_access",
"sagemaker_notebook_instance_without_direct_internet_access_configured",
"ec2_confidential_workload_host_public_ip"
"sagemaker_notebook_instance_without_direct_internet_access_configured"
]
},
{
@@ -5078,8 +5068,7 @@
"s3_bucket_secure_transport_policy",
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -5198,8 +5187,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_public_ip"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -5508,8 +5496,7 @@
"ec2_securitygroup_default_restrict_traffic",
"ec2_networkacl_allow_ingress_any_port",
"ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22",
"ec2_networkacl_allow_ingress_any_port",
"ec2_confidential_workload_host_unrestricted_ingress"
"ec2_networkacl_allow_ingress_any_port"
]
},
{
@@ -5730,10 +5717,7 @@
}
],
"Checks": [
"kms_cmk_rotation_enabled",
"kms_key_enclave_attestation_not_enforced",
"kms_key_enclave_attestation_bypassable_path",
"kms_key_enclave_attestation_no_deployment_binding"
"kms_cmk_rotation_enabled"
]
},
{
@@ -5962,10 +5946,7 @@
"s3_bucket_default_encryption",
"s3_bucket_default_encryption",
"sagemaker_notebook_instance_encryption_enabled",
"sns_topics_kms_encryption_at_rest_enabled",
"kms_key_enclave_attestation_not_enforced",
"kms_key_enclave_attestation_bypassable_path",
"kms_key_enclave_debug_attestation_detected"
"sns_topics_kms_encryption_at_rest_enabled"
]
},
{
@@ -6425,9 +6406,7 @@
"guardduty_is_enabled",
"rds_instance_integration_cloudwatch_logs",
"redshift_cluster_audit_logging",
"s3_bucket_server_access_logging_enabled",
"kms_key_enclave_debug_attestation_detected",
"kms_key_enclave_attestation_unknown_image"
"s3_bucket_server_access_logging_enabled"
],
"ConfigRequirements": [
{
@@ -6847,8 +6826,7 @@
}
],
"Checks": [
"cloudtrail_log_file_validation_enabled",
"kms_key_enclave_attestation_pcr_mismatch"
"cloudtrail_log_file_validation_enabled"
]
},
{
Loaded 100 of 176 files, more files were not shown because too many files have changed in this diff. Show more