Repository: prowler-cloud/prowler
Pull request: feat(custom-checks-metadata): add new fields
### Context
Fixes #3923 
Custom checks metadata are useful to assing the needed values for metadata.

### Description

In this pr new fields are added for custom checks metadata:
* CheckTitle
* Description
* Risk
* RelatedUrl
* Remediation
   * Code
     * CLI
     * NativeIaC
     * Other
     * Terraform
   * Recommendation
     * Text
     * Url

Thanks @jchrisfarris for the recommendation


### License

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.


Problem statement:
Support for custom metadata fields
### New feature motivation

I'd love to be able to override the various elements of a check's metadata. Right now we can override Severity, but I'd also like to override:
1. CheckTitle so I can align specific CheckIDs to my policy statements
2. Description & Risk so I can also reference internal documentation
3. RelatedUrl so I can point to internal wikis and KBs
4. Remedation.Code.Terraform / NativeIAC to point to my internal golden modules
5. Same for Recommendation

I'm not sure what the "Notes" element is for, so perhaps that can be left off the list

### Solution Proposed

Extend support in the metadata.yaml file for the above elements

### Describe alternatives you've considered

I could create my own lookup table and decorate/replace going into reports, but that wouldn't allow me to adjust what is sent to SecurityHub. 

### Additional context

IIRC we discussed this awhile back when the custom severities were implemented. Not sure if the Issue made it over into the v4 list of issues.

Hints from issue discussion:
Hi! @jchrisfarris this task is really interesing, we are working on it. I'll reach you when it's done. Thanks for using Prowler! 🚀

Commit message: feat(custom-checks-metadata): add new fields

Patch to review:
diff --git a/prowler/config/custom_checks_metadata_example.yaml b/prowler/config/custom_checks_metadata_example.yaml
index 20228af8ce..f5935e8d7b 100644
--- a/prowler/config/custom_checks_metadata_example.yaml
+++ b/prowler/config/custom_checks_metadata_example.yaml
@@ -3,17 +3,82 @@ CustomChecksMetadata:
     Checks:
       s3_bucket_level_public_access_block:
         Severity: high
+        CheckTitle: S3 Bucket Level Public Access Block
+        Description: This check ensures that the S3 bucket level public access block is enabled.
+        Risk: This check is important because it ensures that the S3 bucket level public access block is enabled.
+        RelatedUrl: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html
+        Remediation:
+          Code:
+            CLI: aws s3api put-public-access-block --bucket <bucket-name> --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
+            NativeIaC: https://aws.amazon.com/es/s3/features/block-public-access/
+            Other: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html
+            Terraform: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block
+          Recommendation:
+            Text: Enable the S3 bucket level public access block.
+            Url: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html
       s3_bucket_no_mfa_delete:
         Severity: high
+        CheckTitle: S3 Bucket No MFA Delete
+        Description: This check ensures that the S3 bucket does not allow delete operations without MFA.
+        Risk: This check is important because it ensures that the S3 bucket does not allow delete operations without MFA.
+        RelatedUrl: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
+        Remediation:
+          Code:
+            CLI: aws s3api put-bucket-versioning --bucket <bucket-name> --versioning-configuration Status=Enabled
+            NativeIaC: https://aws.amazon.com/es/s3/features/versioning/
+            Other: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
+            Terraform: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning
+          Recommendation:
+            Text: Enable versioning on the S3 bucket.
+            Url: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
   azure:
     Checks:
       storage_infrastructure_encryption_is_enabled:
         Severity: medium
+        CheckTitle: Storage Infrastructure Encryption Is Enabled
+        Description: This check ensures that storage infrastructure encryption is enabled.
+        Risk: This check is important because it ensures that storage infrastructure encryption is enabled.
+        RelatedUrl: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
+        Remediation:
+          Code:
+            CLI: az storage account update --name <storage-account-name> --resource-group <resource-group-name> --set properties.encryption.services.blob.enabled=true properties.encryption.services.file.enabled=true properties.encryption.services.queue.enabled=true properties.encryption.services.table.enabled=true
+            NativeIaC: https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts
+            Other: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
+            Terraform: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account
+          Recommendation:
+            Text: Enable storage infrastructure encryption.
+            Url: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
   gcp:
     Checks:
       compute_instance_public_ip:
         Severity: critical
