diff --git a/prowler/providers/gcp/lib/service/__init__.py b/prowler/providers/gcp/lib/service/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/prowler/providers/gcp/lib/service/service.py b/prowler/providers/gcp/lib/service/service.py new file mode 100644 index 00000000..d93f5477 --- /dev/null +++ b/prowler/providers/gcp/lib/service/service.py @@ -0,0 +1,18 @@ +from prowler.providers.gcp.gcp_provider import generate_client + + +class GCPService: + def __init__(self, service, audit_info, region="global", api_version="v1"): + # We receive the service using __class__.__name__ or the service name in lowercase + # e.g.: APIKeys --> we need a lowercase string, so service.lower() + self.service = service.lower() if not service.islower() else service + + self.api_version = api_version + self.project_ids = audit_info.project_ids + self.default_project_id = audit_info.default_project_id + + self.region = region + self.client = generate_client(service, api_version, audit_info) + + def __get_client__(self): + return self.client diff --git a/prowler/providers/gcp/services/apikeys/apikeys_service.py b/prowler/providers/gcp/services/apikeys/apikeys_service.py index 6b921911..5f70a115 100644 --- a/prowler/providers/gcp/services/apikeys/apikeys_service.py +++ b/prowler/providers/gcp/services/apikeys/apikeys_service.py @@ -1,18 +1,14 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## API Keys -class APIKeys: +class APIKeys(GCPService): def __init__(self, audit_info): - self.service = "apikeys" - self.api_version = "v2" - self.project_ids = audit_info.project_ids - self.default_project_id = audit_info.default_project_id - self.region = "global" - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info, api_version="v2") + self.keys = [] self.__get_keys__() diff --git a/prowler/providers/gcp/services/bigquery/bigquery_service.py b/prowler/providers/gcp/services/bigquery/bigquery_service.py index edcab4ca..b0cb35db 100644 --- a/prowler/providers/gcp/services/bigquery/bigquery_service.py +++ b/prowler/providers/gcp/services/bigquery/bigquery_service.py @@ -1,16 +1,14 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## BigQuery -class BigQuery: +class BigQuery(GCPService): def __init__(self, audit_info): - self.service = "bigquery" - self.api_version = "v2" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info, api_version="v2") + self.datasets = [] self.tables = [] self.__get_datasets__() diff --git a/prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py b/prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py index 7773fb8d..a0e00bc1 100644 --- a/prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py +++ b/prowler/providers/gcp/services/cloudresourcemanager/cloudresourcemanager_service.py @@ -1,26 +1,20 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## CloudResourceManager -class CloudResourceManager: +class CloudResourceManager(GCPService): def __init__(self, audit_info): - self.service = "cloudresourcemanager" - self.api_version = "v1" - self.region = "global" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) + self.bindings = [] self.projects = [] self.organizations = [] self.__get_iam_policy__() self.__get_organizations__() - def __get_client__(self): - return self.client - def __get_iam_policy__(self): for project_id in self.project_ids: try: diff --git a/prowler/providers/gcp/services/cloudsql/cloudsql_service.py b/prowler/providers/gcp/services/cloudsql/cloudsql_service.py index 4cf8a7c3..d7528d1e 100644 --- a/prowler/providers/gcp/services/cloudsql/cloudsql_service.py +++ b/prowler/providers/gcp/services/cloudsql/cloudsql_service.py @@ -1,16 +1,13 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## CloudSQL -class CloudSQL: +class CloudSQL(GCPService): def __init__(self, audit_info): - self.service = "sqladmin" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__("sqladmin", audit_info) self.instances = [] self.__get_instances__() diff --git a/prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py b/prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py index ed68db9f..6775633e 100644 --- a/prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py +++ b/prowler/providers/gcp/services/cloudstorage/cloudstorage_service.py @@ -3,16 +3,13 @@ from typing import Optional from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## CloudStorage -class CloudStorage: +class CloudStorage(GCPService): def __init__(self, audit_info): - self.service = "storage" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__("storage", audit_info) self.buckets = [] self.__get_buckets__() diff --git a/prowler/providers/gcp/services/compute/compute_service.py b/prowler/providers/gcp/services/compute/compute_service.py index 6a378918..0f797643 100644 --- a/prowler/providers/gcp/services/compute/compute_service.py +++ b/prowler/providers/gcp/services/compute/compute_service.py @@ -1,18 +1,13 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## Compute -class Compute: +class Compute(GCPService): def __init__(self, audit_info): - self.service = "compute" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.default_project_id = audit_info.default_project_id - self.client = generate_client(self.service, self.api_version, audit_info) - self.region = "global" + super().__init__(__class__.__name__, audit_info) self.regions = set() self.zones = set() self.instances = [] diff --git a/prowler/providers/gcp/services/dataproc/dataproc_service.py b/prowler/providers/gcp/services/dataproc/dataproc_service.py index 78c70236..cf066309 100644 --- a/prowler/providers/gcp/services/dataproc/dataproc_service.py +++ b/prowler/providers/gcp/services/dataproc/dataproc_service.py @@ -1,18 +1,14 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService from prowler.providers.gcp.services.compute.compute_client import compute_client ################## Dataproc -class Dataproc: +class Dataproc(GCPService): def __init__(self, audit_info): - self.service = "dataproc" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.default_project_id = audit_info.default_project_id - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) self.clusters = [] self.__get_clusters__() diff --git a/prowler/providers/gcp/services/dns/dns_service.py b/prowler/providers/gcp/services/dns/dns_service.py index 90629ca1..7c58f955 100644 --- a/prowler/providers/gcp/services/dns/dns_service.py +++ b/prowler/providers/gcp/services/dns/dns_service.py @@ -1,18 +1,13 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## DNS -class DNS: +class DNS(GCPService): def __init__(self, audit_info): - self.service = "dns" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.default_project_id = audit_info.default_project_id - self.client = generate_client(self.service, self.api_version, audit_info) - self.region = "global" + super().__init__(__class__.__name__, audit_info) self.managed_zones = [] self.__get_managed_zones__() self.policies = [] diff --git a/prowler/providers/gcp/services/iam/iam_service.py b/prowler/providers/gcp/services/iam/iam_service.py index 1540dd29..d9690ff3 100644 --- a/prowler/providers/gcp/services/iam/iam_service.py +++ b/prowler/providers/gcp/services/iam/iam_service.py @@ -3,27 +3,20 @@ from datetime import datetime from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService from prowler.providers.gcp.services.cloudresourcemanager.cloudresourcemanager_client import ( cloudresourcemanager_client, ) ################## IAM -class IAM: +class IAM(GCPService): def __init__(self, audit_info): - self.service = "iam" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.region = "global" - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) self.service_accounts = [] self.__get_service_accounts__() self.__get_service_accounts_keys__() - def __get_client__(self): - return self.client - def __get_service_accounts__(self): for project_id in self.project_ids: try: @@ -109,19 +102,12 @@ class ServiceAccount(BaseModel): ################## AccessApproval -class AccessApproval: +class AccessApproval(GCPService): def __init__(self, audit_info): - self.service = "accessapproval" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.region = "global" - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) self.settings = {} self.__get_settings__() - def __get_client__(self): - return self.client - def __get_settings__(self): for project_id in self.project_ids: try: @@ -148,18 +134,12 @@ class Setting(BaseModel): ################## EssentialContacts -class EssentialContacts: +class EssentialContacts(GCPService): def __init__(self, audit_info): - self.service = "essentialcontacts" - self.api_version = "v1" - self.region = "global" - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) self.organizations = [] self.__get_contacts__() - def __get_client__(self): - return self.client - def __get_contacts__(self): for org in cloudresourcemanager_client.organizations: try: diff --git a/prowler/providers/gcp/services/kms/kms_service.py b/prowler/providers/gcp/services/kms/kms_service.py index da48b39a..112aa386 100644 --- a/prowler/providers/gcp/services/kms/kms_service.py +++ b/prowler/providers/gcp/services/kms/kms_service.py @@ -3,17 +3,13 @@ from typing import Optional from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## KMS -class KMS: +class KMS(GCPService): def __init__(self, audit_info): - self.service = "cloudkms" - self.api_version = "v1" - self.project_ids = audit_info.project_ids - self.region = "global" - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__("cloudkms", audit_info) self.locations = [] self.key_rings = [] self.crypto_keys = [] @@ -22,9 +18,6 @@ class KMS: self.__get_crypto_keys__() self.__get_crypto_keys_iam_policy__() - def __get_client__(self): - return self.client - def __get_locations__(self): for project_id in self.project_ids: try: diff --git a/prowler/providers/gcp/services/logging/logging_service.py b/prowler/providers/gcp/services/logging/logging_service.py index 4ee3fc3a..79362911 100644 --- a/prowler/providers/gcp/services/logging/logging_service.py +++ b/prowler/providers/gcp/services/logging/logging_service.py @@ -1,18 +1,13 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## Logging -class Logging: +class Logging(GCPService): def __init__(self, audit_info): - self.service = "logging" - self.api_version = "v2" - self.region = "global" - self.project_ids = audit_info.project_ids - self.default_project_id = audit_info.default_project_id - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info, api_version="v2") self.sinks = [] self.metrics = [] self.__get_sinks__() diff --git a/prowler/providers/gcp/services/monitoring/monitoring_service.py b/prowler/providers/gcp/services/monitoring/monitoring_service.py index 4845f48f..1ffb6ed7 100644 --- a/prowler/providers/gcp/services/monitoring/monitoring_service.py +++ b/prowler/providers/gcp/services/monitoring/monitoring_service.py @@ -1,17 +1,13 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## Monitoring -class Monitoring: +class Monitoring(GCPService): def __init__(self, audit_info): - self.service = "monitoring" - self.api_version = "v3" - self.region = "global" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info, api_version="v3") self.alert_policies = [] self.__get_alert_policies__() diff --git a/prowler/providers/gcp/services/serviceusage/serviceusage_service.py b/prowler/providers/gcp/services/serviceusage/serviceusage_service.py index 4c208861..fb62219c 100644 --- a/prowler/providers/gcp/services/serviceusage/serviceusage_service.py +++ b/prowler/providers/gcp/services/serviceusage/serviceusage_service.py @@ -1,23 +1,16 @@ from pydantic import BaseModel from prowler.lib.logger import logger -from prowler.providers.gcp.gcp_provider import generate_client +from prowler.providers.gcp.lib.service.service import GCPService ################## ServiceUsage -class ServiceUsage: +class ServiceUsage(GCPService): def __init__(self, audit_info): - self.service = "serviceusage" - self.api_version = "v1" - self.region = "global" - self.project_ids = audit_info.project_ids - self.client = generate_client(self.service, self.api_version, audit_info) + super().__init__(__class__.__name__, audit_info) self.active_services = {} self.__get_active_services__() - def __get_client__(self): - return self.client - def __get_active_services__(self): for project_id in self.project_ids: self.active_services[project_id] = []