| name | prowler-provider |
| description | Creates new Prowler cloud providers or adds services to existing providers. Trigger: When extending Prowler SDK provider architecture (adding a new provider or a new service to an existing provider).
|
| license | Apache-2.0 |
| metadata | {"author":"prowler-cloud","version":"1.0","scope":["root","sdk"],"auto_invoke":["Adding new providers","Adding services to existing providers"]} |
| allowed-tools | Read, Edit, Write, Glob, Grep, Bash, WebFetch, WebSearch, Task |
When to Use
Use this skill when:
- Adding a new cloud provider to Prowler
- Adding a new service to an existing provider
- Understanding the provider architecture pattern
Provider Architecture Pattern
Every provider MUST follow this structure:
prowler/providers/{provider}/
โโโ __init__.py
โโโ {provider}_provider.py # Main provider class
โโโ models.py # Provider-specific models
โโโ config.py # Provider configuration
โโโ exceptions/ # Provider-specific exceptions
โโโ lib/
โ โโโ service/ # Base service class
โ โโโ arguments/ # CLI arguments parser
โ โโโ mutelist/ # Mutelist functionality
โโโ services/
โโโ {service}/
โโโ {service}_service.py # Resource fetcher
โโโ {service}_client.py # Python singleton instance
โโโ {check_name}/ # Individual checks
โโโ {check_name}.py
โโโ {check_name}.metadata.json
Sensitive CLI Arguments
Flags that accept secrets (tokens, passwords, API keys) MUST follow these rules:
- Use
nargs="?" with default=None โ the flag accepts an optional value for backward compatibility; the recommended path is environment variables.
- Set
metavar to the environment variable name users should use (e.g., metavar="GITHUB_PERSONAL_ACCESS_TOKEN").
- Add the flag to the
SENSITIVE_ARGUMENTS frozenset at the top of the provider's arguments.py. This set is used to redact values in HTML output and warn users who pass secrets directly.
- Do not add new arguments that require passing secrets as CLI values โ secrets should come from environment variables. The flag accepts a value for backward compatibility, but CLI warns users to prefer env vars.
Pattern
SENSITIVE_ARGUMENTS = frozenset({"--my-api-key", "--my-password"})
def init_parser(self):
auth_subparser = parser.add_argument_group("Authentication Modes")
auth_subparser.add_argument(
"--my-api-key",
nargs="?",
default=None,
metavar="MY_API_KEY",
help="API key for authentication. Use MY_API_KEY env var instead of passing directly.",
)
Provider Class Template
from prowler.providers.common.provider import Provider
class {Provider}Provider(Provider):
"""Provider class for {Provider} cloud platform."""
def __init__(self, arguments):
super().__init__(arguments)
self.session = self._setup_session(arguments)
self.regions = self._get_regions()
def _setup_session(self, arguments):
"""Provider-specific authentication."""
pass
def _get_regions(self):
"""Get available regions for provider."""
pass
Service Class Template
from prowler.providers.{provider}.lib.service.service import {Provider}Service
class {Service}({Provider}Service):
"""Service class for {service} resources."""
def __init__(self, provider):
super().__init__(provider)
self.{resources} = []
self._fetch_{resources}()
def _fetch_{resources}(self):
"""Fetch {resource} data from API."""
try:
response = self.client.list_{resources}()
for item in response:
self.{resources}.append(
{Resource}(
id=item["id"],
name=item["name"],
region=item.get("region"),
)
)
except Exception as e:
logger.error(f"Error fetching {resources}: {e}")
Service Client Template
from prowler.providers.{provider}.services.{service}.{service}_service import {Service}
{service}_client = {Service}
Supported Providers
Current providers:
- AWS (Amazon Web Services)
- Azure (Microsoft Azure)
- GCP (Google Cloud Platform)
- Kubernetes
- GitHub
- M365 (Microsoft 365)
- OracleCloud (Oracle Cloud Infrastructure)
- AlibabaCloud
- Cloudflare
- MongoDB Atlas
- NHN (NHN Cloud)
- LLM (Language Model providers)
- IaC (Infrastructure as Code)
Commands
uv run python prowler-cli.py {provider}
uv run python prowler-cli.py {provider} --list-services
uv run python prowler-cli.py {provider} --list-checks
uv run python prowler-cli.py {provider} --services {service}
uv run python prowler-cli.py {provider} --log-level DEBUG
Resources