+        CheckTitle: Compute Instance Public IP
+        Description: This check ensures that the compute instance does not have a public IP.
+        Risk: This check is important because it ensures that the compute instance does not have a public IP.
+        RelatedUrl: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
+        Remediation:
+          Code:
+            CLI: https://docs.prowler.com/checks/gcp/google-cloud-public-policies/bc_gcp_public_2#cli-command
+            NativeIaC: https://cloud.google.com/compute/docs/reference/rest/v1/instances
+            Other: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
+            Terraform: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance
+          Recommendation:
+            Text: Remove the public IP from the compute instance.
+            Url: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
   kubernetes:
     Checks:
       apiserver_anonymous_requests:
         Severity: low
+        CheckTitle: APIServer Anonymous Requests
+        Description: This check ensures that anonymous requests to the APIServer are disabled.
+        Risk: This check is important because it ensures that anonymous requests to the APIServer are disabled.
+        RelatedUrl: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
+        Remediation:
+          Code:
+            CLI: --anonymous-auth=false
+            NativeIaC: https://docs.prowler.com/checks/kubernetes/kubernetes-policy-index/ensure-that-the-anonymous-auth-argument-is-set-to-false-1#kubernetes
+            Other: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
+            Terraform: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/cluster_role_binding
+          Recommendation:
+            Text: Disable anonymous requests to the APIServer.
+            Url: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
diff --git a/prowler/lib/check/custom_checks_metadata.py b/prowler/lib/check/custom_checks_metadata.py
index f12ce0c26f..e2ad423b20 100644
--- a/prowler/lib/check/custom_checks_metadata.py
+++ b/prowler/lib/check/custom_checks_metadata.py
@@ -18,9 +18,71 @@
                         "Severity": {
                             "type": "string",
                             "enum": valid_severities,
-                        }
+                        },
+                        "CheckTitle": {
+                            "type": "string",
+                        },
+                        "Description": {
+                            "type": "string",
+                        },
+                        "Risk": {
+                            "type": "string",
+                        },
+                        "RelatedUrl": {
+                            "type": "string",
+                        },
+                        "Remediation": {
+                            "type": "object",
+                            "properties": {
+                                "Code": {
+                                    "type": "object",
+                                    "properties": {
+                                        "CLI": {
+                                            "type": "string",
+                                        },
+                                        "NativeIaC": {
+                                            "type": "string",
+                                        },
+                                        "Other": {
+                                            "type": "string",
+                                        },
+                                        "Terraform": {
+                                            "type": "string",
+                                        },
+                                    },
+                                    "required": [
+                                        "CLI",
+                                        "NativeIaC",
+                                        "Other",
+                                        "Terraform",
+                                    ],
+                                },
+                                "Recommendation": {
+                                    "type": "object",
+                                    "properties": {
+                                        "Text": {
+                                            "type": "string",
+                                        },
+                                        "Url": {
+                                            "type": "string",
+                                        },
+                                    },
+                                    "required": ["Text", "Url"],
+                                    "additionalProperties": False,
+                                },
+                            },
+                            "required": ["Code", "Recommendation"],
+                            "additionalProperties": False,
+                        },
                     },
-                    "required": ["Severity"],
+                    "required": [
+                        "Severity",
+                        "CheckTitle",
+                        "Description",
+                        "Risk",
+                        "RelatedUrl",
+                        "Remediation",
+                    ],
                     "additionalProperties": False,
                 }
             },
