Merge branch 'master' into PRWLR-7835-multi-provider-support

This commit is contained in:
Adrián Jesús Peña Rodríguez committed 2025-10-17 12:04:10 +02:00
commit 77fa5d1644
1326 files changed
+67658 -2324

No files matched your search

+2
View File
@@ -7,12 +7,14 @@ All notable changes to the **Prowler API** are documented in this file.
### Added
- Default JWT keys are generated and stored if they are missing from configuration [(#8655)](https://github.com/prowler-cloud/prowler/pull/8655)
- `compliance_name` for each compliance [(#7920)](https://github.com/prowler-cloud/prowler/pull/7920)
- Support C5 compliance framework for the AWS provider [(#8830)](https://github.com/prowler-cloud/prowler/pull/8830)
- Support for M365 Certificate authentication [(#8538)](https://github.com/prowler-cloud/prowler/pull/8538)
- API Key support [(#8805)](https://github.com/prowler-cloud/prowler/pull/8805)
- SAML role mapping protection for single-admin tenants to prevent accidental lockout [(#8882)](https://github.com/prowler-cloud/prowler/pull/8882)
- Support for `passed_findings` and `total_findings` fields in compliance requirement overview for accurate Prowler ThreatScore calculation [(#8582)](https://github.com/prowler-cloud/prowler/pull/8582)
- Database read replica support [(#8869)](https://github.com/prowler-cloud/prowler/pull/8869)
- Support for configuring multiple LLM providers [(#8772)](https://github.com/prowler-cloud/prowler/pull/8772)
- Support Common Cloud Controls for AWS, Azure and GCP [(#8000)](https://github.com/prowler-cloud/prowler/pull/8000)
### Changed
- Now the MANAGE_ACCOUNT permission is required to modify or read user permissions instead of MANAGE_USERS [(#8281)](https://github.com/prowler-cloud/prowler/pull/8281)
+4 -4
View File
@@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand.
# This file is automatically @generated by Poetry 2.2.0 and should not be changed by hand.
[[package]]
name = "about-time"
@@ -273,14 +273,14 @@ tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" a
[[package]]
name = "authlib"
version = "1.6.4"
version = "1.6.5"
description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
{file = "authlib-1.6.4-py2.py3-none-any.whl", hash = "sha256:39313d2a2caac3ecf6d8f95fbebdfd30ae6ea6ae6a6db794d976405fdd9aa796"},
{file = "authlib-1.6.4.tar.gz", hash = "sha256:104b0442a43061dc8bc23b133d1d06a2b0a9c2e3e33f34c4338929e816287649"},
{file = "authlib-1.6.5-py2.py3-none-any.whl", hash = "sha256:3e0e0507807f842b02175507bdee8957a1d5707fd4afb17c32fb43fee90b6e3a"},
{file = "authlib-1.6.5.tar.gz", hash = "sha256:6aaf9c79b7cc96c900f0b284061691c5d4e61221640a948fe690b556a6d6d10b"},
]
[package.dependencies]
@@ -44,7 +44,7 @@ class Migration(migrations.Migration):
help_text="If the API key is revoked, entities cannot use it anymore. (This cannot be undone.)",
),
),
("created", models.DateTimeField(auto_now=True)),
("created", models.DateTimeField(auto_now_add=True, editable=False)),
(
"whitelisted_ips",
models.JSONField(
+1
View File
@@ -221,6 +221,7 @@ class Membership(models.Model):
class TenantAPIKey(AbstractAPIKey, RowLevelSecurityProtectedModel):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
name = models.CharField(max_length=100, validators=[MinLengthValidator(3)])
created = models.DateTimeField(auto_now_add=True, editable=False)
prefix = models.CharField(
max_length=11,
unique=True,
+32 -56
View File
@@ -13015,20 +13015,22 @@ components:
type: string
description: The Azure application (client) ID for authentication
in Azure AD.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
tenant_id:
type: string
description: The Azure tenant ID, representing the directory
where the application is registered.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
user:
type: email
description: 'Deprecated: User microsoft email address.'
description: User microsoft email address.
deprecated: true
password:
type: string
description: 'Deprecated: User password.'
description: User password.
deprecated: true
required:
- client_id
- client_secret
@@ -13050,18 +13052,10 @@ components:
type: string
description: The certificate content in base64 format for
certificate-based authentication.
user:
type: email
description: User microsoft email address.
password:
type: string
description: User password.
required:
- client_id
- tenant_id
- certificate_content
- user
- password
- type: object
title: GCP Static Credentials
properties:
@@ -14908,20 +14902,22 @@ components:
type: string
description: The Azure application (client) ID for authentication
in Azure AD.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
tenant_id:
type: string
description: The Azure tenant ID, representing the directory where
the application is registered.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
user:
type: email
description: 'Deprecated: User microsoft email address.'
description: User microsoft email address.
deprecated: true
password:
type: string
description: 'Deprecated: User password.'
description: User password.
deprecated: true
required:
- client_id
- client_secret
@@ -14943,18 +14939,10 @@ components:
type: string
description: The certificate content in base64 format for certificate-based
authentication.
user:
type: email
description: User microsoft email address.
password:
type: string
description: User password.
required:
- client_id
- tenant_id
- certificate_content
- user
- password
- type: object
title: GCP Static Credentials
properties:
@@ -15183,20 +15171,22 @@ components:
type: string
description: The Azure application (client) ID for authentication
in Azure AD.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
tenant_id:
type: string
description: The Azure tenant ID, representing the directory
where the application is registered.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
user:
type: email
description: 'Deprecated: User microsoft email address.'
description: User microsoft email address.
deprecated: true
password:
type: string
description: 'Deprecated: User password.'
description: User password.
deprecated: true
required:
- client_id
- client_secret
@@ -15218,18 +15208,10 @@ components:
type: string
description: The certificate content in base64 format for
certificate-based authentication.
user:
type: email
description: User microsoft email address.
password:
type: string
description: User password.
required:
- client_id
- tenant_id
- certificate_content
- user
- password
- type: object
title: GCP Static Credentials
properties:
@@ -15474,20 +15456,22 @@ components:
type: string
description: The Azure application (client) ID for authentication
in Azure AD.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
tenant_id:
type: string
description: The Azure tenant ID, representing the directory where
the application is registered.
client_secret:
type: string
description: The client secret associated with the application
(client) ID, providing secure access.
user:
type: email
description: 'Deprecated: User microsoft email address.'
description: User microsoft email address.
deprecated: true
password:
type: string
description: 'Deprecated: User password.'
description: User password.
deprecated: true
required:
- client_id
- client_secret
@@ -15509,18 +15493,10 @@ components:
type: string
description: The certificate content in base64 format for certificate-based
authentication.
user:
type: email
description: User microsoft email address.
password:
type: string
description: User password.
required:
- client_id
- tenant_id
- certificate_content
- user
- password
- type: object
title: GCP Static Credentials
properties:
+21
View File
@@ -7948,6 +7948,27 @@ class TestTenantApiKeyViewSet:
api_key.refresh_from_db()
assert api_key.revoked is True
def test_api_keys_revoke_preserves_created_field(
self, authenticated_client, api_keys_fixture
):
"""Test that revoking an API key preserves the created timestamp."""
api_key = api_keys_fixture[0] # Not revoked
assert api_key.revoked is False
# Record the original created timestamp
original_created = api_key.created
response = authenticated_client.delete(
reverse("api-key-revoke", kwargs={"pk": api_key.id})
)
assert response.status_code == status.HTTP_200_OK
# Verify in database
api_key.refresh_from_db()
assert api_key.revoked is True
# Verify created field has not changed
assert api_key.created == original_created
def test_api_keys_revoke_already_revoked(
self, authenticated_client, api_keys_fixture
):
@@ -105,23 +105,25 @@ from rest_framework_json_api import serializers
"type": "string",
"description": "The Azure application (client) ID for authentication in Azure AD.",
},
"client_secret": {
"type": "string",
"description": "The client secret associated with the application (client) ID, providing "
"secure access.",
},
"tenant_id": {
"type": "string",
"description": "The Azure tenant ID, representing the directory where the application is "
"registered.",
},
"client_secret": {
"type": "string",
"description": "The client secret associated with the application (client) ID, providing "
"secure access.",
},
"user": {
"type": "email",
"description": "Deprecated: User microsoft email address.",
"description": "User microsoft email address.",
"deprecated": True,
},
"password": {
"type": "string",
"description": "Deprecated: User password.",
"description": "User password.",
"deprecated": True,
},
},
"required": [
@@ -149,21 +151,11 @@ from rest_framework_json_api import serializers
"type": "string",
"description": "The certificate content in base64 format for certificate-based authentication.",
},
"user": {
"type": "email",
"description": "User microsoft email address.",
},
"password": {
"type": "string",
"description": "User password.",
},
},
"required": [
"client_id",
"tenant_id",
"certificate_content",
"user",
"password",
],
},
{
+8
View File
@@ -20,6 +20,10 @@ from prowler.lib.outputs.asff.asff import ASFF
from prowler.lib.outputs.compliance.aws_well_architected.aws_well_architected import (
AWSWellArchitected,
)
from prowler.lib.outputs.compliance.ccc.ccc_aws import CCC_AWS
from prowler.lib.outputs.compliance.ccc.ccc_azure import CCC_Azure
from prowler.lib.outputs.compliance.ccc.ccc_gcp import CCC_GCP
from prowler.lib.outputs.compliance.c5.c5_aws import AWSC5
from prowler.lib.outputs.compliance.cis.cis_aws import AWSCIS
from prowler.lib.outputs.compliance.cis.cis_azure import AzureCIS
from prowler.lib.outputs.compliance.cis.cis_gcp import GCPCIS
@@ -73,12 +77,15 @@ COMPLIANCE_CLASS_MAP = {
(lambda name: name.startswith("iso27001_"), AWSISO27001),
(lambda name: name.startswith("kisa"), AWSKISAISMSP),
(lambda name: name == "prowler_threatscore_aws", ProwlerThreatScoreAWS),
(lambda name: name == "ccc_aws", CCC_AWS),
(lambda name: name.startswith("c5_"), AWSC5),
],
"azure": [
(lambda name: name.startswith("cis_"), AzureCIS),
(lambda name: name == "mitre_attack_azure", AzureMitreAttack),
(lambda name: name.startswith("ens_"), AzureENS),
(lambda name: name.startswith("iso27001_"), AzureISO27001),
(lambda name: name == "ccc_azure", CCC_Azure),
(lambda name: name == "prowler_threatscore_azure", ProwlerThreatScoreAzure),
],
"gcp": [
@@ -87,6 +94,7 @@ COMPLIANCE_CLASS_MAP = {
(lambda name: name.startswith("ens_"), GCPENS),
(lambda name: name.startswith("iso27001_"), GCPISO27001),
(lambda name: name == "prowler_threatscore_gcp", ProwlerThreatScoreGCP),
(lambda name: name == "ccc_gcp", CCC_GCP),
],
"kubernetes": [
(lambda name: name.startswith("cis_"), KubernetesCIS),