Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rubén De la Torre Vico <ruben@prowler.com>
Please include relevant motivation and context for this PR.
If fixes an issue please add it with `Fix #XXXX`
### Description
Please include a summary of the change and which issue is fixed. List any dependencies that are required for this change.
### Checklist
- Are there new checks included in this PR? Yes / No
- If so, do we need to update permissions for the provider? Please review this carefully.
- [ ] Review if the code is being covered by tests.
- [ ] Review if code is being documented following this specification https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings
- name:Leave PR comment with the SaaS Documentation URI
- name:Leave PR comment with the Prowler Documentation URI
uses:peter-evans/create-or-update-comment@v4
with:
issue-number:${{ env.PR_NUMBER }}
body:|
You can check the documentation for this PR here -> [SaaS Documentation](https://prowler-prowler-docs--${{ env.PR_NUMBER }}.com.readthedocs.build/projects/prowler-open-source/en/${{ env.PR_NUMBER }}/)
You can check the documentation for this PR here -> [Prowler Documentation](https://prowler-prowler-docs--${{ env.PR_NUMBER }}.com.readthedocs.build/projects/prowler-open-source/en/${{ env.PR_NUMBER }}/)
<a href="https://join.slack.com/t/prowler-workspace/shared_invite/zt-1hix76xsl-2uq222JIXrC7Q8It~9ZNog"><img width="30" height="30" alt="Prowler community on Slack" src="https://github.com/prowler-cloud/prowler/assets/38561120/3c8b4ec5-6849-41a5-b5e1-52bbb94af73a"></a>
<a href="https://goto.prowler.com/slack"><img width="30" height="30" alt="Prowler community on Slack" src="https://github.com/prowler-cloud/prowler/assets/38561120/3c8b4ec5-6849-41a5-b5e1-52bbb94af73a"></a>
- [AWS Public ECR](https://gallery.ecr.aws/prowler-cloud/prowler)
## From Github
## From GitHub
Python >= 3.9, < 3.13 is required with pip and poetry:
@@ -102,8 +105,7 @@ poetry shell
poetry install
python prowler.py -v
```
???+ note
If you want to clone Prowler from Windows, use `git config core.longpaths true` to allow long file paths.
> If you want to clone Prowler from Windows, use `git config core.longpaths true` to allow long file paths.
# 📐✏️ High level architecture
You can run Prowler from your workstation, a Kubernetes Job, a Google Compute Engine, an Azure VM, an EC2 instance, Fargate or any other container, CloudShell and many more.
@@ -12,7 +12,11 @@ Originally based on [org-multi-account](https://github.com/prowler-cloud/prowler
## Architecture Explanation
The solution is designed to be very simple. Prowler is run via an ECS Task definition that launches a single Fargate container. This Task Definition is executed on a schedule using an EventBridge Rule.
The solution is designed to be very simple. Prowler is run via an ECS Task definition that launches a single Fargate container. This Task Definition is executed on a schedule using an EventBridge Rule.
## Prerequisites
This solution assumes that you have a VPC architecture with two redundant subnets that can reach the AWS API endpoints (e.g. PrivateLink, NAT Gateway, etc.).
## CloudFormation Templates
@@ -59,9 +63,9 @@ The logs that are generated and sent to Cloudwatch are error logs, and assessmen
## Instructions
1. Create a Private ECR Repository in the account that will host the Prowler container. The Audit account is recommended, but any account can be used.
2. Configure the .awsvariables file. Note the ROLE name chosen as it will be the CrossAccountRole.
3. Follow the steps from "View Push Commands" to build and upload the container image. You need to have Docker and AWS CLI installed, and use the cli to login to the account first. After upload note the Image URI, as it is required for the CF-Prowler-ECS template.
4. Make sure SecurityHub is enabled in every account in AWS Organizations, and that the SecurityHub integration is enabled as explained in [Prowler - Security Hub Integration](https://github.com/prowler-cloud/prowler#security-hub-integration)
2. Configure the .awsvariables file. Note the ROLE name chosen as it will be the CrossAccountRole.
3. Follow the steps from "View Push Commands" to build and upload the container image. Substitute step 2 with the build command provided in the Dockerfile. You need to have Docker and AWS CLI installed, and use the cli to login to the account first. After upload note the Image URI, as it is required for the CF-Prowler-ECS template. Ensure that you pay attention to the architecture while performing the docker build command. A common mistake is not specifying the architecture and then building on Apple silicon. Your task will fail with *exec /home/prowler/.local/bin/prowler: exec format error*.
4. Make sure SecurityHub is enabled in every account in AWS Organizations, and that the SecurityHub integration is enabled as explained in [Prowler - Security Hub Integration](https://github.com/prowler-cloud/prowler#security-hub-integration)
5. Deploy **CF-Prowler-CrossAccountRole.yml** in the Master Account as a single stack. You will have to choose the CrossAccountRole name (ProwlerXA-Role by default) and the ProwlerTaskRoleName (ProwlerECSTask-Role by default)
6. Deploy **CF-Prowler-CrossAccountRole.yml** in every Member Account as a StackSet. Choose the same CrossAccountName and ProwlerTaskRoleName as the previous step.
7. Deploy **CF-Prowler-IAM.yml** in the account that will host the Prowler container (the same from step 1). The following template parameters must be provided:
@@ -91,4 +95,4 @@ If you permission find errors in the CloudWatch logs, the culprit might be a [Se
## Upgrading Prowler
Prowler version is controlled by the PROWLERVER argument in the Dockerfile, change it to the desired version and follow the ECR Push Commands to update the container image.
Old images can be deleted from the ECR Repository after the new image is confirmed to work. They will show as "untagged" as only one image can hold the "latest" tag.
Old images can be deleted from the ECR Repository after the new image is confirmed to work. They will show as "untagged" as only one image can hold the "latest" tag.
This guide provides step-by-step instructions for deploying the Prowler Helm chart.
## Prerequisites
Before you begin, ensure you have the following:
1. A running Kubernetes cluster.
2. Helm installed on your local machine. If you don't have Helm installed, you can follow the [Helm installation guide](https://helm.sh/docs/intro/install/).
3. Proper access to your Kubernetes cluster (e.g., `kubectl` is configured and working).
## Deployment Steps
### 1. Clone the Repository
Clone the repository containing the Helm chart to your local machine.
f"{Fore.GREEN}Loading all CSV files from the folder {folder_path_overview} ...\n{Style.RESET_ALL}"
)
cli.show_server_banner=lambda*x:click.echo(
f"{Fore.YELLOW}NOTE:{Style.RESET_ALL} If you are a{Fore.GREEN}{Style.BRIGHT}Prowler SaaS{Style.RESET_ALL}customer and you want to use your data from your S3 bucket,\nrun: `{orange_color}aws s3 cp s3://<your-bucket>/output/csv ./output --recursive{Style.RESET_ALL}`\nand then run `prowler dashboard` again to load the new files."
f"{Fore.YELLOW}NOTE:{Style.RESET_ALL} If you are using{Fore.GREEN}{Style.BRIGHT}Prowler SaaS{Style.RESET_ALL}with the S3 integration or that integration \nfrom {Fore.CYAN}{Style.BRIGHT}Prowler Open Source{Style.RESET_ALL} and you want to use your data from your S3 bucket,\nrun: `{orange_color}aws s3 cp s3://<your-bucket>/output/csv ./output --recursive{Style.RESET_ALL}`\nand then run `prowler dashboard` again to load the new files."
For technical support or any type of inquiries, you are very welcome to:
- Reach out to community members on the [**Prowler Slack channel**](https://join.slack.com/t/prowler-workspace/shared_invite/zt-1hix76xsl-2uq222JIXrC7Q8It~9ZNog)
- Reach out to community members on the [**Prowler Slack channel**](https://goto.prowler.com/slack)
- Open an Issue or a Pull Request in our [**GitHub repository**](https://github.com/prowler-cloud/prowler).
If you are developing Prowler, it's possible that you will encounter some situations where you have to inspect the code in depth to fix some unexpected issues during the execution. To do that, if you are using VSCode you can run the code using the integrated debugger. Please, refer to this [documentation](https://code.visualstudio.com/docs/editor/debugging) for guidance about the debugger in VSCode.
If you are developing Prowler, it's possible that you will encounter some situations where you have to inspect the code in depth to fix some unexpected issues during the execution.
## VSCode
In VSCode you can run the code using the integrated debugger. Please, refer to this [documentation](https://code.visualstudio.com/docs/editor/debugging) for guidance about the debugger in VSCode.
The following file is an example of the [debugging configuration](https://code.visualstudio.com/docs/editor/debugging#_launch-configurations) file that you can add to [Virtual Studio Code](https://code.visualstudio.com/).
This file should inside the *.vscode* folder and its name has to be *launch.json*:
@@ -11,31 +15,62 @@ This file should inside the *.vscode* folder and its name has to be *launch.json
@@ -4,16 +4,18 @@ You can extend Prowler Open Source in many different ways, in most cases you wil
## Get the code and install all dependencies
First of all, you need a version of Python 3.9 or higher and also pip installed to be able to install all dependencies required. Once that is satisfied go a head and clone the repo:
First of all, you need a version of Python 3.9 or higher and also `pip` installed to be able to install all dependencies required.
Then, to start working with the Prowler Github repository you need to fork it to be able to propose changes for new features, bug fixing, etc. To fork the Prowler repo please refer to [this guide](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo?tool=webui#forking-a-repository).
Once that is satisfied go ahead and clone your forked repo:
For isolation and avoid conflicts with other environments, we recommend usage of `poetry`:
```
pip install poetry
```
For isolation and to avoid conflicts with other environments, we recommend using `poetry`, a Python dependency management tool. You can install it by following the instructions [here](https://python-poetry.org/docs/#installation).
Then install all dependencies including the ones for developers:
```
poetry install --with dev
@@ -44,7 +46,12 @@ Before we merge any of your pull requests we pass checks to the code, we use the
You can see all dependencies in file `pyproject.toml`.
Moreover, you would need to install [`TruffleHog`](https://github.com/trufflesecurity/trufflehog) to check for secrets in the code. You can install it using the official installation guide [here](https://github.com/trufflesecurity/trufflehog?tab=readme-ov-file#floppy_disk-installation).
Moreover, you would need to install [`TruffleHog`](https://github.com/trufflesecurity/trufflehog) on the latest version to check for secrets in the code. You can install it using the official installation guide [here](https://github.com/trufflesecurity/trufflehog?tab=readme-ov-file#floppy_disk-installation).
Additionally, please ensure to follow the code documentation practices outlined in this guide: [Google Python Style Guide - Comments and Docstrings](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings).
???+ note
If you have any trouble when committing to the Prowler repository, add the `--no-verify` flag to the `git commit` command.
## Pull Request Checklist
@@ -60,4 +67,4 @@ If you create or review a PR in https://github.com/prowler-cloud/prowler please
## Want some swag as appreciation for your contribution?
If you are like us and you love swag, we are happy to thank you for your contribution with some laptop stickers or whatever other swag we may have at that time. Please, tell us more details and your pull request link in our [Slack workspace here](https://join.slack.com/t/prowler-workspace/shared_invite/zt-1hix76xsl-2uq222JIXrC7Q8It~9ZNog). You can also reach out to Toni de la Fuente on Twitter [here](https://twitter.com/ToniBlyx), his DMs are open.
If you are like us and you love swag, we are happy to thank you for your contribution with some laptop stickers or whatever other swag we may have at that time. Please, tell us more details and your pull request link in our [Slack workspace here](https://goto.prowler.com/slack). You can also reach out to Toni de la Fuente on Twitter [here](https://twitter.com/ToniBlyx), his DMs are open.
@@ -40,10 +40,10 @@ If your IAM entity enforces MFA you can use `--mfa` and Prowler will ask you to
Prowler for Azure supports the following authentication types:
- Service principal authentication by environment variables (Enterprise Application)
- [Service principal application](https://learn.microsoft.com/en-us/entra/identity-platform/app-objects-and-service-principals?tabs=browser#service-principal-object) by environment variables (recommended)
If you try to execute Prowler with the `--sp-env-auth` flag and those variables are empty or not exported, the execution is going to fail.
Follow the instructions in the [Create Prowler Service Principal](../tutorials/azure/create-prowler-service-principal.md) section to create a service principal.
### AZ CLI / Browser / Managed Identity authentication
The other three cases does not need additional configuration, `--az-cli-auth` and `--managed-identity-auth` are automated options. To use `--browser-auth` the user needs to authenticate against Azure using the default browser to start the scan, also `tenant-id` is required.
@@ -64,55 +66,22 @@ The other three cases does not need additional configuration, `--az-cli-auth` an
To use each one you need to pass the proper flag to the execution. Prowler for Azure handles two types of permission scopes, which are:
- **Microsoft Entra ID permissions**: Used to retrieve metadata from the identity assumed by Prowler (not mandatory to have access to execute the tool).
- **Subscription scope permissions**: Required to launch the checks against your resources, mandatory to launch the tool.
#### Microsoft Entra ID scope
Microsoft Entra ID (AAD earlier) permissions required by the tool are the following:
- `Directory.Read.All`
- `Policy.Read.All`
- `UserAuthenticationMethod.Read.All`
The best way to assign it is through the Azure web console:
1. Access to Microsoft Entra ID
2. In the left menu bar, go to "App registrations"
3. Once there, in the menu bar click on "+ New registration" to register a new application
4. Fill the "Name, select the "Supported account types" and click on "Register. You will be redirected to the applications page.

4. Select the new application
5. In the left menu bar, select "API permissions"
6. Then click on "+ Add a permission" and select "Microsoft Graph"
7. Once in the "Microsoft Graph" view, select "Application permissions"
8. Finally, search for "Directory", "Policy" and "UserAuthenticationMethod" select the following permissions:
- **Microsoft Entra ID permissions**: Used to retrieve metadata from the identity assumed by Prowler and specific Entra checks (not mandatory to have access to execute the tool). The permissions required by the tool are the following:
- **Subscription scope permissions**: Required to launch the checks against your resources, mandatory to launch the tool. It is required to add the following RBAC builtin roles per subscription to the entity that is going to be assumed by the tool:
- `Reader`
- `ProwlerRole` (custom role defined in [prowler-azure-custom-role](https://github.com/prowler-cloud/prowler/blob/master/permissions/prowler-azure-custom-role.json))
To assign the permissions, follow the instructions in the [Microsoft Entra ID permissions](../tutorials/azure/create-prowler-service-principal.md#assigning-the-proper-permissions) section and the [Azure subscriptions permissions](../tutorials/azure/subscriptions.md#assigning-proper-permissions) section, respectively.
#### Subscriptions scope
#### Checks that require ProwlerRole
Regarding the subscription scope, Prowler by default scans all the subscriptions that is able to list, so it is required to add the following RBAC builtin roles per subscription to the entity that is going to be assumed by the tool:
The following checks require the `ProwlerRole` custom role to be executed, if you want to run them, make sure you have assigned the role to the identity that is going to be assumed by Prowler:
- `Security Reader`
- `Reader`
To assign this roles, follow the instructions:
1. Access your subscription, then select your subscription.
2. Select "Access control (IAM)".
3. In the overview, select "Roles"

4. Click on "+ Add" and select "Add role assignment"
5. In the search bar, type `Security Reader`, select it and click on "Next"
6. In the Members tab, click on "+ Select members" and add the members you want to assign this role.
7. Click on "Review + assign" to apply the new role.
@@ -19,14 +19,40 @@ It contains hundreds of controls covering CIS, NIST 800, NIST CSF, CISA, RBI, Fe
## Quick Start
### Installation
Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/), thus can be installed using pip with `Python >= 3.9`:
Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/), thus can be installed as Python package with `Python >= 3.9`:
=== "Generic"
=== "pipx"
[pipx](https://pipx.pypa.io/stable/) is a tool to install Python applications in isolated environments. It is recommended to use `pipx` for a global installation.
This method is not recommended because it will modify the environment which you choose to install. Consider using [pipx](https://docs.prowler.com/projects/prowler-open-source/en/latest/#__tabbed_1_1) for a global installation.
_Requirements_:
* `Python >= 3.9`
* `Python pip >= 21.0.0`
* AWS, GCP, Azure and/or Kubernetes credentials
_Commands_:
@@ -36,13 +62,19 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
prowler -v
```
To upgrade Prowler to the latest version, run:
``` bash
pip install --upgrade prowler
```
=== "Docker"
_Requirements_:
* Have `docker` installed: https://docs.docker.com/get-docker/.
* AWS, GCP, Azure and/or Kubernetes credentials
* In the command below, change `-v` to your local directory path in order to access the reports.
* AWS, GCP, Azure and/or Kubernetes credentials
_Commands_:
@@ -54,41 +86,21 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
If you want to clone Prowler from Windows, use `git config core.longpaths true` to allow long file paths.
@@ -97,15 +109,33 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
_Requirements_:
* `Python >= 3.9`
* AWS, GCP, Azure and/or Kubernetes credentials
* Latest Amazon Linux 2 should come with Python 3.9 already installed however it may need pip. Install Python pip 3.9 with: `sudo yum install -y python3-pip`.
* Make sure setuptools for python is already installed with: `pip3 install setuptools`
_Commands_:
```
pip3.9 install prowler
export PATH=$PATH:/home/$HOME/.local/bin/
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install prowler
prowler -v
```
=== "Ubuntu"
_Requirements_:
* `Ubuntu 23.04` or above, if you are using an older version of Ubuntu check [pipx installation](https://docs.prowler.com/projects/prowler-open-source/en/latest/#__tabbed_1_1) and ensure you have `Python >= 3.9`.
* `Python >= 3.9`
* AWS, GCP, Azure and/or Kubernetes credentials
_Commands_:
``` bash
sudo apt update
sudo apt install pipx
pipx ensurepath
pipx install prowler
prowler -v
```
@@ -125,7 +155,7 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
=== "AWS CloudShell"
After the migration of AWS CloudShell from Amazon Linux 2 to Amazon Linux 2023 [[1]](https://aws.amazon.com/about-aws/whats-new/2023/12/aws-cloudshell-migrated-al2023/) [2](https://docs.aws.amazon.com/cloudshell/latest/userguide/cloudshell-AL2023-migration.html), there is no longer a need to manually compile Python 3.9 as it's already included in AL2023. Prowler can thus be easily installed following the Generic method of installation via pip. Follow the steps below to successfully execute Prowler v4 in AWS CloudShell:
After the migration of AWS CloudShell from Amazon Linux 2 to Amazon Linux 2023 [[1]](https://aws.amazon.com/about-aws/whats-new/2023/12/aws-cloudshell-migrated-al2023/) [[2]](https://docs.aws.amazon.com/cloudshell/latest/userguide/cloudshell-AL2023-migration.html), there is no longer a need to manually compile Python 3.9 as it's already included in AL2023. Prowler can thus be easily installed following the Generic method of installation via pip. Follow the steps below to successfully execute Prowler v4 in AWS CloudShell:
_Requirements_:
@@ -133,11 +163,13 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
_Commands_:
```
```bash
sudo bash
adduser prowler
su prowler
pip install prowler
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install prowler
cd /tmp
prowler aws
```
@@ -153,9 +185,12 @@ Prowler is available as a project in [PyPI](https://pypi.org/project/prowler/),
_Commands_:
```
pip install prowler
prowler -v
```bash
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install prowler
cd /tmp
prowler azure --az-cli-auth
```
## Prowler container versions
@@ -212,10 +247,10 @@ prowler <provider>
If you miss the former output you can use `--verbose` but Prowler v4 is smoking fast, so you won't see much ;
By default, Prowler will generate a CSV, JSON and HTML reports, however you can generate a JSON-ASFF (used by AWS Security Hub) report with `-M` or `--output-modes`:
By default, Prowler generates CSV, JSON-OCSF and HTML reports. However, you can generate a JSON-ASFF report (used by AWS Security Hub) with `-M` or `--output-modes`:
```console
prowler <provider> -M csv json json-asff html
prowler <provider> -M csv json-asff json-ocsf html
```
The html report will be located in the output directory as the other files and it will look like:
It is recommended to send only fails to Security Hub and that is possible adding `-q/--quiet` to the command. You can use, instead of the `-q/--quiet` argument, the `--send-sh-only-fails` argument to save all the findings in the Prowler outputs but just to send FAIL findings to AWS Security Hub.
It is recommended to send only fails to Security Hub and that is possible adding `--status FAIL` to the command. You can use, instead of the `--status FAIL` argument, the `--send-sh-only-fails` argument to save all the findings in the Prowler outputs but just to send FAIL findings to AWS Security Hub.
Since Prowler perform checks to all regions by default you may need to filter by region when running Security Hub integration, as shown in the example above. Remember to enable Security Hub in the region or regions you need by calling `aws securityhub enable-security-hub --region <region>` and run Prowler with the option `-f/--region <region>` (if no region is used it will try to push findings in all regions hubs). Prowler will send findings to the Security Hub on the region where the scanned resource is located.
When using the **AWS Security Hub** integration you can send only the `FAIL` findings generated by **Prowler**. Therefore, the **AWS Security Hub** usage costs eventually would be lower. To follow that recommendation you could add the `-q/--quiet` flag to the Prowler command:
When using the **AWS Security Hub** integration you can send only the `FAIL` findings generated by **Prowler**. Therefore, the **AWS Security Hub** usage costs eventually would be lower. To follow that recommendation you could add the `--status FAIL` flag to the Prowler command:
```sh
prowler --security-hub --quiet
prowler --security-hub --status FAIL
```
You can use, instead of the `-q/--quiet` argument, the `--send-sh-only-fails` argument to save all the findings in the Prowler outputs but just to send FAIL findings to AWS Security Hub:
You can use, instead of the `--status FAIL` argument, the `--send-sh-only-fails` argument to save all the findings in the Prowler outputs but just to send FAIL findings to AWS Security Hub:
Threat Detection checks will be only executed using `--category threat-detection` flag due to preformance.
Threat Detection checks will be only executed using `--category threat-detection` flag due to performance.
## Config File
If you want to manage the behavior of the Threat Detection checks you can edit `config.yaml` file from `/prowler/config`. In this file you can edit the following attributes related with Threat Detection:
* `threat_detection_privilege_escalation_threshold`: determines the percentage of actions found to decide if it is an privilege_scalation attack event, by default is 0.1 (10%)
* `threat_detection_privilege_escalation_threshold`: determines the percentage of actions found to decide if it is an privilege_scalation attack event, by default is 0.2 (20%)
* `threat_detection_privilege_escalation_minutes`: it is the past minutes to search from now for privilege_escalation attacks, by default is 1440 minutes (24 hours)
* `threat_detection_privilege_escalation_actions`: these are the default actions related with priviledge scalation.
* `threat_detection_enumeration_threshold`: determines the percentage of actions found to decide if it is an enumeration attack event, by default is 0.1 (10%)
* `threat_detection_privilege_escalation_actions`: these are the default actions related with privilege escalation.
* `threat_detection_enumeration_threshold`: determines the percentage of actions found to decide if it is an enumeration attack event, by default is 0.3 (30%)
* `threat_detection_enumeration_minutes`: it is the past minutes to search from now for enumeration attacks, by default is 1440 minutes (24 hours)
* `threat_detection_enumeration_actions`: these are the default actions related with enumeration attacks.
* `threat_detection_llm_jacking_threshold`: determines the percentage of actions found to decide if it is an LLM Jacking attack event, by default is 0.4 (40%)
* `threat_detection_llm_jacking_minutes`: it is the past minutes to search from now for LLM Jacking attacks, by default is 1440 minutes (24 hours)
* `threat_detection_llm_jacking_actions`: these are the default actions related with LLM Jacking attacks.
To allow Prowler assume an identity to start the scan with the required privileges is necesary to create a Service Principal. To create one follow the next steps:
1. Access to Microsoft Entra ID
2. In the left menu bar, go to "App registrations"
3. Once there, in the menu bar click on "+ New registration" to register a new application
4. Fill the "Name, select the "Supported account types" and click on "Register. You will be redirected to the applications page.
5. Once in the application page, in the left menu bar, select "Certificates & secrets"
6. In the "Certificates & secrets" view, click on "+ New client secret"
7. Fill the "Description" and "Expires" fields and click on "Add"
8. Copy the value of the secret, it is going to be used as `AZURE_CLIENT_SECRET` environment variable.

## Assigning the proper permissions
To allow Prowler to retrieve metadata from the identity assumed and specific Entra checks, it is needed to assign the following permissions:
1. Access to Microsoft Entra ID
2. In the left menu bar, go to "App registrations"
3. Once there, select the application that you have created
4. In the left menu bar, select "API permissions"
5. Then click on "+ Add a permission" and select "Microsoft Graph"
6. Once in the "Microsoft Graph" view, select "Application permissions"
7. Finally, search for "Directory", "Policy" and "UserAuthenticationMethod" select the following permissions:
- `Directory.Read.All`
- `Policy.Read.All`
- `UserAuthenticationMethod.Read.All`
8. Click on "Add permissions" to apply the new permissions.
9. Finally, click on "Grant admin consent for [your tenant]" to apply the permissions.
By default, Prowler is multisubscription, which means that is going to scan all the subscriptions is able to list. If you only assign permissions to one subscription, it is going to scan a single one.
By default, Prowler is multisubscription, which means that is going to scan all the subscriptions is able to list. If you only assign permissions to one subscription, it is going to scan a single one.
Prowler also has the ability to limit the subscriptions to scan to a set passed as input argument, to do so:
Where you can pass from 1 up to N subscriptions to be scanned.
## Assigning proper permissions
Regarding the subscription scope, Prowler by default scans all subscriptions that it is able to list, so it is necessary to add the `Reader` RBAC built-in roles per subscription or management group (recommended for multiple subscriptions, see it in the [next section](#recommendation-for-multiple-subscriptions)) to the entity that will be adopted by the tool:
To assign this roles, follow the instructions:
1. Access your subscription, then select your subscription.
2. Select "Access control (IAM)".
3. In the overview, select "Roles".
4. Click on "+ Add" and select "Add role assignment".
5. In the search bar, type `Reader`, select it and click on "Next".
6. In the Members tab, click on "+ Select members" and add the members you want to assign this role.
7. Click on "Review + assign" to apply the new role.

Moreover, some additional read-only permissions are needed for some checks, for this kind of checks that are not covered by built-in roles we use a custom role. This role is defined in [prowler-azure-custom-role](https://github.com/prowler-cloud/prowler/blob/master/permissions/prowler-azure-custom-role.json). Once the cusotm role is created, repeat the steps mentioned above to assign the new `ProwlerRole` to an identity.
## Recommendation for multiple subscriptions
While scanning multiple subscriptions could be tedious to create and assign roles for each one. For this reason in Prowler we recommend the usage of *[management groups](https://learn.microsoft.com/en-us/azure/governance/management-groups/overview)* to group all subscriptions that are going to be audited by Prowler.
To do this in a proper way you have to [create a new management group](https://learn.microsoft.com/en-us/azure/governance/management-groups/create-management-group-portal) and add all roles in the same way that have been done for subscription scope.
| `ec2_securitygroup_allow_ingress_from_internet_to_any_port` | `ec2_allowed_interface_types` | List of Strings |
| `ec2_securitygroup_allow_ingress_from_internet_to_any_port` | `ec2_allowed_instance_owners` | List of Strings |
## Azure
### Configurable Checks
@@ -80,10 +102,20 @@ The following list includes all the Azure checks with configurable variables tha
```yaml title="config.yaml"
# AWS Configuration
aws:
#AWS Global Configuration
# aws.mute_non_default_regions --> Mute Failed Findings in non-default regions for GuardDuty, SecurityHub, DRS and Config
# aws.mute_non_default_regions --> Set to True to muted failed findings in non-default regions for AccessAnalyzer, GuardDuty, SecurityHub, DRS and Config
mute_non_default_regions: False
#If you want to mute failed findings only in specific regions, create a file with the following syntax and run it with `prowler aws -w mutelist.yaml`:
# Mutelist:
# Accounts:
# "*":
# Checks:
# "*":
# Regions:
# - "ap-southeast-1"
# - "ap-southeast-2"
# Resources:
# - "*"
#AWS IAM Configuration
# aws.iam_user_accesskey_unused --> CIS recommends 45 days
@@ -93,6 +125,7 @@ aws:
#AWS EC2 Configuration
# aws.ec2_elastic_ip_shodan
# TODO: create common config
shodan_api_key: null
# aws.ec2_securitygroup_with_many_ingress_egress_rules --> by default is 50 rules
max_security_group_rules: 50
@@ -102,16 +135,32 @@ aws:
# allowed network interface types for security groups open to the Internet
ec2_allowed_interface_types:
[
"api_gateway_managed",
"vpc_endpoint",
"api_gateway_managed",
"vpc_endpoint",
]
# allowed network interface owners for security groups open to the Internet
threat_detection_privilege_escalation_entropy: 0.7 #Percentage of actions found to decide if it is an privilege_escalation attack event, by default is 0.7 (70%)
threat_detection_privilege_escalation_threshold: 0.2 #Percentage of actions found to decide if it is an privilege_escalation attack event, by default is 0.2 (20%)
threat_detection_privilege_escalation_minutes: 1440 # Past minutes to search from now for privilege_escalation attacks, by default is 1440 minutes (24 hours)
threat_detection_privilege_escalation_actions: [
"AddPermission",
"AddRoleToInstanceProfile",
"AddUserToGroup",
"AssociateAccessPolicy",
"AssumeRole",
"AttachGroupPolicy",
"AttachRolePolicy",
"AttachUserPolicy",
"ChangePassword",
"CreateAccessEntry",
"CreateAccessKey",
"CreateDevEndpoint",
"CreateEventSourceMapping",
"CreateFunction",
"CreateGroup",
"CreateJob",
"CreateKeyPair",
"CreateLoginProfile",
"CreatePipeline",
"CreatePolicyVersion",
"CreateRole",
"CreateStack",
"DeleteRolePermissionsBoundary",
"DeleteRolePolicy",
"DeleteUserPermissionsBoundary",
"DeleteUserPolicy",
"DetachRolePolicy",
"DetachUserPolicy",
"GetCredentialsForIdentity",
"GetId",
"GetPolicyVersion",
"GetUserPolicy",
"Invoke",
"ModifyInstanceAttribute",
"PassRole",
"PutGroupPolicy",
"PutPipelineDefinition",
"PutRolePermissionsBoundary",
"PutRolePolicy",
"PutUserPermissionsBoundary",
"PutUserPolicy",
"ReplaceIamInstanceProfileAssociation",
"RunInstances",
"SetDefaultPolicyVersion",
"UpdateAccessKey",
"UpdateAssumeRolePolicy",
"UpdateDevEndpoint",
"UpdateEventSourceMapping",
"UpdateFunctionCode",
"UpdateJob",
"UpdateLoginProfile",
]
threat_detection_privilege_escalation_actions:
[
"AddPermission",
"AddRoleToInstanceProfile",
"AddUserToGroup",
"AssociateAccessPolicy",
"AssumeRole",
"AttachGroupPolicy",
"AttachRolePolicy",
"AttachUserPolicy",
"ChangePassword",
"CreateAccessEntry",
"CreateAccessKey",
"CreateDevEndpoint",
"CreateEventSourceMapping",
"CreateFunction",
"CreateGroup",
"CreateJob",
"CreateKeyPair",
"CreateLoginProfile",
"CreatePipeline",
"CreatePolicyVersion",
"CreateRole",
"CreateStack",
"DeleteRolePermissionsBoundary",
"DeleteRolePolicy",
"DeleteUserPermissionsBoundary",
"DeleteUserPolicy",
"DetachRolePolicy",
"DetachUserPolicy",
"GetCredentialsForIdentity",
"GetId",
"GetPolicyVersion",
"GetUserPolicy",
"Invoke",
"ModifyInstanceAttribute",
"PassRole",
"PutGroupPolicy",
"PutPipelineDefinition",
"PutRolePermissionsBoundary",
"PutRolePolicy",
"PutUserPermissionsBoundary",
"PutUserPolicy",
"ReplaceIamInstanceProfileAssociation",
"RunInstances",
"SetDefaultPolicyVersion",
"UpdateAccessKey",
"UpdateAssumeRolePolicy",
"UpdateDevEndpoint",
"UpdateEventSourceMapping",
"UpdateFunctionCode",
"UpdateJob",
"UpdateLoginProfile",
]
# aws.cloudtrail_threat_detection_enumeration
threat_detection_enumeration_entropy: 0.7 #Percentage of actions found to decide if it is an enumeration attack event, by default is 0.7 (70%)
threat_detection_enumeration_threshold: 0.3 #Percentage of actions found to decide if it is an enumeration attack event, by default is 0.3 (30%)
threat_detection_enumeration_minutes: 1440 # Past minutes to search from now for enumeration attacks, by default is 1440 minutes (24 hours)
threat_detection_enumeration_actions: [
"DescribeAccessEntry",
"DescribeAccountAttributes",
"DescribeAvailabilityZones",
"DescribeBundleTasks",
"DescribeCarrierGateways",
"DescribeClientVpnRoutes",
"DescribeCluster",
"DescribeDhcpOptions",
"DescribeFlowLogs",
"DescribeImages",
"DescribeInstanceAttribute",
"DescribeInstanceInformation",
"DescribeInstanceTypes",
"DescribeInstances",
"DescribeInstances",
"DescribeKeyPairs",
"DescribeLogGroups",
"DescribeLogStreams",
"DescribeOrganization",
"DescribeRegions",
"DescribeSecurityGroups",
"DescribeSnapshotAttribute",
"DescribeSnapshotTierStatus",
"DescribeSubscriptionFilters",
"DescribeTransitGatewayMulticastDomains",
"DescribeVolumes",
"DescribeVolumesModifications",
"DescribeVpcEndpointConnectionNotifications",
"DescribeVpcs",
"GetAccount",
"GetAccountAuthorizationDetails",
"GetAccountSendingEnabled",
"GetBucketAcl",
"GetBucketLogging",
"GetBucketPolicy",
"GetBucketReplication",
"GetBucketVersioning",
"GetCallerIdentity",
"GetCertificate",
"GetConsoleScreenshot",
"GetCostAndUsage",
"GetDetector",
"GetEbsDefaultKmsKeyId",
"GetEbsEncryptionByDefault",
"GetFindings",
"GetFlowLogsIntegrationTemplate",
"GetIdentityVerificationAttributes",
"GetInstances",
"GetIntrospectionSchema",
"GetLaunchTemplateData",
"GetLaunchTemplateData",
"GetLogRecord",
"GetParameters",
"GetPolicyVersion",
"GetPublicAccessBlock",
"GetQueryResults",
"GetRegions",
"GetSMSAttributes",
"GetSMSSandboxAccountStatus",
"GetSendQuota",
"GetTransitGatewayRouteTableAssociations",
"GetUserPolicy",
"HeadObject",
"ListAccessKeys",
"ListAccounts",
"ListAllMyBuckets",
"ListAssociatedAccessPolicies",
"ListAttachedUserPolicies",
"ListClusters",
"ListDetectors",
"ListDomains",
"ListFindings",
"ListHostedZones",
"ListIPSets",
"ListIdentities",
"ListInstanceProfiles",
"ListObjects",
"ListOrganizationalUnitsForParent",
"ListOriginationNumbers",
"ListPolicyVersions",
"ListRoles",
"ListRoles",
"ListRules",
"ListServiceQuotas",
"ListSubscriptions",
"ListTargetsByRule",
"ListTopics",
"ListUsers",
"LookupEvents",
"Search",
]
threat_detection_enumeration_actions:
[
"DescribeAccessEntry",
"DescribeAccountAttributes",
"DescribeAvailabilityZones",
"DescribeBundleTasks",
"DescribeCarrierGateways",
"DescribeClientVpnRoutes",
"DescribeCluster",
"DescribeDhcpOptions",
"DescribeFlowLogs",
"DescribeImages",
"DescribeInstanceAttribute",
"DescribeInstanceInformation",
"DescribeInstanceTypes",
"DescribeInstances",
"DescribeInstances",
"DescribeKeyPairs",
"DescribeLogGroups",
"DescribeLogStreams",
"DescribeOrganization",
"DescribeRegions",
"DescribeSecurityGroups",
"DescribeSnapshotAttribute",
"DescribeSnapshotTierStatus",
"DescribeSubscriptionFilters",
"DescribeTransitGatewayMulticastDomains",
"DescribeVolumes",
"DescribeVolumesModifications",
"DescribeVpcEndpointConnectionNotifications",
"DescribeVpcs",
"GetAccount",
"GetAccountAuthorizationDetails",
"GetAccountSendingEnabled",
"GetBucketAcl",
"GetBucketLogging",
"GetBucketPolicy",
"GetBucketReplication",
"GetBucketVersioning",
"GetCallerIdentity",
"GetCertificate",
"GetConsoleScreenshot",
"GetCostAndUsage",
"GetDetector",
"GetEbsDefaultKmsKeyId",
"GetEbsEncryptionByDefault",
"GetFindings",
"GetFlowLogsIntegrationTemplate",
"GetIdentityVerificationAttributes",
"GetInstances",
"GetIntrospectionSchema",
"GetLaunchTemplateData",
"GetLaunchTemplateData",
"GetLogRecord",
"GetParameters",
"GetPolicyVersion",
"GetPublicAccessBlock",
"GetQueryResults",
"GetRegions",
"GetSMSAttributes",
"GetSMSSandboxAccountStatus",
"GetSendQuota",
"GetTransitGatewayRouteTableAssociations",
"GetUserPolicy",
"HeadObject",
"ListAccessKeys",
"ListAccounts",
"ListAllMyBuckets",
"ListAssociatedAccessPolicies",
"ListAttachedUserPolicies",
"ListClusters",
"ListDetectors",
"ListDomains",
"ListFindings",
"ListHostedZones",
"ListIPSets",
"ListIdentities",
"ListInstanceProfiles",
"ListObjects",
"ListOrganizationalUnitsForParent",
"ListOriginationNumbers",
"ListPolicyVersions",
"ListRoles",
"ListRoles",
"ListRules",
"ListServiceQuotas",
"ListSubscriptions",
"ListTargetsByRule",
"ListTopics",
"ListUsers",
"LookupEvents",
"Search",
]
# aws.cloudtrail_threat_detection_llm_jacking
threat_detection_llm_jacking_threshold: 0.4 #Percentage of actions found to decide if it is an LLM Jacking attack event, by default is 0.4 (40%)
threat_detection_llm_jacking_minutes: 1440 # Past minutes to search from now for LLM Jacking attacks, by default is 1440 minutes (24 hours)
threat_detection_llm_jacking_actions:
[
"PutUseCaseForModelAccess", # Submits a use case for model access, providing justification (Write).
"PutFoundationModelEntitlement", # Grants entitlement for accessing a foundation model (Write).
"PutModelInvocationLoggingConfiguration", # Configures logging for model invocations (Write).
"CreateFoundationModelAgreement", # Creates a new agreement to use a foundation model (Write).
"InvokeModel", # Invokes a specified Bedrock model for inference using provided prompt and parameters (Read).
"InvokeModelWithResponseStream", # Invokes a Bedrock model for inference with real-time token streaming (Read).
"GetUseCaseForModelAccess", # Retrieves an existing use case for model access (Read).
"GetModelInvocationLoggingConfiguration", # Fetches the logging configuration for model invocations (Read).
"GetFoundationModelAvailability", # Checks the availability of a foundation model for use (Read).
"ListFoundationModelAgreementOffers", # Lists available agreement offers for accessing foundation models (List).
"ListFoundationModels", # Lists the available foundation models in Bedrock (List).
"ListProvisionedModelThroughputs", # Lists the provisioned throughput for previously created models (List).
]
# AWS RDS Configuration
# aws.rds_instance_backup_enabled
# Whether to check RDS instance replicas or not
check_rds_instance_replicas: False
# AWS ACM Configuration
# aws.acm_certificates_expiration_check
days_to_expire_threshold: 7
# AWS EKS Configuration
# aws.eks_control_plane_logging_all_types_enabled
# EKS control plane logging types that must be enabled
eks_required_log_types:
[
"api",
"audit",
"authenticator",
"controllerManager",
"scheduler",
]
# aws.eks_cluster_uses_a_supported_version
# EKS clusters must be version 1.28 or higher
eks_cluster_oldest_version_supported: "1.28"
# AWS CodeBuild Configuration
# aws.codebuild_project_no_secrets_in_variables
# CodeBuild sensitive variables that are excluded from the check
docker run --env HOST=0.0.0.0 --publish 127.0.0.1:11666:11666 toniblyx/prowler:latest dashboard
docker run -v /your/local/dir/prowler-output:/home/prowler/output --env HOST=0.0.0.0 --publish 127.0.0.1:11666:11666 toniblyx/prowler:latest dashboard
```
Make sure you update the `/your/local/dir/prowler-output` to match the path that contains your prowler output.
???+ note
**Remember that the `dashboard` server is not authenticated, if you expose it to the internet, you are running it at your own risk.**
@@ -81,7 +83,7 @@ def get_table(data):
## S3 Integration
If you are a Prowler Saas customer and you want to use your data from your S3 bucket, you can run:
If you are using Prowler SaaS with the S3 integration or that integration from Prowler Open Source and you want to use your data from your S3 bucket, you can run:
It's important to note that using the fixers for `Access Analyzer`, `GuardDuty`, and `SecurityHub` may incur additional costs. These AWS services might trigger actions or deploy resources that can lead to charges on your AWS account.
## Writing a Fixer
To write a fixer, you need to create a file called `<check_id>_fixer.py` inside the check folder, with a function called `fixer` that receives either the region or the resource to be fixed as a parameter, and returns a boolean value indicating if the fix was successful or not.
@@ -25,7 +25,17 @@ Prowler will follow the same credentials search as [Google authentication librar
Those credentials must be associated to a user or service account with proper permissions to do all checks. To make sure, add the `Viewer` role to the member associated with the credentials.
# GCP Service APIs
## Impersonate Service Account
If you want to impersonate a GCP service account, you can use the `--impersonate-service-account` argument:
This argument will use the default credentials to impersonate the service account provided.
## Service APIs
Prowler will use the Google Cloud APIs to get the information needed to perform the checks. Make sure that the following APIs are enabled in the project:
By default, Prowler scans all Google Cloud projects accessible to the authenticated user.
To limit the scan to projects within a specific Google Cloud organization, use the `--organization-id` option with the GCP organization ID:
```console
prowler gcp --organization-id organization-id
```
???+ warning
Make sure that the used credentials have the role Cloud Asset Viewer (`roles/cloudasset.viewer`) or Cloud Asset Owner (`roles/cloudasset.owner`) on the organization level.
???+ note
With this option, Prowler retrieves all projects within the specified organization, including those organized in folders and nested subfolders. This ensures that every project under the organization’s hierarchy is scanned, providing full visibility across the entire organization.
???+ note
To find the organization ID, use the following command:
kubectl get pods --namespace prowler-ns --> prowler-XXXXX
kubectl logs prowler-XXXXX --namespace prowler-ns
```
???+ note
By default, `prowler` will scan all namespaces in your active Kubernetes context. Use the [`--namespace`](https://docs.prowler.com/projects/prowler-open-source/en/latest/tutorials/kubernetes/namespace/) flag to specify the namespace(s) to be scanned.
For non in-cluster execution, you can provide the location of the [kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) file with the following argument:
If no `--kubeconfig-file` is provided, Prowler will use the default KubeConfig file location (`~/.kube/config`).
???+ note
`prowler` will scan the active Kubernetes context by default. Use the [`--context`](https://docs.prowler.com/projects/prowler-open-source/en/latest/tutorials/kubernetes/context/) flag to specify the context to be scanned.
???+ note
By default, `prowler` will scan all namespaces in your active Kubernetes context. Use the [`--namespace`](https://docs.prowler.com/projects/prowler-open-source/en/latest/tutorials/kubernetes/namespace/) flag to specify the namespace(s) to be scanned.
@@ -7,97 +7,155 @@ Mutelist option works along with other options and will modify the output in the
- CSV: `muted` is `True`. The field `status` will keep the original status, `MANUAL`, `PASS` or `FAIL`, of the finding.
You can use `-w`/`--mutelist-file` with the path of your mutelist yaml file:
## How the Mutelist Works
The **Mutelist** uses both "AND" and "OR" logic to determine which resources, checks, regions, and tags should be muted. For each check, the Mutelist evaluates whether the account, region, and resource match the specified criteria using "AND" logic. If tags are specified, the Mutelist can apply either "AND" or "OR" logic.
If any of the criteria do not match, the check is not muted.
???+ note
Remember that mutelist can be used with regular expressions.
##Mutelist Specification
???+ note
- For Azure provider, the Account ID is the Subscription Name and the Region is the Location.
- For GCP provider, the Account ID is the Project ID and the Region is the Zone.
- For Kubernetes provider, the Account ID is the Cluster Name and the Region is the Namespace.
The Mutelist file uses the [YAML](https://en.wikipedia.org/wiki/YAML) format with the following syntax:
```yaml
### Account, Check and/or Region can be * to apply for all the cases.
### Resources and tags are lists that can have either Regex or Keywords.
### Tags is an optional list that matches on tuples of 'key=value' and are "ANDed" together.
### Use an alternation Regex to match one of multiple tags with "ORed" logic.
###For each check you can except Accounts, Regions, Resources and/or Tags.
########################### MUTELIST EXAMPLE ###########################
Mutelist:
Accounts:
"123456789012":
Checks:
"iam_user_hardware_mfa_enabled":
Regions:
- "us-east-1"
Resources:
- "user-1" # Will mute user-1 in check iam_user_hardware_mfa_enabled
- "user-2" # Will mute user-2 in check iam_user_hardware_mfa_enabled
"ec2_*":
Regions:
- "*"
Resources:
- "*" # Will mute every EC2 check in every account and region
"*":
Regions:
- "*"
Resources:
- "test"
Tags:
- "test=test" # Will mute every resource containing the string "test" and the tags 'test=test' and
- "project=test|project=stage" # either of ('project=test' OR project=stage) in account 123456789012 and every region
"*":
Regions:
- "*"
Resources:
- "test"
Tags:
- "test=test"
- "project=test" # This will mute every resource containing the string "test" and BOTH tags at the same time.
"*":
Regions:
- "*"
Resources:
- "test"
Tags: # This will mute every resource containing the string "test" and the ones that contain EITHER the `test=test` OR `project=test` OR `project=dev`
- "test=test|project=(test|dev)"
"*":
Regions:
- "*"
Resources:
- "test"
Tags:
- "test=test" # This will mute every resource containing the string "test" and the tags `test=test` and either `project=test` OR `project=stage` in every account and region.
- "project=test|project=stage"
"*":
Checks:
"s3_bucket_object_versioning":
Regions:
- "eu-west-1"
- "us-east-1"
Resources:
- "ci-logs" # Will mute bucket "ci-logs" AND ALSO bucket "ci-logs-replica" in specified check and regions
- "logs" # Will mute EVERY BUCKET containing the string "logs" in specified check and regions
- ".+-logs" # Will mute all buckets containing the terms ci-logs, qa-logs, etc. in specified check and regions
"ecs_task_definitions_no_environment_secrets":
Regions:
- "*"
Resources:
- "*"
Exceptions:
Accounts:
- "0123456789012"
Regions:
- "eu-west-1"
- "eu-south-2" # Will mute every resource in check ecs_task_definitions_no_environment_secrets except the ones in account 0123456789012 located in eu-south-2 or eu-west-1
"*":
Regions:
- "*"
Resources:
- "*"
Tags:
- "environment=dev" # Will mute every resource containing the tag 'environment=dev' in every account and region
"123456789012":
Checks:
"*":
Regions:
- "*"
Resources:
- "*"
Exceptions:
Resources:
- "test"
Tags:
- "environment=prod" # Will mute every resource except in account 123456789012 except the ones containing the string "test" and tag environment=prod
"*":
Checks:
"ec2_*":
Regions:
- "*"
Resources:
- "test-resource" # Will mute the resource "test-resource" in all accounts and regions for whatever check from the EC2 service
```
### Account, Check, Region, Resource, and Tag
| Field | Description | Logic |
|----------|----------|----------|
| `account_id` | Use `*` to apply the mutelist to all accounts. | `ANDed` |
| `check_name` | The name of the Prowler check. Use `*` to apply the mutelist to all checks, or `service_*` to apply it to all service's checks. | `ANDed` |
| `region` | The region identifier. Use `*` to apply the mutelist to all regions. | `ANDed` |
| `resource` | The resource identifier. Use `*` to apply the mutelist to all resources. | `ANDed` |
| `tag` | The tag value. | `ORed` |
## How to Use the Mutelist
To use the Mutelist, you need to specify the path to the Mutelist YAML file using the `-w` or `--mutelist-file` option when running Prowler:
```
prowler <provider> -w mutelist.yaml
```
##Mutelist YAML File Syntax
Replace `<provider>` with the appropriate provider name.
???+ note
For Azure provider, the Account ID is the Subscription Name and the Region is the Location.
## Considerations
???+ note
For GCP provider, the Account ID is the Project ID and the Region is the Zone.
- The Mutelist can be used in combination with other Prowler options, such as the `--service` or `--checks` option, to further customize the scanning process.
- Make sure to review and update the Mutelist regularly to ensure it reflects the desired exclusions and remains up to date with your infrastructure.
???+ note
For Kubernetes provider, the Account ID is the Cluster Name and the Region is the Namespace.
The Mutelist file is a YAML file with the following syntax:
```yaml
### Account, Check and/or Region can be * to apply for all the cases.
### Resources and tags are lists that can have either Regex or Keywords.
### Tags is an optional list that matches on tuples of 'key=value' and are "ANDed" together.
### Use an alternation Regex to match one of multiple tags with "ORed" logic.
###For each check you can except Accounts, Regions, Resources and/or Tags.
########################### MUTELIST EXAMPLE ###########################
Mutelist:
Accounts:
"123456789012":
Checks:
"iam_user_hardware_mfa_enabled":
Regions:
- "us-east-1"
Resources:
- "user-1" # Will ignore user-1 in check iam_user_hardware_mfa_enabled
- "user-2" # Will ignore user-2 in check iam_user_hardware_mfa_enabled
"ec2_*":
Regions:
- "*"
Resources:
- "*" # Will ignore every EC2 check in every account and region
"*":
Regions:
- "*"
Resources:
- "test"
Tags:
- "test=test" # Will ignore every resource containing the string "test" and the tags 'test=test' and
- "project=test|project=stage" # either of ('project=test' OR project=stage) in account 123456789012 and every region
"*":
Checks:
"s3_bucket_object_versioning":
Regions:
- "eu-west-1"
- "us-east-1"
Resources:
- "ci-logs" # Will ignore bucket "ci-logs" AND ALSO bucket "ci-logs-replica" in specified check and regions
- "logs" # Will ignore EVERY BUCKET containing the string "logs" in specified check and regions
- ".+-logs" # Will ignore all buckets containing the terms ci-logs, qa-logs, etc. in specified check and regions
"ecs_task_definitions_no_environment_secrets":
Regions:
- "*"
Resources:
- "*"
Exceptions:
Accounts:
- "0123456789012"
Regions:
- "eu-west-1"
- "eu-south-2" # Will ignore every resource in check ecs_task_definitions_no_environment_secrets except the ones in account 0123456789012 located in eu-south-2 or eu-west-1
"*":
Regions:
- "*"
Resources:
- "*"
Tags:
- "environment=dev" # Will ignore every resource containing the tag 'environment=dev' in every account and region
"123456789012":
Checks:
"*":
Regions:
- "*"
Resources:
- "*"
Exceptions:
Resources:
- "test"
Tags:
- "environment=prod" # Will ignore every resource except in account 123456789012 except the ones containing the string "test" and tag environment=prod
Currently, this tool is only available for creating checks for the AWS provider.
**Prowler Check Kreator** is a utility designed to streamline the creation of new checks for Prowler. This tool generates all necessary files required to add a new check to the Prowler repository. Specifically, it creates:
- A dedicated folder for the check.
- The main check script.
- A metadata file with essential details.
- A folder and file structure for testing the check.
## Usage
To use the tool, execute the main script with the following command:
- `<prowler_provider>`: Currently only AWS is supported.
- `<check_name>`: The name you wish to assign to the new check.
## AI integration
This tool optionally integrates AI to assist in generating the check code and metadata file content. When AI assistance is chosen, the tool uses [Gemini](https://gemini.google.com/) to produce preliminary code and metadata.
???+ note
For this feature to work, you must have the library `google-generativeai` installed in your Python environment.
???+ warning
AI-generated code and metadata might contain errors or require adjustments to align with specific Prowler requirements. Carefully review all AI-generated content before committing.
To enable AI assistance, simply confirm when prompted by the tool. Additionally, ensure that the `GEMINI_API_KEY` environment variable is set with a valid Gemini API key. For instructions on obtaining your API key, refer to the [Gemini documentation](https://ai.google.dev/gemini-api/docs/api-key).
You can have certificates in ACM that are not in use by any AWS resource.
Prowler will check if every certificate is going to expire soon, if this certificate is not in use by default it is not going to be check if it is expired, is going to expire soon or it is good.
- `acm_certificates_expiration_check`
####Athena
When you create an AWS Account, Athena will create a default primary workgroup for you.
Prowler will check if that workgroup is enabled and if it is being used by checking if there were queries in the last 45 days.
@@ -30,10 +36,11 @@ If EBS default encyption is not enabled, sensitive information at rest is not pr
- `ec2_ebs_default_encryption`
If your Security groups are not properly configured the attack surface is increased, nonetheless, Prowler will detect those security groups that are being used (they are attached) to only notify those that are being used. This logic applies to the 15 checks related to open ports in security groups and the check for the default security group.
If your Security groups are not properly configured the attack surface is increased, nonetheless, Prowler will detect those security groups that are being used (they are attached) to only notify those that are being used. This logic applies to the 15 checks related to open ports in security groups, the check for the default security group and for the security groups that allow ingress and egress traffic.
"Description":"Amazon S3 provides a variety of no, or low, cost encryption options to protect data at rest.",
@@ -476,7 +477,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"At the Amazon S3 bucket level, you can configure permissions through a bucket policy making the objects accessible only through HTTPS.",
@@ -497,7 +499,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Once MFA Delete is enabled on your sensitive and classified S3 bucket it requires the user to have two forms of authentication.",
@@ -518,7 +521,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Amazon S3 buckets can contain sensitive data, that for security purposes should be discovered, monitored, classified and protected. Macie along with other 3rd party tools can automatically provide an inventory of Amazon S3 buckets.",
@@ -540,7 +544,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon S3 provides `Block public access (bucket settings)` and `Block public access (account settings)` to help you manage public access to Amazon S3 resources. By default, S3 buckets and objects are created with public access disabled. However, an IAM principal with sufficient S3 permissions can enable public access at the bucket and/or object level. While enabled, `Block public access (bucket settings)` prevents an individual bucket, and its contained objects, from becoming publicly accessible. Similarly, `Block public access (account settings)` prevents all buckets, and contained objects, from becoming publicly accessible across the entire account.",
@@ -561,7 +566,8 @@
],
"Attributes":[
{
"Section":"2.2. Elastic Compute Cloud (EC2)",
"Section":"2. Storage",
"SubSection":"2.2. Elastic Compute Cloud (EC2)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Elastic Compute Cloud (EC2) supports encryption at rest when using the Elastic Block Store (EBS) service. While disabled by default, forcing encryption at EBS volume creation is supported.",
@@ -578,11 +584,13 @@
"Id":"2.3.1",
"Description":"Ensure that encryption is enabled for RDS Instances",
"Checks":[
"rds_instance_storage_encrypted"
"rds_instance_storage_encrypted",
"rds_instance_transport_encrypted"
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.",
"Description":"Amazon S3 provides a variety of no, or low, cost encryption options to protect data at rest.",
@@ -476,7 +477,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"At the Amazon S3 bucket level, you can configure permissions through a bucket policy making the objects accessible only through HTTPS.",
@@ -497,7 +499,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Once MFA Delete is enabled on your sensitive and classified S3 bucket it requires the user to have two forms of authentication.",
@@ -518,7 +521,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Amazon S3 buckets can contain sensitive data, that for security purposes should be discovered, monitored, classified and protected. Macie along with other 3rd party tools can automatically provide an inventory of Amazon S3 buckets.",
@@ -540,7 +544,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon S3 provides `Block public access (bucket settings)` and `Block public access (account settings)` to help you manage public access to Amazon S3 resources. By default, S3 buckets and objects are created with public access disabled. However, an IAM principal with sufficient S3 permissions can enable public access at the bucket and/or object level. While enabled, `Block public access (bucket settings)` prevents an individual bucket, and its contained objects, from becoming publicly accessible. Similarly, `Block public access (account settings)` prevents all buckets, and contained objects, from becoming publicly accessible across the entire account.",
@@ -561,7 +566,8 @@
],
"Attributes":[
{
"Section":"2.2. Elastic Compute Cloud (EC2)",
"Section":"2. Storage",
"SubSection":"2.2. Elastic Compute Cloud (EC2)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Elastic Compute Cloud (EC2) supports encryption at rest when using the Elastic Block Store (EBS) service. While disabled by default, forcing encryption at EBS volume creation is supported.",
@@ -578,11 +584,13 @@
"Id":"2.3.1",
"Description":"Ensure that encryption is enabled for RDS Instances",
"Checks":[
"rds_instance_storage_encrypted"
"rds_instance_storage_encrypted",
"rds_instance_transport_encrypted"
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.",
@@ -603,7 +611,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that RDS database instances have the Auto Minor Version Upgrade flag enabled in order to receive automatically minor engine upgrades during the specified maintenance window. So, RDS instances can get the new features, bug fixes, and security patches for their database engines.",
@@ -624,7 +633,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure and verify that RDS database instances provisioned in your AWS account do restrict unauthorized access in order to minimize security risks. To restrict access to any publicly accessible RDS database instance, you must disable the database Publicly Accessible flag and update the VPC security group associated with the instance.",
@@ -645,7 +655,8 @@
],
"Attributes":[
{
"Section":"2.4 Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.4 Elastic File System (EFS)",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"EFS data should be encrypted at rest using AWS KMS (Key Management Service).",
"Description":"Ensure access to AWSCloudShellFullAccess is restricted",
"Checks":[],
"Checks":[
"iam_policy_cloudshell_admin_not_attached"
],
"Attributes":[
{
"Section":"1. Identity and Access Management",
@@ -474,7 +476,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"At the Amazon S3 bucket level, you can configure permissions through a bucket policy making the objects accessible only through HTTPS.",
@@ -491,11 +494,13 @@
"Id":"2.1.2",
"Description":"Ensure MFA Delete is enabled on S3 buckets",
"Checks":[
"s3_bucket_no_mfa_delete"
"s3_bucket_no_mfa_delete",
"cloudtrail_bucket_requires_mfa_delete"
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Once MFA Delete is enabled on your sensitive and classified S3 bucket it requires the user to have two forms of authentication.",
@@ -516,7 +521,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Amazon S3 buckets can contain sensitive data, that for security purposes should be discovered, monitored, classified and protected. Macie along with other 3rd party tools can automatically provide an inventory of Amazon S3 buckets.",
@@ -538,7 +544,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon S3 provides `Block public access (bucket settings)` and `Block public access (account settings)` to help you manage public access to Amazon S3 resources. By default, S3 buckets and objects are created with public access disabled. However, an IAM principal with sufficient S3 permissions can enable public access at the bucket and/or object level. While enabled, `Block public access (bucket settings)` prevents an individual bucket, and its contained objects, from becoming publicly accessible. Similarly, `Block public access (account settings)` prevents all buckets, and contained objects, from becoming publicly accessible across the entire account.",
@@ -559,7 +566,8 @@
],
"Attributes":[
{
"Section":"2.2. Elastic Compute Cloud (EC2)",
"Section":"2. Storage",
"SubSection":"2.2. Elastic Compute Cloud (EC2)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Elastic Compute Cloud (EC2) supports encryption at rest when using the Elastic Block Store (EBS) service. While disabled by default, forcing encryption at EBS volume creation is supported.",
@@ -576,11 +584,13 @@
"Id":"2.3.1",
"Description":"Ensure that encryption is enabled for RDS Instances",
"Checks":[
"rds_instance_storage_encrypted"
"rds_instance_storage_encrypted",
"rds_instance_transport_encrypted"
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.",
@@ -601,7 +611,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that RDS database instances have the Auto Minor Version Upgrade flag enabled in order to receive automatically minor engine upgrades during the specified maintenance window. So, RDS instances can get the new features, bug fixes, and security patches for their database engines.",
@@ -622,7 +633,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure and verify that RDS database instances provisioned in your AWS account do restrict unauthorized access in order to minimize security risks. To restrict access to any publicly accessible RDS database instance, you must disable the database Publicly Accessible flag and update the VPC security group associated with the instance.",
@@ -643,7 +655,8 @@
],
"Attributes":[
{
"Section":"2.4 Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.4 Elastic File System (EFS)",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"EFS data should be encrypted at rest using AWS KMS (Key Management Service).",
@@ -1338,7 +1351,8 @@
"Id":"5.6",
"Description":"Ensure that EC2 Metadata Service only allows IMDSv2",
"Description":"At the Amazon S3 bucket level, you can configure permissions through a bucket policy making the objects accessible only through HTTPS.",
@@ -495,7 +496,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Once MFA Delete is enabled on your sensitive and classified S3 bucket it requires the user to have two forms of authentication.",
@@ -516,7 +518,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Amazon S3 buckets can contain sensitive data, that for security purposes should be discovered, monitored, classified and protected. Macie along with other 3rd party tools can automatically provide an inventory of Amazon S3 buckets.",
@@ -538,7 +541,8 @@
],
"Attributes":[
{
"Section":"2.1. Simple Storage Service (S3)",
"Section":"2. Storage",
"SubSection":"2.1. Simple Storage Service (S3)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon S3 provides `Block public access (bucket settings)` and `Block public access (account settings)` to help you manage public access to Amazon S3 resources. By default, S3 buckets and objects are created with public access disabled. However, an IAM principal with sufficient S3 permissions can enable public access at the bucket and/or object level. While enabled, `Block public access (bucket settings)` prevents an individual bucket, and its contained objects, from becoming publicly accessible. Similarly, `Block public access (account settings)` prevents all buckets, and contained objects, from becoming publicly accessible across the entire account.",
@@ -559,7 +563,8 @@
],
"Attributes":[
{
"Section":"2.2. Elastic Compute Cloud (EC2)",
"Section":"2. Storage",
"SubSection":"2.2. Elastic Compute Cloud (EC2)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Elastic Compute Cloud (EC2) supports encryption at rest when using the Elastic Block Store (EBS) service. While disabled by default, forcing encryption at EBS volume creation is supported.",
@@ -580,7 +585,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Amazon RDS encrypted DB instances use the industry standard AES-256 encryption algorithm to encrypt your data on the server that hosts your Amazon RDS DB instances. After your data is encrypted, Amazon RDS handles authentication of access and decryption of your data transparently with a minimal impact on performance.",
@@ -601,7 +607,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that RDS database instances have the Auto Minor Version Upgrade flag enabled in order to receive automatically minor engine upgrades during the specified maintenance window. So, RDS instances can get the new features, bug fixes, and security patches for their database engines.",
@@ -622,7 +629,8 @@
],
"Attributes":[
{
"Section":"2.3. Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.3. Relational Database Service (RDS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure and verify that RDS database instances provisioned in your AWS account do restrict unauthorized access in order to minimize security risks. To restrict access to anypublicly accessible RDS database instance, you must disable the database PubliclyAccessible flag and update the VPC security group associated with the instance",
@@ -643,7 +651,8 @@
],
"Attributes":[
{
"Section":"2.4 Relational Database Service (RDS)",
"Section":"2. Storage",
"SubSection":"2.4 Elastic File System (EFS)",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"EFS data should be encrypted at rest using AWS KMS (Key Management Service).",
"Description":"Security defaults in Azure Active Directory (Azure AD) make it easier to be secure and help protect your organization. Security defaults contain preconfigured security settings for common attacks. Security defaults is available to everyone. The goal is to ensure that all organizations have a basic level of security",
@@ -34,7 +35,8 @@
],
"Attributes":[
{
"Section":"1.1 Security Defaults",
"Section":"1. Identity and Access Management",
"SubSection":"1.1 Security Defaults",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Enable multi-factor authentication for all roles, groups, and users that have write access or permissions to Azure resources. These include custom created objects or built-in roles such as; • Service Co-Administrators • Subscription Owners • Contributors",
@@ -56,7 +58,8 @@
],
"Attributes":[
{
"Section":"1.1 Security Defaults",
"Section":"1. Identity and Access Management",
"SubSection":"1.1 Security Defaults",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable multi-factor authentication for all non-privileged users.",
@@ -76,7 +79,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.1 Security Defaults",
"Section":"1. Identity and Access Management",
"SubSection":"1.1 Security Defaults",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Do not allow users to remember multi-factor authentication on devices.",
@@ -98,7 +102,8 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Azure Active Directory Conditional Access allows an organization to configure Named locations and configure whether those locations are trusted or untrusted. These settings provide organizations the means to specify Geographical locations for use in conditional access policies, or define actual IP addresses and IP ranges and whether or not those IP addresses and/or ranges are trusted by the organization.",
@@ -118,7 +123,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"CAUTION: If these policies are created without first auditing and testing the result, misconfiguration can potentially lock out administrators or create undesired access issues. Conditional Access Policies can be used to block access from geographic locations that are deemed out-of-scope for your organization or application. The scope and variables for this policy should be carefully examined and defined.",
@@ -138,7 +144,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on login.",
@@ -158,7 +165,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on logins.",
@@ -178,7 +186,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on login.",
@@ -198,7 +207,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on logins.",
@@ -220,7 +230,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Require administrators or appropriately delegated users to create new tenants.",
@@ -240,7 +250,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"This recommendation extends guest access review by utilizing the Azure AD Privileged Identity Management feature provided in Azure AD Premium P2. Azure AD is extended to include Azure AD B2B collaboration, allowing you to invite people from outside your organization to be guest users in your cloud account and sign in with their own work, school, or social identities. Guest users allow you to share your company's applications and services with users from any other organization, while maintaining control over your own corporate data. Work with external partners, large or small, even if they don't have Azure AD or an IT department. A simple invitation and redemption process lets partners use their own credentials to access your company's resources a a guest user.",
@@ -260,7 +270,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Azure AD is extended to include Azure AD B2B collaboration, allowing you to invite people from outside your organization to be guest users in your cloud account and sign in with their own work, school, or social identities. Guest users allow you to share your company's applications and services with users from any other organization, while maintaining control over your own corporate data. Work with external partners, large or small, even if they don't have Azure AD or an IT department. A simple invitation and redemption process lets partners use their own credentials to access your company's resources as a guest user. Guest users in every subscription should be review on a regular basis to ensure that inactive and unneeded accounts are removed.",
@@ -280,7 +290,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Ensures that two alternate forms of identification are provided before allowing a password reset.",
@@ -300,7 +310,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Microsoft Azure provides a Global Banned Password policy that applies to Azure administrative and normal user accounts. This is not applied to user accounts that are synced from an on-premise Active Directory unless Azure AD Connect is used and you enable EnforceCloudPasswordPolicyForPasswordSyncedUsers. Please see the list in default values on the specifics of this policy. To further password security, it is recommended to further define a custom banned password policy.",
@@ -320,7 +330,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Ensure that the number of days before users are asked to re-confirm their authentication information is not set to 0.",
@@ -340,7 +350,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Ensure that users are notified on their primary and secondary emails on password resets.",
@@ -360,7 +370,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Ensure that all Global Administrators are notified if any other administrator resets their password.",
@@ -382,7 +392,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Require administrators to provide consent for applications before use.",
@@ -404,7 +414,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Allow users to provide consent for selected permissions when a request is coming from a verified publisher.",
@@ -424,7 +434,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Require administrators to provide consent for the apps before use.",
@@ -446,7 +456,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Require administrators or appropriately delegated users to register third-party applications.",
@@ -468,7 +478,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Limit guest user permissions.",
@@ -490,7 +500,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Restrict invitations to users with specific administrative roles only.",
@@ -510,7 +520,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Restrict access to the Azure AD administration portal to administrators only. NOTE: This only affects access to the Azure AD administrator's web portal. This setting does not prohibit privileged users from using other methods such as Rest API or Powershell to obtain sensitive information from Azure AD.",
@@ -530,7 +540,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Restricts group creation to administrators with permissions only.",
@@ -552,7 +562,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Restrict security group creation to administrators only.",
@@ -572,7 +582,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Restrict security group management to administrators only.",
@@ -594,7 +604,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Restrict Microsoft 365 group creation to administrators only.",
@@ -614,7 +624,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Joining or registering devices to the active directory should require Multi-factor authentication.",
@@ -636,7 +646,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"The principle of least privilege should be followed and only necessary privileges should be assigned instead of allowing full administrative access.",
@@ -658,7 +668,7 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Resource locking is a powerful protection mechanism that can prevent inadvertent modification/deletion of resources within Azure subscriptions/Resource Groups and is a recommended NIST configuration.",
@@ -678,7 +688,7 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1. Identity and Access Management",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Users who are set as subscription owners are able to make administrative changes to the subscriptions and move them into and out of Azure Active Directories.",
@@ -700,7 +710,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Servers enables threat detection for Servers, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -722,7 +733,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for App Service enables threat detection for App Service, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -744,7 +756,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Databases enables threat detection for the instances running your database software. This provides threat intelligence, anomaly detection, and behavior analytics in the Azure Microsoft Defender for Cloud. Instead of being enabled on services like Platform as a Service (PaaS), this implementation will run within your instances as Infrastructure as a Service (IaaS) on the Operating Systems hosting your databases.",
@@ -766,7 +779,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Azure SQL Databases enables threat detection for Azure SQL database servers, providing threat intelligence, anomaly detection, andbehavior analytics in the Microsoft Defender for Cloud.",
@@ -788,7 +802,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for SQL servers on machines enables threat detection for SQL servers on machines, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -810,7 +825,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Open-source relational databases enables threat detection for Open-source relational databases, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -832,7 +848,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Storage enables threat detection for Storage, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -854,7 +871,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Containers enables threat detection for Container Registries including Kubernetes, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -876,7 +894,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Microsoft Defender for Azure Cosmos DB scans all incoming network requests for threats to your Azure Cosmos DB resources.",
@@ -898,7 +917,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Turning on Microsoft Defender for Key Vault enables threat detection for Key Vault, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -920,7 +940,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Microsoft Defender for DNS scans all network traffic exiting from within a subscription.",
@@ -942,7 +963,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Microsoft Defender for Resource Manager scans incoming administrative requests to change your infrastructure from both CLI and the Azure portal.",
@@ -964,7 +986,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Ensure that the latest OS patches for all virtual machines are applied.",
@@ -986,7 +1009,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"None of the settings offered by ASC Default policy should be set to effect Disabled.",
@@ -1008,7 +1032,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Enable automatic provisioning of the monitoring agent to collect security data.",
@@ -1030,7 +1055,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable automatic provisioning of vulnerability assessment for machines on both Azure and hybrid (Arc enabled) machines.",
@@ -1050,7 +1076,8 @@
"Checks":[],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable automatic provisioning of the Microsoft Defender for Containers components.",
@@ -1072,7 +1099,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Enable security alert emails to subscription owners.",
@@ -1094,7 +1122,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Microsoft Defender for Cloud emails the subscription owners whenever a high-severity alert is triggered for their subscription. You should provide a security contact email address as an additional email address.",
@@ -1116,7 +1145,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enables emailing security alerts to the subscription owner or other designated security contact.",
@@ -1138,7 +1168,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"This integration setting enables Microsoft Defender for Cloud Apps (formerly 'Microsoft Cloud App Security' or 'MCAS' - see additional info) to communicate with Microsoft Defender for Cloud.",
@@ -1160,7 +1191,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"This integration setting enables Microsoft Defender for Endpoint (formerly 'Advanced Threat Protection' or 'ATP' or 'WDATP' - see additional info) to communicate with Microsoft Defender for Cloud. IMPORTANT: When enabling integration between DfE & DfC it needs to be taken into account that this will have some side effects that may be undesirable. 1. For server 2019 & above if defender is installed (default for these server SKU's) this will trigger a deployment of the new unified agent and link to any of the extended configuration in the Defender portal. 2. If the new unified agent is required for server SKU's of Win 2016 or Linux and lower there is additional integration that needs to be switched on and agents need to be aligned.",
@@ -1182,7 +1214,8 @@
],
"Attributes":[
{
"Section":"2.2 Microsoft Defender for IoT",
"Section":"2. Microsoft Defender",
"SubSection":"2.2 Microsoft Defender for IoT",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Microsoft Defender for IoT acts as a central security hub for IoT devices within your organization.",
@@ -1524,7 +1557,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable auditing on SQL Servers.",
@@ -1546,7 +1580,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that no SQL Databases allow ingress from 0.0.0.0/0 (ANY IP).",
@@ -1568,7 +1603,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Transparent Data Encryption (TDE) with Customer-managed key support provides increased transparency and control over the TDE Protector, increased security with an HSM-backed external service, and promotion of separation of duties. With TDE, data is encrypted at rest with a symmetric key (called the database encryption key) stored in the database or data warehouse distribution. To protect this data encryption key (DEK) in the past, only a certificate that the Azure SQL Service managed could be used. Now, with Customer-managed key support for TDE, the DEK can be protected with an asymmetric key that is stored in the Azure Key Vault. The Azure Key Vault is a highly available and scalable cloud-based key store which offers central key management, leverages FIPS 140-2 Level 2 validated hardware security modules (HSMs), and allows separation of management of keys and data for additional security. Based on business needs or criticality of data/databases hosted on a SQL server, it is recommended that the TDE protector is encrypted by a key that is managed by the data owner (Customer-managed key).",
@@ -1590,7 +1626,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Use Azure Active Directory Authentication for authentication with SQL Database to manage credentials in a single place.",
@@ -1612,7 +1649,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable Transparent Data Encryption on every SQL server.",
@@ -1634,7 +1672,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"SQL Server Audit Retention should be configured to be greater than 90 days.",
@@ -1656,7 +1695,8 @@
],
"Attributes":[
{
"Section":"4.2 SQL Server - Microsoft Defender for SQL",
"Section":"4. Database Services",
"SubSection":"4.2 SQL Server - Microsoft Defender for SQL",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Enable 'Microsoft Defender for SQL' on critical SQL Servers.",
@@ -1678,7 +1718,8 @@
],
"Attributes":[
{
"Section":"4.2 SQL Server - Microsoft Defender for SQL",
"Section":"4. Database Services",
"SubSection":"4.2 SQL Server - Microsoft Defender for SQL",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Enable Vulnerability Assessment (VA) service scans for critical SQL servers and corresponding SQL databases.",
@@ -1700,7 +1741,8 @@
],
"Attributes":[
{
"Section":"4.2 SQL Server - Microsoft Defender for SQL",
"Section":"4. Database Services",
"SubSection":"4.2 SQL Server - Microsoft Defender for SQL",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Enable Vulnerability Assessment (VA) service scans for critical SQL servers and corresponding SQL databases.",
@@ -1722,7 +1764,8 @@
],
"Attributes":[
{
"Section":"4.2 SQL Server - Microsoft Defender for SQL",
"Section":"4. Database Services",
"SubSection":"4.2 SQL Server - Microsoft Defender for SQL",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Configure 'Send scan reports to' with email addresses of concerned data owners/stakeholders for a critical SQL servers",
@@ -1744,7 +1787,8 @@
],
"Attributes":[
{
"Section":"4.2 SQL Server - Microsoft Defender for SQL",
"Section":"4. Database Services",
"SubSection":"4.2 SQL Server - Microsoft Defender for SQL",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable Vulnerability Assessment (VA) setting 'Also send email notifications to admins and subscription owners'.",
@@ -1766,7 +1810,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable SSL connection on PostgreSQL Servers.",
@@ -1788,7 +1833,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable log_checkpoints on PostgreSQL Servers.",
@@ -1810,7 +1856,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable log_connections on PostgreSQL Servers.",
@@ -1832,7 +1879,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable log_disconnections on PostgreSQL Servers.",
@@ -1854,7 +1902,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable connection_throttling on PostgreSQL Servers.",
@@ -1876,7 +1925,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure log_retention_days on PostgreSQL Servers is set to an appropriate value.",
@@ -1898,7 +1948,8 @@
],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Disable access from Azure services to PostgreSQL Database Server.",
@@ -1918,7 +1969,8 @@
"Checks":[],
"Attributes":[
{
"Section":"4.3 PostgreSQL Database Server",
"Section":"4. Database Services",
"SubSection":"4.3 PostgreSQL Database Server",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Azure Database for PostgreSQL servers should be created with 'infrastructure double encryption' enabled.",
@@ -1940,7 +1992,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable SSL connection on MYSQL Servers.",
@@ -1962,7 +2015,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure TLS version on MySQL flexible servers is set to the default value.",
@@ -1984,7 +2038,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable audit_log_enabled on MySQL Servers.",
@@ -2006,7 +2061,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Set audit_log_enabled to include CONNECTION on MySQL Servers.",
@@ -2028,7 +2084,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Limiting your Cosmos DB to only communicate on whitelisted networks lowers its attack footprint.",
@@ -2050,7 +2107,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Private endpoints limit network traffic to approved sources.",
@@ -2072,7 +2130,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Cosmos DB can use tokens or AAD for client authentication which in turn will use Azure RBAC for authorization. Using AAD is significantly more secure because AAD handles the credentials and allows for MFA and centralized management, and the Azure RBAC better integrated with the rest of Azure.",
"Description":"Enable Diagnostic settings for exporting activity logs. Diagnos tic settings are available for each individual resource within a subscription. Settings should be configured for allappropriate resources for your environment.",
"Description":"Prerequisite: A Diagnostic Setting must exist. If a Diagnostic Setting does not exist, the navigation and options within this recommendation will not be available. Please review the recommendation at the beginning of this subsection titled: 'Ensure that a 'Diagnostic Setting' exists.' The diagnostic setting should be configured to log the appropriate activities from the control/management plane.",
"Description":"Enable AppServiceHTTPLogs diagnostic log category for Azure App Service instances to ensure all http requests are captured and centrally logged.",
@@ -2248,7 +2314,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create Policy Assignment event.",
@@ -2270,7 +2337,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Policy Assignment event.",
@@ -2292,7 +2360,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an Activity Log Alert for the Create or Update Network Security Group event.",
@@ -2314,7 +2383,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Network Security Group event.",
@@ -2336,7 +2406,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update Security Solution event.",
@@ -2358,7 +2429,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Security Solution event.",
@@ -2380,7 +2452,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update SQL Server Firewall Rule event.",
@@ -2402,7 +2475,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the 'Delete SQL Server Firewall Rule.'",
@@ -2424,7 +2498,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update Public IP Addresses rule.",
@@ -2446,7 +2521,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Public IP Address rule.",
@@ -2466,7 +2542,7 @@
"Checks":[],
"Attributes":[
{
"Section":"5.3 Configuring Application Insights",
"Section":"5. Logging and Monitoring",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Resource Logs capture activity to the data access plane while the Activity log is a subscription-level log for the control plane. Resource-level diagnostic logs provide insight into operations that were performed within that resource itself; for example, reading or updating a secret from a Key Vault. Currently, 95 Azure resources support Azure Monitoring (See the more information section for a complete list), including Network Security Groups, Load Balancers, Key Vault, AD, Logic Apps, and CosmosDB. The content of these logs varies by resource type. A number of back-end services were not configured to log and store Resource Logs for certain activities or for a sufficient length. It is crucial that monitoring is correctly configured to log all relevant activities and retain those logs for a sufficient length of time. Given that the mean time to detection in an enterprise is 240 days, a minimum retention period of two years is recommended.",
@@ -2486,7 +2562,7 @@
"Checks":[],
"Attributes":[
{
"Section":"5.3 Configuring Application Insights",
"Section":"5. Logging and Monitoring",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"The use of Basic or Free SKUs in Azure whilst cost effective have significant limitations in terms of what can be monitored and what support can be realized from Microsoft. Typically, these SKU’s do not have a service SLA and Microsoft will usually refuse to provide support for them. Consequently Basic/Free SKUs should never be used for production workloads.",
"Description":"Application Insights within Azure act as an Application Performance Monitoring solution providing valuable data into how well an application performs and additional information when performing incident response. The types of log data collected include application metrics, telemetry data, and application trace logging data providing organizations with detailed information about application activity and application transactions. Both data sets help organizations adopt a proactive and retroactive means to handle security and performance related metrics within their modern applications.",
"Description":"Security defaults in Microsoft Entra ID make it easier to be secure and help protect your organization. Security defaults contain preconfigured security settings for common attacks. Security defaults is available to everyone. The goal is to ensure that all organizations have a basic level of security enabled at no extra cost. You may turn on security defaults in the Azure portal.",
"Description":"Enable multi-factor authentication for all roles, groups, and users that have write access or permissions to Azure resources. These include custom created objects or built-in roles such as; - Service Co-Administrators - Subscription Owners - Contributors",
"Description":"Do not allow users to remember multi-factor authentication on devices.",
@@ -580,7 +584,8 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Microsoft Entra ID Conditional Access allows an organization to configure `Named locations` and configure whether those locations are trusted or untrusted. These settings provide organizations the means to specify Geographical locations for use in conditional access policies, or define actual IP addresses and IP ranges and whether or not those IP addresses and/or ranges are trusted by the organization.",
@@ -600,7 +605,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"**CAUTION**: If these policies are created without first auditing and testing the result, misconfiguration can potentially lock out administrators or create undesired access issues. Conditional Access Policies can be used to block access from geographic locations that are deemed out-of-scope for your organization or application. The scope and variables for this policy should be carefully examined and defined.",
@@ -620,7 +626,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on login.",
@@ -640,7 +647,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on logins.",
@@ -660,7 +668,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"For designated users, they will be prompted to use their multi-factor authentication (MFA) process on login.",
@@ -682,7 +691,8 @@
],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"This recommendation ensures that users accessing the Windows Azure Service Management API (i.e. Azure Powershell, Azure CLI, Azure Resource Manager API, etc.) are required to use multifactor authentication (MFA) credentials when accessing resources through the Windows Azure Service Management API.",
@@ -702,7 +712,8 @@
"Checks":[],
"Attributes":[
{
"Section":"1.2 Conditional Access",
"Section":"1.Identity and Access Management",
"SubSection":"1.2 Conditional Access",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"This recommendation ensures that users accessing Microsoft Admin Portals (i.e. Microsoft 365 Admin, Microsoft 365 Defender, Exchange Admin Center, Azure Portal, etc.) are required to use multifactor authentication (MFA) credentials when logging into an Admin Portal.",
@@ -724,7 +735,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Servers enables threat detection for Servers, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -746,7 +758,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for App Service enables threat detection for App Service, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -768,7 +781,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Azure SQL Databases enables threat detection for Managed Instance Azure SQL databases, providing threat intelligence, anomaly detection, and behavior analytics in Microsoft Defender for Cloud.",
@@ -790,7 +804,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for SQL servers on machines enables threat detection for SQL servers on machines, providing threat intelligence, anomaly detection, and behavior analytics in Microsoft Defender for Cloud.",
@@ -812,7 +827,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Open-source relational databases enables threat detection for Open-source relational databases, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -834,7 +850,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Microsoft Defender for Azure Cosmos DB scans all incoming network requests for threats to your Azure Cosmos DB resources.",
@@ -856,7 +873,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Storage enables threat detection for Storage, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -878,7 +896,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Containers enables threat detection for Container Registries including Kubernetes, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud. The following services will be enabled for container instances: - Defender agent in Azure - Azure Policy for Kubernetes - Agentless discovery for Kubernetes - Agentless container vulnerability assessment",
@@ -900,7 +919,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Turning on Microsoft Defender for Key Vault enables threat detection for Key Vault, providing threat intelligence, anomaly detection, and behavior analytics in the Microsoft Defender for Cloud.",
@@ -922,7 +942,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"[**NOTE:** As of August 1, customers with an existing subscription to Defender for DNS can continue to use the service, but new subscribers will receive alerts about suspicious DNS activity as part of Defender for Servers P2.] Microsoft Defender for DNS scans all network traffic exiting from within a subscription.",
@@ -944,7 +965,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Microsoft Defender for Resource Manager scans incoming administrative requests to change your infrastructure from both CLI and the Azure portal.",
@@ -966,7 +988,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that the latest OS patches for all virtual machines are applied.",
@@ -988,7 +1011,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"The Microsoft Cloud Security Benchmark (or MCSB) is an Azure Policy Initiative containing many security policies to evaluate resource configuration against best practice recommendations. If a policy in the MCSB is set with effect type `Disabled`, it is not evaluated and may prevent administrators from being informed of valuable security recommendations.",
@@ -1010,7 +1034,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable automatic provisioning of the monitoring agent to collect security data.",
@@ -1032,7 +1057,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable automatic provisioning of vulnerability assessment for machines on both Azure and hybrid (Arc enabled) machines.",
@@ -1052,7 +1078,8 @@
"Checks":[],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Enable automatic provisioning of the Microsoft Defender for Containers components.",
@@ -1074,7 +1101,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable security alert emails to subscription owners.",
@@ -1096,7 +1124,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Microsoft Defender for Cloud emails the subscription owners whenever a high-severity alert is triggered for their subscription. You should provide a security contact email address as an additional email address.",
@@ -1118,7 +1147,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enables emailing security alerts to the subscription owner or other designated security contact.",
@@ -1140,7 +1170,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"This integration setting enables Microsoft Defender for Cloud Apps (formerly 'Microsoft Cloud App Security' or 'MCAS' - see additional info) to communicate with Microsoft Defender for Cloud.",
@@ -1162,7 +1193,8 @@
],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"This integration setting enables Microsoft Defender for Endpoint (formerly 'Advanced Threat Protection' or 'ATP' or 'WDATP' - see additional info) to communicate with Microsoft Defender for Cloud. **IMPORTANT:** When enabling integration between DfE & DfC it needs to be taken into account that this will have some side effects that may be undesirable. 1. For server 2019 & above if defender is installed (default for these server SKU's) this will trigger a deployment of the new unified agent and link to any of the extended configuration in the Defender portal. 1. If the new unified agent is required for server SKU's of Win 2016 or Linux and lower there is additional integration that needs to be switched on and agents need to be aligned.",
@@ -1182,7 +1214,8 @@
"Checks":[],
"Attributes":[
{
"Section":"2.1 Microsoft Defender for Cloud",
"Section":"2. Microsoft Defender",
"SubSection":"2.1 Microsoft Defender for Cloud",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"An organization's attack surface is the collection of assets with a public network identifier or URI that an external threat actor can see or access from outside your cloud. It is the set of points on the boundary of a system, a system element, system component, or an environment where an attacker can try to enter, cause an effect on, or extract data from, that system, system element, system component, or environment. The larger the attack surface, the harder it is to protect. This tool can be configured to scan your organization's online infrastructure such as specified domains, hosts, CIDR blocks, and SSL certificates, and store them in an Inventory. Inventory items can be added, reviewed, approved, and removed, and may contain enrichments (insights) and additional information collected from the tool's different scan engines and open-source intelligence sources. A Defender EASM workspace will generate an Inventory of publicly exposed assets by crawling and scanning the internet using _Seeds_ you provide when setting up the tool. Seeds can be FQDNs, IP CIDR blocks, and WHOIS records. Defender EASM will generate Insights within 24-48 hours after Seeds are provided, and these insights include vulnerability data (CVEs), ports and protocols, and weak or expired SSL certificates that could be used by an attacker for reconnaisance or exploitation. Results are classified High/Medium/Low and some of them include proposed mitigations.",
@@ -1204,7 +1237,8 @@
],
"Attributes":[
{
"Section":"2.2 Microsoft Defender for IoT",
"Section":"2. Microsoft Defender",
"SubSection":"2.2 Microsoft Defender for IoT",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Microsoft Defender for IoT acts as a central security hub for IoT devices within your organization.",
@@ -1586,7 +1620,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable auditing on SQL Servers.",
@@ -1608,7 +1643,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure that no SQL Databases allow ingress from 0.0.0.0/0 (ANY IP).",
@@ -1630,7 +1666,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Transparent Data Encryption (TDE) with Customer-managed key support provides increased transparency and control over the TDE Protector, increased security with an HSM-backed external service, and promotion of separation of duties. With TDE, data is encrypted at rest with a symmetric key (called the database encryption key) stored in the database or data warehouse distribution. To protect this data encryption key (DEK) in the past, only a certificate that the Azure SQL Service managed could be used. Now, with Customer-managed key support for TDE, the DEK can be protected with an asymmetric key that is stored in the Azure Key Vault. The Azure Key Vault is a highly available and scalable cloud-based key store which offers central key management, leverages FIPS 140-2 Level 2 validated hardware security modules (HSMs), and allows separation of management of keys and data for additional security. Based on business needs or criticality of data/databases hosted on a SQL server, it is recommended that the TDE protector is encrypted by a key that is managed by the data owner (Customer-managed key).",
@@ -1652,7 +1689,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Use Microsoft Entra authentication for authentication with SQL Database to manage credentials in a single place.",
@@ -1674,7 +1712,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable Transparent Data Encryption on every SQL server.",
@@ -1696,7 +1735,8 @@
],
"Attributes":[
{
"Section":"4.1 SQL Server - Auditing",
"Section":"4. Database Services",
"SubSection":"4.1 SQL Server - Auditing",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"SQL Server Audit Retention should be configured to be greater than 90 days.",
"Description":"Azure Database for PostgreSQL servers should be created with 'infrastructure double encryption' enabled.",
@@ -1892,7 +1940,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Enable `SSL connection` on `MYSQL` Servers.",
@@ -1914,7 +1963,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Ensure `TLS version` on `MySQL flexible` servers is set to use TLS version 1.2 or higher.",
@@ -1936,7 +1986,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Enable audit_log_enabled on MySQL Servers.",
@@ -1958,7 +2009,8 @@
],
"Attributes":[
{
"Section":"4.4 MySQL Database",
"Section":"4. Database Services",
"SubSection":"4.4 MySQL Database",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Set `audit_log_enabled` to include CONNECTION on MySQL Servers.",
@@ -1980,7 +2032,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Limiting your Cosmos DB to only communicate on whitelisted networks lowers its attack footprint.",
@@ -2002,7 +2055,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 2",
"AssessmentStatus":"Automated",
"Description":"Private endpoints limit network traffic to approved sources.",
@@ -2024,7 +2078,8 @@
],
"Attributes":[
{
"Section":"4.5 Cosmos DB",
"Section":"4. Database Services",
"SubSection":"4.5 Cosmos DB",
"Profile":"Level 1",
"AssessmentStatus":"Manual",
"Description":"Cosmos DB can use tokens or Entra ID for client authentication which in turn will use Azure RBAC for authorization. Using Entra ID is significantly more secure because Entra ID handles the credentials and allows for MFA and centralized management, and the Azure RBAC better integrated with the rest of Azure.",
"Description":"Enable Diagnostic settings for exporting activity logs. Diagnostic settings are available for each individual resource within a subscription. Settings should be configured for all appropriate resources for your environment.",
"Description":"**Prerequisite**: A Diagnostic Setting must exist. If a Diagnostic Setting does not exist, the navigation and options within this recommendation will not be available. Please review the recommendation at the beginning of this subsection titled: Ensure that a 'Diagnostic Setting' exists. The diagnostic setting should be configured to log the appropriate activities from the control/management plane.",
"Description":"Enable AppServiceHTTPLogs diagnostic log category for Azure App Service instances to ensure all http requests are captured and centrally logged.",
@@ -2218,7 +2279,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create Policy Assignment event.",
@@ -2240,7 +2302,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Policy Assignment event.",
@@ -2262,7 +2325,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an Activity Log Alert for the Create or Update Network Security Group event.",
@@ -2284,7 +2348,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Network Security Group event.",
@@ -2306,7 +2371,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update Security Solution event.",
@@ -2328,7 +2394,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Security Solution event.",
@@ -2350,7 +2417,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update SQL Server Firewall Rule event.",
@@ -2372,7 +2440,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete SQL Server Firewall Rule.",
@@ -2394,7 +2463,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Create or Update Public IP Addresses rule.",
@@ -2416,7 +2486,8 @@
],
"Attributes":[
{
"Section":"5.2 Monitoring using Activity Log Alerts",
"Section":"5. Logging and Monitoring",
"SubSection":"5.2 Monitoring using Activity Log Alerts",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"Create an activity log alert for the Delete Public IP Address rule.",
"Description":"Application Insights within Azure act as an Application Performance Monitoring solution providing valuable data into how well an application performs and additional information when performing incident response. The types of log data collected include application metrics, telemetry data, and application trace logging data providing organizations with detailed information about application activity and application transactions. Both data sets help organizations adopt a proactive and retroactive means to handle security and performance related metrics within their modern applications.",
@@ -3044,7 +3116,7 @@
"Id":"9.4",
"Description":"Ensure that Register with Entra ID is enabled on App Service",
"Checks":[
"app_client_certificates_on"
"app_register_with_identity"
],
"Attributes":[
{
@@ -3066,7 +3138,7 @@
"Id":"9.5",
"Description":"Ensure That 'PHP version' is the Latest, If Used to Run the Web App",
"Checks":[
"app_register_with_identity"
"app_ensure_php_version_is_latest"
],
"Attributes":[
{
@@ -3088,7 +3160,7 @@
"Id":"9.6",
"Description":"Ensure that 'Python version' is the Latest Stable Version, if Used to Run the Web App",
"Checks":[
"app_ensure_php_version_is_latest"
"app_ensure_python_version_is_latest"
],
"Attributes":[
{
@@ -3110,7 +3182,7 @@
"Id":"9.7",
"Description":"Ensure that 'Java version' is the latest, if used to run the Web App",
"Checks":[
"app_ensure_python_version_is_latest"
"app_ensure_java_version_is_latest"
],
"Attributes":[
{
@@ -3132,7 +3204,7 @@
"Id":"9.8",
"Description":"Ensure that 'HTTP Version' is the Latest, if Used to Run the Web App",
"Checks":[
"app_ensure_java_version_is_latest"
"app_ensure_using_http20"
],
"Attributes":[
{
@@ -3154,7 +3226,7 @@
"Id":"9.9",
"Description":"Ensure FTP deployments are Disabled",
"Checks":[
"app_ensure_using_http20"
"app_ftp_deployment_disabled"
],
"Attributes":[
{
@@ -3175,9 +3247,7 @@
{
"Id":"9.10",
"Description":"Ensure Azure Key Vaults are Used to Store Secrets",
"Description":"Ensure FTP deployments are Disabled",
"Checks":[],
"Attributes":[
{
"Section":"9. AppService",
"Profile":"Level 1",
"AssessmentStatus":"Automated",
"Description":"By default, Azure Functions, Web, and API Services can be deployed over FTP. If FTP is required for an essential deployment workflow, FTPS should be required for FTP login for all App Service Apps and Functions.",
"RationaleStatement":"Azure FTP deployment endpoints are public. An attacker listening to traffic on a wifi network used by a remote employee or a corporate network could see login traffic in clear-text which would then grant them full control of the code base of the app or service. This finding is more severe if User Credentials for deployment are set at the subscription level rather than using the default Application Credentials which are unique per App.",
"ImpactStatement":"Any deployment workflows that rely on FTP or FTPs rather than the WebDeploy or HTTPs endpoints may be affected.",
"RemediationProcedure":"**From Azure Portal** 1. Go to the Azure Portal 2. Select `App Services` 3. Click on an app 4. Select `Settings` and then `Configuration` 5. Under `General Settings`, for the `Platform Settings`, the `FTP state` should be set to `Disabled` or `FTPS Only` **From Azure CLI** For each out of compliance application, run the following choosing either 'disabled' or 'FtpsOnly' as appropriate: ``` az webapp config set --resource-group <resource group name> --name <app name> --ftps-state [disabled|FtpsOnly] ``` **From PowerShell** For each out of compliance application, run the following: ``` Set-AzWebApp -ResourceGroupName <resource group name> -Name <app name> -FtpsState <Disabled or FtpsOnly> ```",
"AuditProcedure":"**From Azure Portal** 1. Go to the Azure Portal 2. Select `App Services` 3. Click on an app 4. Select `Settings` and then `Configuration` 5. Under `General Settings`, for the `Platform Settings`, the `FTP state` should not be set to `All allowed` **From Azure CLI** List webapps to obtain the ids. ``` az webapp list ``` List the publish profiles to obtain the username, password and ftp server url. ``` az webapp deployment list-publishing-profiles --ids <ids> { publishUrl: <URL_FOR_WEB_APP>, userName: <USER_NAME>, userPWD: <USER_PASSWORD>, } ``` **From PowerShell** List all Web Apps: ``` Get-AzWebApp ``` For each app: ``` Get-AzWebApp -ResourceGroupName <resource group name> -Name <app name> | Select-Object -ExpandProperty SiteConfig ``` In the output, look for the value of **FtpsState**. If its value is **AllAllowed** the setting is out of compliance. Any other value is considered in compliance with this check.",
"AdditionalInformation":"",
"DefaultValue":"[Azure Web Service Deploy via FTP](https://docs.microsoft.com/en-us/azure/app-service/deploy-ftp):[Azure Web Service Deployment](https://docs.microsoft.com/en-us/azure/app-service/overview-security):https://docs.microsoft.com/en-us/security/benchmark/azure/security-controls-v3-data-protection#dp-4-encrypt-sensitive-information-in-transit:https://docs.microsoft.com/en-us/security/benchmark/azure/security-controls-v3-posture-vulnerability-management#pv-7-rapidly-and-automatically-remediate-software-vulnerabilities",
"References":"TA0008, T1570, M1031"
}
]
},
{
"Id":"9.11",
"Description":"Ensure Azure Key Vaults are Used to Store Secrets",
"Checks":[],
"Attributes":[
{
"Section":"9. AppService",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Azure Key Vault will store multiple types of sensitive information such as encryption keys, certificate thumbprints, and Managed Identity Credentials. Access to these 'Secrets' can be controlled through granular permissions.",
"RationaleStatement":"The credentials given to an application have permissions to create, delete, or modify data stored within the systems they access. If these credentials are stored within the application itself, anyone with access to the application or a copy of the code has access to them. Storing within Azure Key Vault as secrets increases security by controlling access. This also allows for updates of the credentials without redeploying the entire application.",
"ImpactStatement":"Integrating references to secrets within the key vault are required to be specifically integrated within the application code. This will require additional configuration to be made during the writing of an application, or refactoring of an already written one. There are also additional costs that are charged per 10000 requests to the Key Vault.",
"AuditProcedure":"**From Azure Portal** 1. Login to Azure Portal 2. In the expandable menu on the left go to `Key Vaults` 3. View the Key Vaults listed. **From Azure CLI** To list key vaults within a subscription run the following command: ``` Get-AzKeyVault ``` To list the secrets within these key vaults run the following command: ``` Get-AzKeyVaultSecret [-VaultName] <vault name> ``` **From Powershell** To list key vaults within a subscription run the following command: ``` Get-AzKeyVault ``` To list all secrets in a key vault run the following command: ``` Get-AzKeyVaultSecret -VaultName '<vaultName' ```",
"Description":"Ensure that Resource Locks are set for Mission-Critical Azure Resources",
"Checks":[],
"Attributes":[
{
"Section":"10. Miscellaneous",
"Profile":"Level 2",
"AssessmentStatus":"Manual",
"Description":"Resource Manager Locks provide a way for administrators to lock down Azure resources to prevent deletion of, or modifications to, a resource. These locks sit outside of the Role Based Access Controls (RBAC) hierarchy and, when applied, will place restrictions on the resource for all users. These locks are very useful when there is an important resource in a subscription that users should not be able to delete or change. Locks can help prevent accidental and malicious changes or deletion.",
"RationaleStatement":"As an administrator, it may be necessary to lock a subscription, resource group, or resource to prevent other users in the organization from accidentally deleting or modifying critical resources. The lock level can be set to to `CanNotDelete` or `ReadOnly` to achieve this purpose. - `CanNotDelete` means authorized users can still read and modify a resource, but they cannot delete the resource. - `ReadOnly` means authorized users can read a resource, but they cannot delete or update the resource. Applying this lock is similar to restricting all authorized users to the permissions granted by the Reader role.",
"ImpactStatement":"There can be unintended outcomes of locking a resource. Applying a lock to a parent service will cause it to be inherited by all resources within. Conversely, applying a lock to a resource may not apply to connected storage, leaving it unlocked. Please see the documentation for further information.",
"RemediationProcedure":"**From Azure Portal** 1. Navigate to the specific Azure Resource or Resource Group 2. For each mission critical resource, click on `Locks` 3. Click `Add` 4. Give the lock a name and a description, then select the type, `Read-only` or `Delete` as appropriate 5. Click OK **From Azure CLI** To lock a resource, provide the name of the resource, its resource type, and its resource group name. ``` az lock create --name <LockName> --lock-type <CanNotDelete/Read-only> --resource-group <resourceGroupName> --resource-name <resourceName> --resource-type <resourceType> ``` **From Powershell** ``` Get-AzResourceLock -ResourceName <Resource Name> -ResourceType <Resource Type> -ResourceGroupName <Resource Group Name> -Locktype <CanNotDelete/Read-only> ```",
"AuditProcedure":"**From Azure Portal** 1. Navigate to the specific Azure Resource or Resource Group 2. Click on `Locks` 3. Ensure the lock is defined with name and description, with type `Read-only` or `Delete` as appropriate. **From Azure CLI** Review the list of all locks set currently: ``` az lock list --resource-group <resourcegroupname> --resource-name <resourcename> --namespace <Namespace> --resource-type <type> --parent ``` **From Powershell** Run the following command to list all resources. ``` Get-AzResource ``` For each resource, run the following command to check for Resource Locks. ``` Get-AzResourceLock -ResourceName <Resource Name> -ResourceType <Resource Type> -ResourceGroupName <Resource Group Name> ``` Review the output of the `Properties` setting. Compliant settings will have the `CanNotDelete` or `ReadOnly` value.",
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.