diff --git a/tests/lib/check/custom_checks_metadata_test.py b/tests/lib/check/custom_checks_metadata_test.py
index 02fbdfd5bf..c62c4ad9ba 100644
--- a/tests/lib/check/custom_checks_metadata_test.py
+++ b/tests/lib/check/custom_checks_metadata_test.py
@@ -67,25 +67,133 @@ def test_parse_custom_checks_metadata_file_for_aws(self):
             AWS_PROVIDER, CUSTOM_CHECKS_METADATA_FIXTURE_FILE
         ) == {
             "Checks": {
-                "s3_bucket_level_public_access_block": {"Severity": "high"},
-                "s3_bucket_no_mfa_delete": {"Severity": "high"},
+                "s3_bucket_level_public_access_block": {
+                    "Severity": "high",
+                    "CheckTitle": "S3 Bucket Level Public Access Block",
+                    "Description": "This check ensures that the S3 bucket level public access block is enabled.",
+                    "Risk": "This check is important because it ensures that the S3 bucket level public access block is enabled.",
+                    "RelatedUrl": "https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html",
+                    "Remediation": {
+                        "Code": {
+                            "CLI": "aws s3api put-public-access-block --bucket <bucket-name> --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true",
+                            "NativeIaC": "https://aws.amazon.com/es/s3/features/block-public-access/",
+                            "Other": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html",
+                            "Terraform": "https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block",
+                        },
+                        "Recommendation": {
+                            "Text": "Enable the S3 bucket level public access block.",
+                            "Url": "https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html",
+                        },
+                    },
+                },
+                "s3_bucket_no_mfa_delete": {
+                    "Severity": "high",
+                    "CheckTitle": "S3 Bucket No MFA Delete",
+                    "Description": "This check ensures that the S3 bucket does not allow delete operations without MFA.",
+                    "Risk": "This check is important because it ensures that the S3 bucket does not allow delete operations without MFA.",
+                    "RelatedUrl": "https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html",
+                    "Remediation": {
+                        "Code": {
+                            "CLI": "aws s3api put-bucket-versioning --bucket <bucket-name> --versioning-configuration Status=Enabled",
+                            "NativeIaC": "https://aws.amazon.com/es/s3/features/versioning/",
+                            "Other": "https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html",
+                            "Terraform": "https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning",
+                        },
+                        "Recommendation": {
+                            "Text": "Enable versioning on the S3 bucket.",
+                            "Url": "https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html",
+                        },
+                    },
+                },
             }
         }
 
     def test_parse_custom_checks_metadata_file_for_azure(self):
         assert parse_custom_checks_metadata_file(
             AZURE_PROVIDER, CUSTOM_CHECKS_METADATA_FIXTURE_FILE
-        ) == {"Checks": {"sqlserver_auditing_enabled": {"Severity": "high"}}}
+        ) == {
+            "Checks": {
+                "storage_infrastructure_encryption_is_enabled": {
+                    "Severity": "medium",
+                    "CheckTitle": "Storage Infrastructure Encryption Is Enabled",
+                    "Description": "This check ensures that storage infrastructure encryption is enabled.",
+                    "Risk": "This check is important because it ensures that storage infrastructure encryption is enabled.",
+                    "RelatedUrl": "https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption",
+                    "Remediation": {
+                        "Code": {
+                            "CLI": "az storage account update --name <storage-account-name> --resource-group <resource-group-name> --set properties.encryption.services.blob.enabled=true properties.encryption.services.file.enabled=true properties.encryption.services.queue.enabled=true properties.encryption.services.table.enabled=true",
+                            "NativeIaC": "https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts",
+                            "Other": "https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption",
+                            "Terraform": "https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account",
+                        },
+                        "Recommendation": {
+                            "Text": "Enable storage infrastructure encryption.",
+                            "Url": "https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption",
+                        },
+                    },
+                }
+            }
+        }
 
     def test_parse_custom_checks_metadata_file_for_gcp(self):
         assert parse_custom_checks_metadata_file(
             GCP_PROVIDER, CUSTOM_CHECKS_METADATA_FIXTURE_FILE
-        ) == {"Checks": {"bigquery_dataset_cmk_encryption": {"Severity": "low"}}}
+        ) == {
+            "Checks": {
+                "compute_instance_public_ip": {
+                    "Severity": "critical",
+                    "CheckTitle": "Compute Instance Public IP",
+                    "Description": "This check ensures that the compute instance does not have a public IP.",
+                    "Risk": "This check is important because it ensures that the compute instance does not have a public IP.",
+                    "RelatedUrl": "https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address",
+                    "Remediation": {
+                        "Code": {
+                            "CLI": "https://docs.prowler.com/checks/gcp/google-cloud-public-policies/bc_gcp_public_2#cli-command",
+                            "NativeIaC": "https://cloud.google.com/compute/docs/reference/rest/v1/instances",
+                            "Other": "https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address",
+                            "Terraform": "https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance",
+                        },
+                        "Recommendation": {
+                            "Text": "Remove the public IP from the compute instance.",
+                            "Url": "https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address",
+                        },
+                    },
+                }
+            }
+        }
 
     def test_parse_custom_checks_metadata_file_for_kubernetes(self):
