Note:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse para obtener una cuenta gratuita, consulte Introducción a la cuenta gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para credenciales, arrendamiento y compartimentos de Oracle Cloud Infrastructure. Al finalizar la práctica, sustituya estos valores por otros específicos de su entorno en la nube.
Envío de problemas de Oracle Cloud Guard por correo electrónico con Oracle Cloud Infrastructure Functions
Introducción
Hoy en día, los equipos de ciberseguridad de todos los sectores se enfrentan al complejo desafío de mantener una postura de seguridad sólida mientras se enfrentan a la naturaleza dinámica de los entornos en la nube. Con innumerables recursos, configuraciones y amenazas en evolución, rastrear y abordar los problemas rápidamente es crucial. En Oracle, reconocemos la importancia de equipar a las organizaciones con herramientas para optimizar su gestión de la seguridad, ayudándoles a abordar estos desafíos de frente. Oracle Cloud Guard ofrece una funcionalidad sólida para ayudar a las empresas a simplificar la gestión de la seguridad en la nube, pasando de la mera identificación de vulnerabilidades a la distribución automática de problemas entre equipos para una resolución oportuna.
En este tutorial se describe una solución automatizada que aprovecha los servicios nativos de OCI que permite a los equipos de seguridad recibir y compartir informes de seguridad detallados de Oracle Cloud Guard directamente a través del correo electrónico. Este enfoque reduce la intervención manual, facilita la supervisión continua y garantiza una postura proactiva en la seguridad en la nube.
Objetivo
- Reciba todos los problemas abiertos de Oracle Cloud Guard en un correo electrónico que se puede distribuir a los equipos adecuados, lo que simplifica el camino hacia la resolución.
Requisitos
-
Acceso a un arrendamiento de Oracle Cloud Infrastructure (OCI).
-
Privilegios para gestionar Oracle Cloud Guard, OCI Functions, el servicio OCI Email Delivery, OCI Vault y OCI Resource Scheduler.
Tarea 1: Configuración de las políticas necesarias y los permisos de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)
Cada componente de esta solución debe tener acceso a los recursos de OCI con los que interactúa.
-
Política del programador de recursos: permite al programador ejecutar la función en un programa definido. Para obtener más información, consulte Políticas de ejemplo.
-
Política de funciones: otorgue permiso de función para leer secretos de OCI Vault y recuperar problemas de Oracle Cloud Guard. Para obtener más información, consulte Detalles para Functions.
Tarea 2: Configuración del servicio OCI Email Delivery
-
Configure el servicio OCI Email Delivery creando una dirección de correo electrónico de emisor aprobado que se utilizará para enviar informes. Para obtener más información, consulte Creación de un remitente aprobado.
-
Genere credenciales de protocolo simple de transferencia de correo (SMTP) para la cuenta de correo electrónico mediante la creación de un usuario dedicado con permisos de acceso SMTP limitados.
-
Cree un usuario de OCI IAM. Para obtener más información, consulte Creación de un usuario.
-
Para editar capacidades de usuario, consulte Edición de capacidades de un usuario.
-
Para crear credenciales SMTP, consulte Creación de credenciales SMTP.
-
Tarea 3: Almacenamiento de credenciales SMTP en OCI Vault
Mediante OCI Vault, almacene de forma segura las credenciales SMTP. Esto agrega una capa adicional de seguridad al mantener la información confidencial fuera de la función.
-
Configure un OCI Vault. Para obtener más información, consulte Creación de un almacén.
-
Para crear una clave de cifrado maestra, consulte Creating a Master Encryption Key.
-
Para crear un secreto, consulte Creación de un secreto en un almacén.
Tarea 4: Desarrollo y despliegue de la función
Esta función recupera los problemas de estrategia de seguridad no resueltos detectados en el último año. Aplica formato a los datos en un informe estructurado basado en parámetros como el nivel de riesgo y el tiempo de detección y, a continuación, los envía como un anexo de valores separados por comas (CSV) por correo electrónico. Para obtener más información, consulte Despliegue de una función.
A continuación se muestra una descripción general de los pasos de la función principal:
- Recupere problemas sin resolver de Oracle Cloud Guard.
- Organice y formatee los problemas en función de la gravedad.
- Genere un informe CSV y dé formato al informe.
- Recupere las credenciales SMTP del almacén.
- Envíe el correo electrónico a los destinatarios designados con CSV como anexo.
Mediante las capacidades de función sin servidor de OCI, este informe se puede personalizar para proporcionar la máxima claridad sobre las áreas de seguridad críticas para los equipos de ciberseguridad.
-
func.py
:import oci import io import smtplib import logging import base64 from oci.pagination import list_call_get_all_results from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from email.mime.text import MIMEText from openpyxl import Workbook from datetime import datetime, timedelta, timezone from openpyxl.styles import Font # Retrieve secrets from OCI Vault def get_secret_value(secret_ocid): print(f"Retrieving secret for OCID: {secret_ocid}") signer = oci.auth.signers.get_resource_principals_signer() secrets_client = oci.secrets.SecretsClient({}, signer=signer) try: secret_content = secrets_client.get_secret_bundle(secret_ocid) secret_data = secret_content.data.secret_bundle_content.content secret_value = base64.b64decode(secret_data).decode('utf-8') return secret_value except Exception as e: print(f"Failed to retrieve secret: {e}") raise # Format the CSV def get_font_style(risk_level, time_condition): color_map = { "CRITICAL": "8B0000", "HIGH": "FF8C00", "MEDIUM": "006400", "LOW": "00008B", "MINOR": "000000" } font_color = color_map.get(risk_level, "000000") is_bold = time_condition return Font(color=font_color, bold=is_bold) def get_clients_with_resource_principal(): signer = oci.auth.signers.get_resource_principals_signer() cloud_guard_client = oci.cloud_guard.CloudGuardClient({}, signer=signer) return cloud_guard_client def send_email_via_oci(subject, body, email, attachment, username_secret_ocid, password_secret_ocid, from_email, smtp_endpoint, smtp_port): msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = from_email msg['To'] = email msg.attach(MIMEText(body, 'plain')) today_date = datetime.today().strftime('%Y-%m-%d') filename = f"CloudGuardReport_{today_date}.xlsx" part = MIMEBase('application', "octet-stream") part.set_payload(attachment) encoders.encode_base64(part) part.add_header('Content-Disposition', f"attachment; filename={filename}") msg.attach(part) try: username = get_secret_value(username_secret_ocid) password = get_secret_value(password_secret_ocid) server = smtplib.SMTP(smtp_endpoint, smtp_port) server.starttls() server.login(username, password) server.sendmail(msg['From'], [msg['To']], msg.as_string()) server.quit() print("Email sent successfully.") except Exception as e: print(f"Failed to send email: {e}") raise def handler(ctx, data: io.BytesIO=None): try: cfg = ctx.Config() compartment_id = cfg["compartment-id"] from_email = cfg["from-email"] email = cfg["to-email"] smtp_endpoint = cfg["smtp-endpoint"] smtp_port = cfg["smtp-port"] username_secret_ocid = cfg["smtp-username-secret-ocid"] password_secret_ocid = cfg["smtp-password-secret-ocid"] cg_access_level = cfg["cloudguard-access-level"] cloud_guard_client = get_clients_with_resource_principal() current_time = datetime.now(timezone.utc) time_last_7_days = current_time - timedelta(days=7) formatted_time_one_year_ago = (current_time - timedelta(days=365)).strftime("%Y-%m-%dT%H:%M:%S.%fZ") formatted_time_last_7_days = time_last_7_days.strftime("%Y-%m-%dT%H:%M:%S.%fZ") # List problems problem_response = list_call_get_all_results( cloud_guard_client.list_problems, compartment_id, compartment_id_in_subtree=True, access_level=cg_access_level, time_first_detected_greater_than_or_equal_to=formatted_time_one_year_ago, time_last_detected_greater_than_or_equal_to=formatted_time_last_7_days ).data if not problem_response: logging.info("No open problems found.") return {"statusCode": 200, "body": "No open problems found."} print(f"Found {len(problem_response)} problems") # Sort problems by Risk Level risk_level_order = {"CRITICAL": 1, "HIGH": 2, "MEDIUM": 3, "LOW": 4, "MINOR": 5} problem_response.sort(key=lambda x: risk_level_order.get(x.risk_level, 6)) # Create a workbook and select active worksheet wb = Workbook() ws = wb.active ws.title = "Cloud Guard Problems" ws.append([ "Region", "ID", "Resource Type", "Resource Name", "Risk Level", "Detector", "Rule Display Name", "Rule Description", "Rule Recommendation", "Resource ID", "Time First Detected", "Time Last Detected" ]) # Iterate through the problems for problem in problem_response: try: detector_rule_response = cloud_guard_client.get_detector_rule(problem.detector_id, problem.detector_rule_id).data rule_description = detector_rule_response.description detector = detector_rule_response.detector rule_display_name = detector_rule_response.display_name rule_recommendation = detector_rule_response.recommendation except Exception as e: logging.error(f"Error fetching detector rule details for problem {problem.id}: {str(e)}") rule_description, detector, rule_display_name, rule_recommendation = "N/A", "N/A", "N/A", "N/A" problem_details = [ problem.region, problem.id, problem.resource_type, problem.resource_name, problem.risk_level, detector, rule_display_name, rule_description, rule_recommendation, problem.resource_id, problem.time_first_detected.replace(tzinfo=None) if problem.time_first_detected else None, problem.time_last_detected.replace(tzinfo=None) if problem.time_last_detected else None ] # Add row to worksheet ws.append(problem_details) # Apply format time_condition = problem.time_last_detected > problem.time_first_detected if problem.time_last_detected and problem.time_first_detected else False font_style = get_font_style(problem.risk_level, time_condition) row_number = ws.max_row for cell in ws[row_number]: cell.font = font_style virtual_workbook = io.BytesIO() wb.save(virtual_workbook) virtual_workbook.seek(0) # Send email send_email_via_oci("OCI Cloud Guard Report", "Find attached the OCI Cloud Guard Report.", email, virtual_workbook.getvalue(), username_secret_ocid, password_secret_ocid, from_email, smtp_endpoint, smtp_port) return {"statusCode": 200, "body": "Email sent successfully."} except Exception as e: logging.error(f"Error: {str(e)}") return {"statusCode": 500, "body": f"Error: {str(e)}"}
-
func.yaml
:schema_version: 20180708 name: oci-cloud-guard-problems version: 0.0.1 runtime: python build_image: fnproject/python:3.9-dev run_image: fnproject/python:3.9 entrypoint: /python/bin/fdk /function/func.py handler memory: 256 config: compartment-id: Provide a compartment ID here to-email: Provide a valid email ID here from-email: Provide the Approved Sender Email ID created in the Email Delivery Service smtp-username-secret-ocid: Provide the SMTP Username Secret OCID smtp-password-secret-ocid: Provide the SMTP Password Secret OCID smtp-endpoint: Provide the SMTP endpoint from the Email Delivery Service smtp-port: 587 cloudguard-access-level: ACCESSIBLE or RESTRICTED
-
requirements.txt
:fdk oci openpyxl
Tarea 5: Programación de la función con el programador de recursos de OCI
La tarea final es utilizar OCI Resource Scheduler para automatizar la ejecución de la función. Esta configuración se puede ejecutar semanalmente o a un intervalo personalizado, lo que garantiza la generación de informes de seguridad oportunos y coherentes. Para obtener más información, consulte Creación de Programas.
-
Para ejecutar la función, introduzca la siguiente información necesaria.
Antes de desplegar la función, recopile los siguientes detalles de configuración. Estas entradas se proporcionarán en el archivo de configuración de funciones (
func.yaml
) o directamente en la consola de OCI, según el método de despliegue.- ID de compartimento: es el ID de arrendamiento donde está activado Oracle Cloud Guard.
- Desde correo electrónico: correo electrónico del remitente aprobado que ha creado en el servicio OCI Email Delivery.
- Para enviar por correo electrónico: dirección de correo electrónico a la que se enviará el informe.
- Punto final SMTP: para buscarlo, vaya a Email Delivery y Configuration.
- Puerto SMTP: normalmente 587 o 25, según lo especificado en la configuración del servicio OCI Email Delivery.
- OCID secreto de nombre de usuario SMTP: OCID del nombre de usuario SMTP, almacenado de forma segura en OCI Vault.
- OCID secreto de contraseña SMTP: OCID de la contraseña SMTP, almacenado de forma segura en OCI Vault.
- Nivel de acceso a Cloud Guard: define el nivel de acceso para los recursos (
ACCESSIBLE
oRESTRICTED
). El valor por defecto esACCESSIBLE
.
-
Obtendremos una salida de ejemplo que es un informe accionable de Oracle Cloud Guard.
Este informe de Oracle Cloud Guard proporciona una visión general estructurada de los problemas de seguridad no resueltos en su entorno de OCI, clasificados por nivel de riesgo. Los detalles críticos como la región, el tipo de recurso, la gravedad y los registros de hora de detección permiten a los equipos de ciberseguridad evaluar y priorizar acciones.
Pasos Siguientes
Los informes automatizados de Oracle Cloud Guard ofrecen a los equipos de ciberseguridad un enfoque optimizado y proactivo para gestionar los riesgos de seguridad en la nube. Las organizaciones pueden recibir informes semanales sobre problemas de seguridad sin resolver con una configuración puntual, categorizada por gravedad y nivel de riesgo. Esta solución aborda la compleja tarea manual de la gestión de seguridad en la nube, lo que permite a los equipos centrarse en la resolución oportuna de problemas en lugar de realizar un seguimiento de los mismos. Para obtener más información sobre el uso de Oracle Cloud Guard y sus capacidades CNAPP, póngase en contacto con su representante de Oracle o consulte Cloud Security Services.
Agradecimientos
- Autor: Aneel Kanuri (arquitecto de nube distinguido)
Más recursos de aprendizaje
Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de formación gratuita en el canal YouTube de Oracle Learning. Además, visita education.oracle.com/learning-explorer para convertirte en un Oracle Learning Explorer.
Para obtener documentación sobre el producto, visite Oracle Help Center.
Send Oracle Cloud Guard Problems through Email using Oracle Cloud Infrastructure Functions
G23232-01
December 2024