diff --git a/prowler/lib/outputs/html.py b/prowler/lib/outputs/html.py index a4a5f6b4cc..482d5749db 100644 --- a/prowler/lib/outputs/html.py +++ b/prowler/lib/outputs/html.py @@ -474,15 +474,6 @@ def get_azure_html_assessment_summary(provider): def get_gcp_html_assessment_summary(provider): try: if provider.type == "gcp": - try: - getattr(provider.credentials, "_service_account_email") - profile = ( - provider.credentials._service_account_email - if provider.credentials._service_account_email is not None - else "default" - ) - except AttributeError: - profile = "default" return ( """
@@ -507,7 +498,7 @@ def get_gcp_html_assessment_summary(provider): @@ -550,7 +541,6 @@ def get_kubernetes_html_assessment_summary(provider):
  • Kubernetes Cluster: """ + provider.identity.cluster - + """
  • diff --git a/prowler/providers/gcp/gcp_provider.py b/prowler/providers/gcp/gcp_provider.py index 1617c37118..54a3e06711 100644 --- a/prowler/providers/gcp/gcp_provider.py +++ b/prowler/providers/gcp/gcp_provider.py @@ -1,7 +1,7 @@ import os import sys from dataclasses import dataclass -from typing import Any, Optional +from typing import Optional from colorama import Fore, Style from google import auth @@ -9,35 +9,33 @@ from google.oauth2.credentials import Credentials from googleapiclient import discovery from prowler.lib.logger import logger +from prowler.providers.common.models import Audit_Metadata from prowler.providers.common.provider import Provider @dataclass class GCPIdentityInfo: profile: str - - -# TODO: why do we have variables defined in the class not passed to the __init__??? -class GcpProvider(Provider): - # TODO: should we move session and identity to the Provider parent class? - provider = "gcp" - session: Credentials default_project_id: str - project_ids: list - # TODO: review this since we have to create an identity object - identity: GCPIdentityInfo - audit_resources: Optional[Any] - audit_metadata: Optional[Any] - audit_config: Optional[dict] + + +class GcpProvider(Provider): + _type: str = "gcp" + _session: Credentials + _project_ids: list + _identity: GCPIdentityInfo + _audit_config: Optional[dict] + # TODO: this is not optional, enforce for all providers + audit_metadata: Audit_Metadata def __init__(self, arguments): logger.info("Instantiating GCP Provider ...") input_project_ids = arguments.project_ids credentials_file = arguments.credentials_file - self.session, self.default_project_id = self.setup_session(credentials_file) + self._session, default_project_id = self.setup_session(credentials_file) - self.project_ids = [] + self._project_ids = [] accessible_projects = self.get_project_ids() if not accessible_projects: logger.critical("No Project IDs can be accessed via Google Credentials.") @@ -46,7 +44,7 @@ class GcpProvider(Provider): if input_project_ids: for input_project in input_project_ids: if input_project in accessible_projects: - self.project_ids.append(input_project) + self._project_ids.append(input_project) else: logger.critical( f"Project {input_project} cannot be accessed via Google Credentials." @@ -54,12 +52,33 @@ class GcpProvider(Provider): sys.exit(1) else: # If not projects were input, all accessible projects are scanned by default - self.project_ids = accessible_projects + self._project_ids = accessible_projects - self.identity = GCPIdentityInfo( - profile=getattr(self.session, "_service_account_email", "default") + self._identity = GCPIdentityInfo( + profile=getattr(self.session, "_service_account_email", "default"), + default_project_id=default_project_id, ) + @property + def identity(self): + return self._identity + + @property + def type(self): + return self._type + + @property + def session(self): + return self._session + + @property + def project_ids(self): + return self._project_ids + + @property + def audit_config(self): + return self._audit_config + def setup_session(self, credentials_file): try: if credentials_file: diff --git a/prowler/providers/gcp/lib/service/service.py b/prowler/providers/gcp/lib/service/service.py index ffe7fcf141..1181215bd5 100644 --- a/prowler/providers/gcp/lib/service/service.py +++ b/prowler/providers/gcp/lib/service/service.py @@ -24,7 +24,7 @@ class GCPService: self.service = service.lower() if not service.islower() else service self.credentials = provider.session self.api_version = api_version - self.default_project_id = provider.default_project_id + self.default_project_id = provider.identity.default_project_id self.region = region self.client = self.__generate_client__( self.service, api_version, self.credentials diff --git a/prowler/providers/gcp/services/gcr/__init__.py b/prowler/providers/gcp/services/gcr/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/prowler/providers/gcp/services/gke/gke_client.py b/prowler/providers/gcp/services/gke/gke_client.py index 7b165a2c76..55aed9cdec 100644 --- a/prowler/providers/gcp/services/gke/gke_client.py +++ b/prowler/providers/gcp/services/gke/gke_client.py @@ -1,4 +1,4 @@ -from prowler.providers.gcp.lib.audit_info.audit_info import gcp_audit_info +from prowler.providers.common.common import get_global_provider from prowler.providers.gcp.services.gke.gke_service import GKE -gke_client = GKE(gcp_audit_info) +gke_client = GKE(get_global_provider()) diff --git a/prowler/providers/kubernetes/kubernetes_provider.py b/prowler/providers/kubernetes/kubernetes_provider.py index 688c956865..cebe4ee8fa 100644 --- a/prowler/providers/kubernetes/kubernetes_provider.py +++ b/prowler/providers/kubernetes/kubernetes_provider.py @@ -2,12 +2,13 @@ import os import sys from argparse import Namespace from dataclasses import dataclass -from typing import Any, Optional +from typing import Optional from colorama import Fore, Style from kubernetes import client, config from prowler.lib.logger import logger +from prowler.providers.common.models import Audit_Metadata from prowler.providers.common.provider import Provider @@ -33,10 +34,10 @@ class KubernetesProvider(Provider): _type: str = "kubernetes" _session: KubernetesSession _namespaces: list - audit_resources: Optional[Any] - audit_metadata: Optional[Any] _audit_config: Optional[dict] _identity: KubernetesIdentityInfo + # TODO: this is not optional, enforce for all providers + audit_metadata: Audit_Metadata def __init__(self, arguments: Namespace): """