+        print(
+            parse_custom_checks_metadata_file(
+                KUBERNETES_PROVIDER, CUSTOM_CHECKS_METADATA_FIXTURE_FILE
+            )
+        )
+
         assert parse_custom_checks_metadata_file(
             KUBERNETES_PROVIDER, CUSTOM_CHECKS_METADATA_FIXTURE_FILE
-        ) == {"Checks": {"apiserver_anonymous_requests": {"Severity": "low"}}}
+        ) == {
+            "Checks": {
+                "apiserver_anonymous_requests": {
+                    "Severity": "low",
+                    "CheckTitle": "APIServer Anonymous Requests",
+                    "Description": "This check ensures that anonymous requests to the APIServer are disabled.",
+                    "Risk": "This check is important because it ensures that anonymous requests to the APIServer are disabled.",
+                    "RelatedUrl": "https://kubernetes.io/docs/reference/access-authn-authz/authentication/",
+                    "Remediation": {
+                        "Code": {
+                            "CLI": "--anonymous-auth=false",
+                            "NativeIaC": "https://docs.prowler.com/checks/kubernetes/kubernetes-policy-index/ensure-that-the-anonymous-auth-argument-is-set-to-false-1#kubernetes",
+                            "Other": "https://kubernetes.io/docs/reference/access-authn-authz/authentication/",
+                            "Terraform": "https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/cluster_role_binding",
+                        },
+                        "Recommendation": {
+                            "Text": "Disable anonymous requests to the APIServer.",
+                            "Url": "https://kubernetes.io/docs/reference/access-authn-authz/authentication/",
+                        },
+                    },
+                }
+            }
+        }
 
     def test_parse_custom_checks_metadata_file_for_aws_validation_error(self, caplog):
         caplog.set_level(logging.CRITICAL)
diff --git a/tests/lib/check/fixtures/custom_checks_metadata_example.yaml b/tests/lib/check/fixtures/custom_checks_metadata_example.yaml
index b9b3a65261..f5935e8d7b 100644
--- a/tests/lib/check/fixtures/custom_checks_metadata_example.yaml
+++ b/tests/lib/check/fixtures/custom_checks_metadata_example.yaml
@@ -3,17 +3,82 @@ CustomChecksMetadata:
     Checks:
       s3_bucket_level_public_access_block:
         Severity: high
+        CheckTitle: S3 Bucket Level Public Access Block
+        Description: This check ensures that the S3 bucket level public access block is enabled.
+        Risk: This check is important because it ensures that the S3 bucket level public access block is enabled.
+        RelatedUrl: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html
+        Remediation:
+          Code:
+            CLI: aws s3api put-public-access-block --bucket <bucket-name> --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
+            NativeIaC: https://aws.amazon.com/es/s3/features/block-public-access/
+            Other: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html
+            Terraform: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_public_access_block
+          Recommendation:
+            Text: Enable the S3 bucket level public access block.
+            Url: https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html
       s3_bucket_no_mfa_delete:
         Severity: high
+        CheckTitle: S3 Bucket No MFA Delete
+        Description: This check ensures that the S3 bucket does not allow delete operations without MFA.
+        Risk: This check is important because it ensures that the S3 bucket does not allow delete operations without MFA.
+        RelatedUrl: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
+        Remediation:
+          Code:
+            CLI: aws s3api put-bucket-versioning --bucket <bucket-name> --versioning-configuration Status=Enabled
+            NativeIaC: https://aws.amazon.com/es/s3/features/versioning/
+            Other: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
+            Terraform: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_versioning
+          Recommendation:
+            Text: Enable versioning on the S3 bucket.
+            Url: https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html
   azure:
     Checks:
