From fd732db91bfbbd4804ee55ffb3b202b45c173b62 Mon Sep 17 00:00:00 2001 From: Pepe Fagoaga Date: Mon, 22 Apr 2024 11:16:21 +0200 Subject: [PATCH] fix(mutelist): Be called whatever the provider (#3811) --- prowler/__main__.py | 2 +- prowler/config/config.py | 9 ++--- prowler/lib/cli/parser.py | 6 +--- prowler/providers/aws/aws_provider.py | 16 --------- prowler/providers/azure/azure_provider.py | 14 -------- prowler/providers/common/provider.py | 33 ++++++++++++++----- prowler/providers/gcp/gcp_provider.py | 13 -------- .../kubernetes/kubernetes_provider.py | 13 -------- tests/providers/aws/aws_provider_test.py | 7 +++- 9 files changed, 37 insertions(+), 76 deletions(-) diff --git a/prowler/__main__.py b/prowler/__main__.py index 875cc483bd..c641cddee9 100644 --- a/prowler/__main__.py +++ b/prowler/__main__.py @@ -215,7 +215,7 @@ def prowler(): checks_to_execute, global_provider, custom_checks_metadata, - getattr(args, "mutelist_file", None), + global_provider.mutelist_file_path, args.config_file, ) else: diff --git a/prowler/config/config.py b/prowler/config/config.py index d27d5e6a00..156d225e26 100644 --- a/prowler/config/config.py +++ b/prowler/config/config.py @@ -70,10 +70,11 @@ def get_default_mute_file_path(provider: str): """ get_default_mute_file_path returns the default mute file path for the provider """ - # TODO: crate default mutelist file for kubernetes, azure and gcp - if provider == "aws": - return f"{pathlib.Path(os.path.dirname(os.path.realpath(__file__)))}/{provider}_mutelist.yaml" - return None + # TODO: create default mutelist file for kubernetes, azure and gcp + mutelist_path = f"{pathlib.Path(os.path.dirname(os.path.realpath(__file__)))}/{provider}_mutelist.yaml" + if not os.path.isfile(mutelist_path): + mutelist_path = None + return mutelist_path def check_current_version(): diff --git a/prowler/lib/cli/parser.py b/prowler/lib/cli/parser.py index 78399766d8..d1a86830d2 100644 --- a/prowler/lib/cli/parser.py +++ b/prowler/lib/cli/parser.py @@ -10,7 +10,6 @@ from prowler.config.config import ( default_fixer_config_file_path, default_output_directory, finding_statuses, - get_default_mute_file_path, valid_severities, ) from prowler.providers.common.arguments import ( @@ -326,14 +325,11 @@ Detailed documentation at https://docs.prowler.com def __init_mutelist_parser__(self): mutelist_subparser = self.common_providers_parser.add_argument_group("Mutelist") - provider = sys.argv[1] if len(sys.argv) > 1 else "aws" mutelist_subparser.add_argument( "--mutelist-file", "-w", nargs="?", - # TODO(PRWLR-3519): this has to be done in the provider class not here - default=get_default_mute_file_path(provider), - help="Path for mutelist yaml file. See example prowler/config/_mutelist.yaml for reference and format. For AWS provider, it also accepts AWS DynamoDB Table, Lambda ARNs or S3 URIs, see more in https://docs.prowler.cloud/en/latest/tutorials/mutelist/", + help="Path for mutelist YAML file. See example prowler/config/_mutelist.yaml for reference and format. For AWS provider, it also accepts AWS DynamoDB Table, Lambda ARNs or S3 URIs, see more in https://docs.prowler.cloud/en/latest/tutorials/mutelist/", ) def __init_config_parser__(self): diff --git a/prowler/providers/aws/aws_provider.py b/prowler/providers/aws/aws_provider.py index 92bb79f098..1fc17f142d 100644 --- a/prowler/providers/aws/aws_provider.py +++ b/prowler/providers/aws/aws_provider.py @@ -17,7 +17,6 @@ from prowler.config.config import ( ) from prowler.lib.check.check import list_modules, recover_checks_from_service from prowler.lib.logger import logger -from prowler.lib.mutelist.mutelist import parse_mutelist_file from prowler.lib.utils.utils import open_file, parse_json_file, print_boxes from prowler.providers.aws.config import ( AWS_STS_GLOBAL_ENDPOINT_REGION, @@ -54,7 +53,6 @@ class AwsProvider(Provider): _audit_config: dict _scan_unused_services: bool = False _enabled_regions: set = set() - _mutelist: dict = {} _output_options: AWSOutputOptions # TODO: this is not optional, enforce for all providers audit_metadata: Audit_Metadata @@ -284,20 +282,6 @@ class AwsProvider(Provider): arguments, bulk_checks_metadata, self._identity ) - @property - def mutelist(self): - return self._mutelist - - @mutelist.setter - def mutelist(self, mutelist_path): - if mutelist_path: - mutelist = parse_mutelist_file( - mutelist_path, self._session.current_session, self._identity.account - ) - else: - mutelist = {} - self._mutelist = mutelist - @property def get_output_mapping(self): return { diff --git a/prowler/providers/azure/azure_provider.py b/prowler/providers/azure/azure_provider.py index 422d553f5f..321bd8e587 100644 --- a/prowler/providers/azure/azure_provider.py +++ b/prowler/providers/azure/azure_provider.py @@ -10,7 +10,6 @@ from msgraph import GraphServiceClient from prowler.config.config import load_and_validate_config_file from prowler.lib.logger import logger -from prowler.lib.mutelist.mutelist import parse_mutelist_file from prowler.lib.utils.utils import print_boxes from prowler.providers.azure.lib.regions.regions import get_regions_config from prowler.providers.azure.models import ( @@ -132,19 +131,6 @@ class AzureProvider(Provider): "partition": "region_config.name", } - @property - def mutelist(self): - return self._mutelist - - @mutelist.setter - def mutelist(self, mutelist_path): - if mutelist_path: - mutelist = parse_mutelist_file(mutelist_path) - else: - mutelist = {} - - self._mutelist = mutelist - # TODO: this should be moved to the argparse, if not we need to enforce it from the Provider # previously was using the AzureException def validate_arguments( diff --git a/prowler/providers/common/provider.py b/prowler/providers/common/provider.py index 8da222e5b1..93af2637d4 100644 --- a/prowler/providers/common/provider.py +++ b/prowler/providers/common/provider.py @@ -1,6 +1,9 @@ from abc import ABC, abstractmethod from typing import Any +from prowler.config.config import get_default_mute_file_path +from prowler.lib.mutelist.mutelist import parse_mutelist_file + # TODO: with this we can enforce that all classes ending with "Provider" needs to inherint from the Provider class # class ProviderMeta: # def __init__(cls, name, bases, dct): @@ -15,6 +18,8 @@ from typing import Any # TODO: enforce audit_metadata for all the providers class Provider(ABC): + _mutelist: dict + _mutelist_file_path: str """ The Provider class is an abstract base class that defines the interface for all provider classes in the auditing system. @@ -142,21 +147,31 @@ class Provider(ABC): return set() @property - @abstractmethod def mutelist(self): """ mutelist method returns the provider's mutelist. - - This method needs to be created in each provider. """ - raise NotImplementedError() + return self._mutelist + + @property + def mutelist_file_path(self): + """ + mutelist method returns the provider's mutelist file path. + """ + return self._mutelist_file_path @mutelist.setter - @abstractmethod - def mutelist(self, path: str): + def mutelist(self, mutelist_path): """ mutelist.setter sets the provider's mutelist. - - This method needs to be created in each provider. """ - raise NotImplementedError() + # Set default mutelist path if none is set + if not mutelist_path: + mutelist_path = get_default_mute_file_path(self.type) + if mutelist_path: + mutelist = parse_mutelist_file(mutelist_path) + else: + mutelist = {} + + self._mutelist = mutelist + self._mutelist_file_path = mutelist_path diff --git a/prowler/providers/gcp/gcp_provider.py b/prowler/providers/gcp/gcp_provider.py index c3fabe2cb5..a473e7c1d3 100644 --- a/prowler/providers/gcp/gcp_provider.py +++ b/prowler/providers/gcp/gcp_provider.py @@ -10,7 +10,6 @@ from googleapiclient.errors import HttpError from prowler.config.config import load_and_validate_config_file from prowler.lib.logger import logger -from prowler.lib.mutelist.mutelist import parse_mutelist_file from prowler.lib.utils.utils import print_boxes from prowler.providers.common.models import Audit_Metadata from prowler.providers.common.provider import Provider @@ -169,18 +168,6 @@ class GcpProvider(Provider): # "partition": "identity.partition", } - @property - def mutelist(self): - return self._mutelist - - @mutelist.setter - def mutelist(self, mutelist_path): - if mutelist_path: - mutelist = parse_mutelist_file(mutelist_path) - else: - mutelist = {} - self._mutelist = mutelist - def setup_session(self, credentials_file): try: if credentials_file: diff --git a/prowler/providers/kubernetes/kubernetes_provider.py b/prowler/providers/kubernetes/kubernetes_provider.py index 93e869e9bc..b00a6c1e01 100644 --- a/prowler/providers/kubernetes/kubernetes_provider.py +++ b/prowler/providers/kubernetes/kubernetes_provider.py @@ -7,7 +7,6 @@ from colorama import Fore, Style from kubernetes import client, config from prowler.config.config import load_and_validate_config_file from prowler.lib.logger import logger -from prowler.lib.mutelist.mutelist import parse_mutelist_file from prowler.lib.utils.utils import print_boxes from prowler.providers.common.models import Audit_Metadata from prowler.providers.common.provider import Provider @@ -113,18 +112,6 @@ class KubernetesProvider(Provider): # "partition": "identity.partition", } - @property - def mutelist(self): - return self._mutelist - - @mutelist.setter - def mutelist(self, mutelist_path): - if mutelist_path: - mutelist = parse_mutelist_file(mutelist_path) - else: - mutelist = {} - self._mutelist = mutelist - def setup_session(self, kubeconfig_file, input_context) -> KubernetesSession: """ Sets up the Kubernetes session. diff --git a/tests/providers/aws/aws_provider_test.py b/tests/providers/aws/aws_provider_test.py index c6be6b3c7c..234f7be520 100644 --- a/tests/providers/aws/aws_provider_test.py +++ b/tests/providers/aws/aws_provider_test.py @@ -548,7 +548,12 @@ aws: def test_aws_provider_mutelist_none(self): arguments = Namespace() aws_provider = AwsProvider(arguments) - aws_provider.mutelist = None + + with patch( + "prowler.providers.common.provider.get_default_mute_file_path", + return_value=None, + ): + aws_provider.mutelist = None assert aws_provider.mutelist == {}