From af1d85ae7516a2479f2318bb3b058b3ae7c95722 Mon Sep 17 00:00:00 2001 From: alexr3y <115954546+alexr3y@users.noreply.github.com> Date: Mon, 21 Nov 2022 13:13:24 +0200 Subject: [PATCH] feat(compliance): ENS RD2022 first draft and json converter (#1502) --- compliance/ens_rd2022_aws.json | 1793 +++++++++++++++++ ...nerate_compliance_json_from_csv_for_ens.py | 48 + 2 files changed, 1841 insertions(+) create mode 100644 compliance/ens_rd2022_aws.json create mode 100644 util/generate_compliance_json_from_csv_for_ens.py diff --git a/compliance/ens_rd2022_aws.json b/compliance/ens_rd2022_aws.json new file mode 100644 index 00000000..21ae0165 --- /dev/null +++ b/compliance/ens_rd2022_aws.json @@ -0,0 +1,1793 @@ +{ + "Framework": "ENS", + "Version": "RD2022", + "Requirements": [ + { + "Id": "op.acc.1.aws.iam.1", + "Description": "Proveedor de identidad centralizado", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Para las entidades de los empleados, deberá manejarse un proveedor de identidades que permita administrar las identidades en un lugar centralizado.", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_check_saml_providers_sts" + ] + }, + { + "Id": "op.acc.2.aws.iam.3", + "Description": "Requisitos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se deberá delegar en cuentas administradoras la administración de la organización, dejando la cuenta maestra sin uso y con las medidas de seguridad pertinentes.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_avoid_root_usage" + ] + }, + { + "Id": "op.acc.3.aws.iam.4", + "Description": "Segregación rigurosa", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Emplear RBAC para separar las funciones de configuración y mantenimiento del sistema (como buena práctica, se puede asignar a los usuarios de mantenimiento la política AWSSupportAccess)", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_support_role_created" + ] + }, + { + "Id": "op.acc.4.aws.iam.1", + "Description": "Proceso de gestión de derechos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se restringirá todo acceso a las acciones especificadas para el usuario root de una cuenta.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_no_root_access_key", + "iam_avoid_root_usage" + ] + }, + { + "Id": "op.acc.4.aws.iam.2", + "Description": "Proceso de gestión de derechos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Configurar las políticas IAM de modo que sólo se permitan los privilegios necesarios para cada rol (privilegio mínimo). Comenzar con el mínimo nivel de permisos e ir añadiendo permisos adicionales según vaya surgiendo la necesidad en lugar de comenzar con permisos administrativos.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "sqs_queues_not_publicly_accessible", + "s3_bucket_policy_public_write_access", + "lambda_function_not_publicly_accessible", + "iam_no_custom_policy_permissive_role_assumption", + "cloudwatch_cross_account_sharing_disabled", + "lambda_function_url_public", + "lambda_function_url_cors_policy", + "iam_customer_managed_policy_least_privilege", + "iam_policy_no_administrative_privileges" + ] + }, + { + "Id": "op.acc.4.aws.iam.5", + "Description": "Proceso de gestión de derechos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Evitar políticas con comodines (wildcards) en su definición, que puedan otorgar privilegios administrativos completos.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_policy_allows_privilege_escalation", + "iam_no_custom_policy_permissive_role_assumption", + "iam_policy_no_administrative_privileges" + ] + }, + { + "Id": "op.acc.4.aws.iam.1", + "Description": "Proceso de gestión de derechos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se configurarán diferentes permisos a las cuentas de usuario, limitando la utilización de la cuenta “root” para tareas específicas que necesiten un nivel de privilegios elevado, esta configuración debe entenderse como un mecanismo para impedir que el trabajo directo con usuarios con privilegios de administrador repercuta negativamente en la seguridad, a acometer todas las acciones con el máximo privilegio cuando este no es siempre requerido.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_policy_no_administrative_privileges" + ] + }, + { + "Id": "op.acc.4.aws.sys.1", + "Description": "Proceso de gestión de derechos de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Habilitar systems manager automation para evitar acceso remoto humano a tareas automatizables.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "ec2_instance_managed_by_ssm" + ] + }, + { + "Id": "op.acc.6.aws.iam.1", + "Description": "Mecanismo de autenticación (usuarios de la organización)", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Evitar el uso permanente de múltiples claves de acceso para un mismo usuario IAM.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_user_two_active_access_key" + ] + }, + { + "Id": "op.acc.6.aws.iam.2", + "Description": "Mecanismo de autenticación (usuarios de la organización)", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Las claves de acceso deberán rotarse cada 90 días o menos.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_disable_90_days_credentials", + "iam_rotate_access_key_90_days" + ] + }, + { + "Id": "op.acc.6.aws.iam.3", + "Description": "Mecanismo de autenticación (usuarios de la organización)", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se deberá evitar la asignación por defecto de claves de acceso para todos los usuarios que tengan acceso a la consola. ", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_user_no_setup_initial_access_key" + ] + }, + { + "Id": "op.acc.6.aws.iam.4", + "Description": "Mecanismo de autenticación (usuarios de la organización)", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Deberá habilitarse el vencimiento de la contraseña.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_password_policy_expires_90_days", + "iam_disable_90_days_credentials", + "iam_rotate_access_key_90_days" + ] + }, + { + "Id": "op.acc.6.aws.iam.6", + "Description": "Contraseñas", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Las contraseñas de los usuarios deberán tener normas de complejidad mínima y robustez.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_password_policy_lowercase", + "iam_password_policy_minimum_length_14", + "iam_password_policy_number", + "iam_password_policy_reuse_24", + "iam_password_policy_symbol", + "iam_password_policy_uppercase" + ] + }, + { + "Id": "op.acc.6.aws.iam.7", + "Description": "Contraseña + otro factor de autenticación", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "MFA deberá estar habilitado para todas las cuentas que tengan contraseña para acceder a la consola (usuarios IAM).", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_user_mfa_enabled_console_access" + ] + }, + { + "Id": "op.acc.6.aws.iam.9", + "Description": "Certificados en dispositvo físico", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se deberá usar certificados cualificados en soporte físico como mecanismo de autenticación que usen algoritmos, parámetros y dispositivos autorizados por el Centro Criptológico Nacional.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_user_mfa_enabled", + "iam_root_hardware_mfa_enabled" + ] + }, + { + "Id": "", + "Description": "Certificados en dispositvo físico", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se deberá usar certificados cualificados en soporte físico como mecanismo de autenticación que usen algoritmos, parámetros y dispositivos autorizados por el Centro Criptológico Nacional.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_administrator_access_with_mfa", + "iam_root_mfa_enabled", + "iam_user_mfa_enabled_console_access" + ] + }, + { + "Id": "op.acc.6.aws.ct.1", + "Description": "Registro", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Habilitar CloudTrail en todas las regiones para el registro de accesos de usuarios.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "cloudtrail_multi_region_enabled" + ] + }, + { + "Id": "op.acc.6.aws.iam.10", + "Description": "Suspensión por no utilización", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Las claves de acceso de los usuarios IAM que no hayan sido empleadas durante un periodo de 90 días o más deberán ser deshabilitadas.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_disable_30_days_credentials", + "iam_disable_90_days_credentials" + ] + }, + { + "Id": "op.acc.6.aws.iam.11", + "Description": "Doble factor para acceso desde o a través de zonas no controladas", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "control de acceso", + "DescripcionControl": "Se deberá emplear como mecanismo de autenticación o bien una contraseña más otro factor de autenticación, o bien un certificado cualificado (con o sin soporte físico) protegido por un doble factor de autenticación.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad" + ] + } + ], + "Checks": [ + "iam_user_mfa_enabled_console_access" + ] + }, + { + "Id": "", + "Description": "Inventario de activos", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asegurar que AWS Config está habilitado en todas las regiones", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "config_recorder_all_regions_enabled" + ] + }, + { + "Id": "", + "Description": "Inventario de activos", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asociar etiquetas para todos los activos", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "tags_exist_in_required_resources" + ] + }, + { + "Id": "", + "Description": "Inventario de activos", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Habilitar Inventory para todo el entorno de EC2 en caso de no utilizar herramientas de terceros", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_instance_managed_by_ssm", + "ec2_ssm_managed_compliant_patching" + ] + }, + { + "Id": "", + "Description": "Inventario de activos", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asignar metadatos personalizados a cada nodo administrado con información sobre el responsable del activo.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "tags_exist_in_required_resources" + ] + }, + { + "Id": "", + "Description": "Gestión de la configuración de seguridad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Utilizar la herramienta AWS Config, AWS Config Rules o Conformance packs para evaluar los componentes del sistema, asegurando:", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "config_recorder_all_regions_enabled" + ] + }, + { + "Id": "", + "Description": "Gestión de la configuración de seguridad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Reacción a vulnerabilidades notificadas", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "account_maintain_current_contact_details", + "account_security_contact_information_is_registered", + "account_security_questions_are_registered_in_the_aws_account" + ] + }, + { + "Id": "", + "Description": "Gestión de la configuración de seguridad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Reacción a incidentes", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "account_maintain_current_contact_details", + "account_security_contact_information_is_registered", + "account_security_questions_are_registered_in_the_aws_account" + ] + }, + { + "Id": "op.exp.3.aws.cfg.4", + "Description": "Copias de seguridad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Hacer uso de AWS Config para consultar el histórico de configuraciones de recursos.", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "config_recorder_all_regions_enabled" + ] + }, + { + "Id": "op.exp.4.aws.sys.2", + "Description": "Mantenimiento y actualizaciones de seguridad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Utilizar AWS Systems Manager Patch Manager para planificar y gestionar la aplicación de parches minimizando los riesgos asociados a tener instancias con software desactualizado y expuesto a vulnerabilidades conocidas.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_ssm_managed_compliant_patching" + ] + }, + { + "Id": "op.exp.4.aws.sma.1", + "Description": "Prevención de fallos", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Utilizar la solución AWS Systems Manager Automation para automatizar las tareas de corrección en servicios de AWS como EC2 y RDS.", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_instance_managed_by_ssm", + "ec2_ssm_managed_compliant_patching" + ] + }, + { + "Id": "op.exp.5.aws.ct.1", + "Description": "Gestión de cambios", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asegurar que CloudTrail esté activo para todas las regiones.", + "Nivel": "bajo", + "Tipo": "recomendacion", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "cloudtrail_multi_region_enabled", + "cloudtrail_security_trail_enabled?" + ] + }, + { + "Id": "op.exp.6.aws.gd.1", + "Description": "Protección frente a código dañino", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Activar la protección contra software malintencionado de GuardDuty en todas las regiones para monitorizar instancias y cargas de trabajo.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "guardduty_is_enabled" + ] + }, + { + "Id": "", + "Description": "Gestión de incidentes", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "La referencia a estas medidas de seguridad puede encontrarse en la guía CCN-STIC 887F Guía de Respuesta a incidentes de seguridad en AWS", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "guardduty_is_enabled", + "guardduty_no_high_severity_findings", + "securityhub_is_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.1", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asegurar que AWS CloudTrail esté activo para todas las regiones", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_multi_region_enabled" + ] + }, + { + "Id": "op.exp.8.aws.cw.1", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Establecer un filtro de métricas desde AWS CloudWatch para detectar cambios en las configuraciones de CloudTrail", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.2", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Habilitar la validación de archivos en todos los trails, evitando así que estos se vean modificados o eliminados.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_log_file_validation_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.3", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Habilitar la entrega continua de eventos de CloudTrail a un bucket S3 dedicado.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_dataevents_enabled", + "cloudtrail_management_events_logging_enabled", + "cloudtrail_logs_s3_bucket_is_not_publicly_accessible", + "cloudtrail_s3_dataevents_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.4", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Se deberán habilitar alertas para las llamadas no permitidas a la API", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_unauthorized_api_calls" + ] + }, + { + "Id": "op.exp.8.aws.ct.5", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Se deberán habilitar alertas para los accesos no permitidos a la consola", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_authentication_failures" + ] + }, + { + "Id": "op.exp.8.aws.ct.6", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Se deberán habilitar alertas para los accesos a la consola sin el correcto uso de MFA", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_sign_in_without_mfa" + ] + }, + { + "Id": "op.exp.8.aws.ct.7", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Se deberán habilitar alertas para toda la actividad realizada sobre y por la cuenta root", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_root_usage" + ] + }, + { + "Id": "op.exp.8.aws.ct.8", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Se deberán habilitar alertas para cualquier cambio sobre las políticas IAM", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_policy_changes" + ] + }, + { + "Id": "op.exp.8.aws.ct.19", + "Description": "Registro de actividad", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Asegurar que AWS CloudTrail esté activo para todas las regiones", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_multi_region_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.10", + "Description": "Revisión de los registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Configurar la herramienta CloudTrail de manera que realice el registro de eventos de administración.", + "Nivel": "pytec", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_metric_filter_and_alarm_for_cloudtrail_configuration_changes_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.11", + "Description": "Revisión de los registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Configurar la herramienta CloudTrail de manera que realice el registro de eventos de datos.", + "Nivel": "pytec", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_dataevents_enabled", + "cloudtrail_partial_dataevents_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.13", + "Description": "Revisión de los registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Registrar los eventos de lectura y escritura de datos.", + "Nivel": "pytec", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_s3_dataevents_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.18", + "Description": "Revisión de los registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Habilitar la entrega continua de eventos de CloudTrail a un bucket de Amazon S3", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_logs_s3_bucket_access_logging_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.14", + "Description": "Revisión de los registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Integrar CloudTrail con el servicio CloudWatch Logs", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_cloudwatch_logging_enabled" + ] + }, + { + "Id": "op.exp.8.aws.cw.4", + "Description": "Retención de registros", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Ejecutar la acción PutRetentionPolicy de Amazon CloudWatch.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudwatch_log_group_retention_policy_specific_days_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.15", + "Description": "Control de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Configurar los archivos de logs de AWS CloudTrail para aprovechar el cifrado SSE y las CMK de KMS.", + "Nivel": "pytec", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_kms_encryption_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.16", + "Description": "Control de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "El almacén de logs de CloudTrail no debería ser accesible de forma pública", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_logs_s3_bucket_access_logging_enabled" + ] + }, + { + "Id": "op.exp.8.aws.ct.17", + "Description": "Control de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "El almacén de logs de CloudTrail no debería ser accesible de forma pública (ACLs)", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_logs_s3_bucket_is_not_publicly_accessible" + ] + }, + { + "Id": "op.exp.8.aws.kms.1", + "Description": "Control de acceso", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Cifrado de los trails con KMS", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "trazabilidad" + ] + } + ], + "Checks": [ + "cloudtrail_kms_encryption_enabled" + ] + }, + { + "Id": "op.exp.10.aws.kms.3", + "Description": "Protección de claves criptográficas", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Activar la rotación de las claves CMK.", + "Nivel": "pytec", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "kms_cmk_rotation_enabled" + ] + }, + { + "Id": "op.exp.10.aws.kms.4", + "Description": "Protección de claves criptográficas", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Deshabilitar todas las claves CMK que no estén en uso.", + "Nivel": "pytec", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "kms_disable_or_scheduled_deletion_of_kms_cmks_alarms_enabled" + ] + }, + { + "Id": "op.exp.10.aws.kms.5", + "Description": "Protección de claves criptográficas", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "explotación", + "DescripcionControl": "Eliminar todas las claves CMK deshabilitadas que no mantengan ningún objeto o recurso cifrado.", + "Nivel": "pytec", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "kms_disable_or_scheduled_deletion_of_kms_cmks_alarms_enabled" + ] + }, + { + "Id": "op.mon.1.aws.gd.1", + "Description": "Detección de intrusión", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "monitorización del sistema", + "DescripcionControl": "Habilitar Amazon GuarDuty para la detección de amenazas e intrusiones en ausencia de herramientas de terceros.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "guardduty_is_enabled" + ] + }, + { + "Id": "op.mon.1.aws.ct.1", + "Description": "Detección de intrusión", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "monitorización del sistema", + "DescripcionControl": "Activar el servicio de eventos AWS CloudTrail para todas las regiones.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "cloudtrail_multi_region_enabled" + ] + }, + { + "Id": "op.mon.1.aws.vpc.1", + "Description": "Detección de intrusión", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "monitorización del sistema", + "DescripcionControl": "Activar el servicio VPC FlowLogs.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "vpc_flow_logs_enabled" + ] + }, + { + "Id": "op.mon.1.aws.gd.4", + "Description": "Detección de intrusión", + "Attributes": [ + { + "Marco": "operacional", + "Categoria": "monitorización del sistema", + "DescripcionControl": "Deberá habilitarse Amazon GuardDuty para todas las regiones tanto en la cuenta raíz como en las cuentas miembro de un entorno multi-cuenta.", + "Nivel": "alto", + "Tipo": "medida", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "guardduty_is_enabled" + ] + }, + { + "Id": "mp.com.1.aws.sg.1", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Asegurar que el Security Group por defecto restrinja todo el tráfico.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_default_restrict_traffic" + ] + }, + { + "Id": "mp.com.1.aws.sg.2", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Agregar las reglas del Security Group que se aplica por defecto cuando se crea una VPC.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "extra7173", + "vpc_default_network_acls_allow_all", + "vpc_subnets_with_default_network_acls", + "vpc_unused_default_vpc_removal" + ] + }, + { + "Id": "mp.com.1.aws.sg.3", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Evitar la existencia de Security Groups que dejen abierto todo el tráfico entrante.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_in_use_without_ingress_filtering" + ] + }, + { + "Id": "mp.com.1.aws.sg.4", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Evitar tener (un repositorio de) Security Groups que no estén siendo usados.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_not_used" + ] + }, + { + "Id": "mp.com.1.aws.elb.1", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Habilitar TLS en los balanceadores de carga ELB ", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "elb_ssl_listeners" + ] + }, + { + "Id": "mp.com.1.aws.elb.2", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Evitar el uso de protocolos de cifrado inseguros para las políticas de seguridad de ELB. Esto podría dejar la conexión SSL entre balanceadores y clientes vulnerables a ser explotados. En particular deberá evitarse el uso de TLS 1.0. ", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "elb_insecure_ssl_ciphers" + ] + }, + { + "Id": "mp.com.1.aws.s3.1", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Asegurar que los Buckets S3 de almacenamiento apliquen cifrado para la transferencia de datos empleando Secure Sockets Layer (SSL)", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "s3_bucket_secure_transport_policy" + ] + }, + { + "Id": "mp.com.1.aws.cf.1", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Asegurar que la distribución entre frontales CloudFront y sus orígenes únicamente emplee tráfico HTTPs ", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "cloudfront_distributions_https_enabled" + ] + }, + { + "Id": "mp.com.1.aws.sg.5", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "SSH no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_22" + ] + }, + { + "Id": "mp.com.1.aws.sg.6", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "RDP no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_tcp_port_3389", + "vpc_network_acls_no_unrestricted_ssh_rdp" + ] + }, + { + "Id": "mp.com.1.aws.sg.7", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Oracle (TCP/1521 y TCP/2483) no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_oracle_1521_2483" + ] + }, + { + "Id": "mp.com.1.aws.sg.8", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "MySQL (TCP/3306) no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_mysql_3306" + ] + }, + { + "Id": "mp.com.1.aws.sg.9", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Postgres (TCP 5432) no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_postgres_5432" + ] + }, + { + "Id": "mp.com.1.aws.sg.10", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Redis (TCP/6397) no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_redis_6379" + ] + }, + { + "Id": "mp.com.1.aws.sg.11", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "MongoDB (TCP/7199 - TCP/9160 y TCP/888) no deberá ser accesible desde internet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_port_mongodb_27017_27018" + ] + }, + { + "Id": "mp.com.1.aws.sg.12", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Memcached (TCP/11211) no deberá ser accesible desde ineternet.", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_memcached_11211" + ] + }, + { + "Id": "mp.com.1.aws.sg.13", + "Description": "Perímetro seguro", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Cassandra (TCP/7199- TCP/9160 y TCP/8888) no deberá ser accesible desde internet", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "confidencialidad", + "integridad", + "trazabilidad", + "autenticidad", + "disponibilidad" + ] + } + ], + "Checks": [ + "ec2_securitygroup_allow_ingress_from_internet_to_tcp_port_cassandra_7199_9160_8888" + ] + }, + { + "Id": "mp.com.3.aws.elb.1", + "Description": "Protección de la integridad y de la autenticidad", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Habilitar TLS en los balanceadores de carga ELB", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "integridad", + "autenticidad" + ] + } + ], + "Checks": [ + "ec2_elbv2_insecure_ssl_ciphers" + ] + }, + { + "Id": "mp.com.3.aws.elb.2", + "Description": "Protección de la integridad y de la autenticidad", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Evitar el uso de protocolos de cifrado inseguros en la conexión TLS entre clientes y balanceadores de carga", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "integridad", + "autenticidad" + ] + } + ], + "Checks": [ + "ec2_elbv2_insecure_ssl_ciphers" + ] + }, + { + "Id": "mp.com.3.aws.s3.1", + "Description": "Protección de la integridad y de la autenticidad", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Asegurar que los Buckets de almacenamiento S3 apliquen cifrado para la transferencia de datos empleando TLS", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "integridad", + "autenticidad" + ] + } + ], + "Checks": [ + "s3_bucket_secure_transport_policy" + ] + }, + { + "Id": "mp.com.3.aws.cf.1", + "Description": "Protección de la integridad y de la autenticidad", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de las comunicaciones", + "DescripcionControl": "Asegurar que la distribución entre frontales CloudFront y sus orígenes únicamente emplee tráfico HTTPS", + "Nivel": "alto", + "Tipo": "requisito", + "Dimensiones": [ + "integridad", + "autenticidad" + ] + } + ], + "Checks": [ + "cloudfront_distributions_https_enabled" + ] + }, + { + "Id": "mp.si.2.aws.ebs.2", + "Description": "Copias de seguridad", + "Attributes": [ + { + "Marco": "medidas de protección", + "Categoria": "protección de los soportes de información", + "DescripcionControl": "Se deberá asegurar el cifrado de las copias de seguridad de EBS.", + "Nivel": "alto", + "Tipo": "refuerzo", + "Dimensiones": [ + "confidencialidad", + "integridad" + ] + } + ], + "Checks": [ + "ec2_ebs_snapshot_encryption" + ] + } + ] +} \ No newline at end of file diff --git a/util/generate_compliance_json_from_csv_for_ens.py b/util/generate_compliance_json_from_csv_for_ens.py new file mode 100644 index 00000000..7cd8559a --- /dev/null +++ b/util/generate_compliance_json_from_csv_for_ens.py @@ -0,0 +1,48 @@ +import csv +import sys +import json + +# Convert a CSV file following the Spanish ENS - Esquema Nacional de Seguridad - RD2022 benchmark into a Prowler v3.0 Compliance JSON file +# CSV fields: +# ['Id', 'Description', 'Marco', 'Categoria', 'Descripcion_Control', 'Nivel', 'Dimensiones', 'Checks', 'ChecksV2', 'Tipo'], + +# get the CSV filename to convert from +file_name = sys.argv[1] + +# read the CSV file rows and use the column fields to form the Prowler compliance JSON file 'ens_rd2022_aws.json' +output = {"Framework": "ENS", "Version": "RD2022", "Requirements": []} +with open(file_name, newline="", encoding="utf-8") as f: + reader = csv.reader(f, delimiter=",") + for row in reader: + niveles = list(map(str.strip, row[5].split(","))) + if "pytec" in niveles: + nivelvalue = "pytec" + elif "alto" in niveles: + nivelvalue = "alto" + elif "medio" in niveles: + nivelvalue = "medio" + elif "opcional" in niveles: + nivelvalue = "opcional" + else: + nivelvalue = "bajo" + + attribute = { + "Marco": row[2], + "Categoria": row[3], + "DescripcionControl": row[4], + "Nivel": nivelvalue, + "Tipo": row[9], + "Dimensiones": list(map(str.strip, row[6].split(","))), + } + output["Requirements"].append( + { + "Id": row[0], + "Description": row[1], + "Attributes": [attribute], + "Checks": list(map(str.strip, row[7].split(","))), + } + ) + +# Write the output Prowler compliance JSON file 'ens_rd2022_aws.json' locally +with open("ens_rd2022_aws.json", "w", encoding="utf-8") as outfile: + json.dump(output, outfile, indent=4, ensure_ascii=False)