-      sqlserver_auditing_enabled:
-        Severity: high
+      storage_infrastructure_encryption_is_enabled:
+        Severity: medium
+        CheckTitle: Storage Infrastructure Encryption Is Enabled
+        Description: This check ensures that storage infrastructure encryption is enabled.
+        Risk: This check is important because it ensures that storage infrastructure encryption is enabled.
+        RelatedUrl: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
+        Remediation:
+          Code:
+            CLI: az storage account update --name <storage-account-name> --resource-group <resource-group-name> --set properties.encryption.services.blob.enabled=true properties.encryption.services.file.enabled=true properties.encryption.services.queue.enabled=true properties.encryption.services.table.enabled=true
+            NativeIaC: https://docs.microsoft.com/en-us/azure/templates/microsoft.storage/storageaccounts
+            Other: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
+            Terraform: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account
+          Recommendation:
+            Text: Enable storage infrastructure encryption.
+            Url: https://docs.microsoft.com/en-us/azure/storage/common/storage-service-encryption
   gcp:
     Checks:
-      bigquery_dataset_cmk_encryption:
-        Severity: low
+      compute_instance_public_ip:
+        Severity: critical
+        CheckTitle: Compute Instance Public IP
+        Description: This check ensures that the compute instance does not have a public IP.
+        Risk: This check is important because it ensures that the compute instance does not have a public IP.
+        RelatedUrl: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
+        Remediation:
+          Code:
+            CLI: https://docs.prowler.com/checks/gcp/google-cloud-public-policies/bc_gcp_public_2#cli-command
+            NativeIaC: https://cloud.google.com/compute/docs/reference/rest/v1/instances
+            Other: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
+            Terraform: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance
+          Recommendation:
+            Text: Remove the public IP from the compute instance.
+            Url: https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address
   kubernetes:
     Checks:
       apiserver_anonymous_requests:
         Severity: low
+        CheckTitle: APIServer Anonymous Requests
+        Description: This check ensures that anonymous requests to the APIServer are disabled.
+        Risk: This check is important because it ensures that anonymous requests to the APIServer are disabled.
+        RelatedUrl: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
+        Remediation:
+          Code:
+            CLI: --anonymous-auth=false
+            NativeIaC: https://docs.prowler.com/checks/kubernetes/kubernetes-policy-index/ensure-that-the-anonymous-auth-argument-is-set-to-false-1#kubernetes
+            Other: https://kubernetes.io/docs/reference/access-authn-authz/authentication/
+            Terraform: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/cluster_role_binding
+          Recommendation:
+            Text: Disable anonymous requests to the APIServer.
+            Url: https://kubernetes.io/docs/reference/access-authn-authz/authentication/


Code review comments:
diff_hunk: @@ -18,9 +18,71 @@
                         "Severity": {
                             "type": "string",
                             "enum": valid_severities,
-                        }
+                        },
+                        "CheckTitle": {
+                            "type": "string",
+                        },
+                        "Description": {
+                            "type": "string",
+                        },
+                        "Risk": {
+                            "type": "string",
+                        },
+                        "RelatedUrl": {
+                            "type": "string",
+                        },
+                        "Remediation": {
+                            "type": "object",
+                            "properties": {
+                                "Code": {
+                                    "type": "object",
+                                    "properties": {
+                                        "CLI": {
+                                            "type": "string",
+                                        },
+                                        "NativeIaC": {
+                                            "type": "string",
+                                        },
+                                        "Other": {
+                                            "type": "string",
+                                        },
+                                        "Terraform": {
+                                            "type": "string",
+                                        },
+                                    },
+                                    "required": [
+                                        "CLI",
+                                        "NativeIaC",
+                                        "Other",
+                                        "Terraform",
+                                    ],
+                                },
+                                "Recommendation": {
+                                    "type": "object",
+                                    "properties": {
+                                        "Text": {
+                                            "type": "string",
+                                        },
+                                        "Url": {
+                                            "type": "string",
+                                        },
+                                    },
+                                    "required": ["Text", "Url"],
+                                    "additionalProperties": False,
+                                },
+                            },
+                            "required": ["Code", "Recommendation"],
+                            "additionalProperties": False,
+                        },
                     },
-                    "required": ["Severity"],
+                    "required": [
+                        "Severity",
+                        "CheckTitle",
+                        "Description",
+                        "Risk",
+                        "RelatedUrl",
+                        "Remediation",
+                    ],
path: prowler/lib/check/custom_checks_metadata.py
text: @user1:
Do we want to mark all as required? I think it should be optional. What do you think?

@user2:
I don't think they should be required. If missing, then the values from the check's json should be used

@author:
Yes, I totally agree with that.