Nota
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriverti a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
Invia problemi a Oracle Cloud Guard tramite e-mail utilizzando Oracle Cloud Infrastructure Functions
Introduzione
Oggi, i team di sicurezza informatica di tutti i settori devono affrontare la complessa sfida di mantenere una solida postura della sicurezza affrontando al contempo la natura dinamica degli ambienti cloud. Grazie a innumerevoli risorse, configurazioni e minacce in continua evoluzione, è fondamentale tenere traccia e risolvere tempestivamente i problemi. In Oracle, riconosciamo l'importanza di dotare le organizzazioni di strumenti per semplificare la gestione della sicurezza, aiutandole ad affrontare con successo queste sfide. Oracle Cloud Guard offre solide funzionalità per aiutare le aziende a semplificare la gestione della sicurezza del cloud, passando dalla semplice identificazione delle vulnerabilità alla distribuzione automatica dei problemi tra i team per una risoluzione tempestiva.
Questa esercitazione descrive una soluzione automatizzata che sfrutta i servizi nativi di OCI e consente ai team di sicurezza di ricevere e condividere report dettagliati sulla sicurezza di Oracle Cloud Guard direttamente tramite e-mail. Questo approccio riduce l'intervento manuale, facilita il monitoraggio continuo e garantisce una posizione proattiva nella sicurezza del cloud.
Obiettivo
- Ricevi tutti i problemi aperti di Oracle Cloud Guard in un'e-mail che può essere distribuita ai team appropriati, semplificando il percorso di risoluzione.
Prerequisiti
-
Accesso a una tenancy Oracle Cloud Infrastructure (OCI).
-
Privilegi per gestire Oracle Cloud Guard, OCI Functions, OCI Email Delivery Service, OCI Vault e OCI Resource Scheduler.
Task 1: impostare i criteri richiesti e le autorizzazioni Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)
Ogni componente di questa soluzione deve avere accesso alle risorse OCI con cui interagisce.
-
Criterio scheduler risorse: consente allo scheduler di eseguire la funzione in base a una pianificazione definita. Per ulteriori informazioni vedere Criteri di esempio.
-
Criterio di funzione: concedere l'autorizzazione della funzione per leggere i segreti da OCI Vault e recuperare i problemi di Oracle Cloud Guard. Per ulteriori informazioni, vedere Dettagli per le funzioni.
Task 2: configurare il servizio di consegna e-mail OCI
-
Impostare il servizio OCI Email Delivery creando un indirizzo di posta elettronica Mittente approvato, che verrà utilizzato per inviare i report. Per ulteriori informazioni, vedere Creazione di un mittente approvato.
-
Generare credenziali SMTP (Simple Mail Transfer Protocol) per l'account di posta elettronica creando un utente dedicato con autorizzazioni di accesso SMTP limitate.
-
Creare un utente IAM OCI. Per ulteriori informazioni, vedere Creazione di un utente.
-
Per modificare le funzionalità utente, vedere Modifica delle capacità di un utente.
-
Per creare le credenziali SMTP, vedere Creazione delle credenziali SMTP.
-
Task 3: memorizzare le credenziali SMTP nel vault OCI
Utilizzando OCI Vault, memorizzare in modo sicuro le credenziali SMTP. Ciò aggiunge un ulteriore livello di sicurezza mantenendo le informazioni sensibili al di fuori della funzione.
-
Impostare un vault OCI. Per ulteriori informazioni, vedere Creazione di un vault.
-
Per creare una chiave di cifratura master, vedere Creazione di una chiave di cifratura master.
-
Per creare un segreto, vedere Creazione di un segreto in un vault.
Task 4: Sviluppare e distribuire la funzione
Questa funzione recupera i problemi di postura della sicurezza non risolti rilevati nell'ultimo anno. Formatta i dati in un report strutturato basato su parametri quali il livello di rischio e il tempo di rilevamento, quindi li invia come allegato CSV (valori separati da virgole) tramite e-mail. Per ulteriori informazioni, vedere Distribuzione di una funzione.
Ecco una panoramica dei passaggi principali della funzione:
- Recupera i problemi non risolti da Oracle Cloud Guard.
- Organizza e formatta i problemi in base alla gravità.
- Generare un report CSV e formattare il report.
- Recupera le credenziali SMTP dal vault.
- Inviare l'e-mail ai destinatari designati con CSV come allegato.
Utilizzando le funzionalità delle funzioni serverless di OCI, questo report può essere personalizzato per fornire la massima chiarezza sulle aree di sicurezza critiche per i team di sicurezza informatica.
-
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
Task 5: pianificare la funzione con OCI Resource Scheduler
Il task finale consiste nell'utilizzare OCI Resource Scheduler per automatizzare l'esecuzione della funzione. Questa configurazione può essere eseguita settimanalmente o a intervalli personalizzati, garantendo report di sicurezza tempestivi e coerenti. Per ulteriori informazioni, vedere Creazione di pianificazioni.
-
Per eseguire la funzione, immettere le seguenti informazioni obbligatorie.
Prima di distribuire la funzione, raccogliere i dettagli di configurazione riportati di seguito. Questi input verranno forniti nel file di configurazione della funzione (
func.yaml
) o direttamente nella console OCI, a seconda del metodo di distribuzione.- ID compartimento: questo è l'ID tenancy in cui è abilitato Oracle Cloud Guard.
- Posta elettronica mittente: il messaggio di posta elettronica del mittente approvato creato nel servizio di consegna tramite posta elettronica OCI.
- E-mail - A: l'indirizzo e-mail al quale verrà inviato il report.
- Endpoint SMTP: per trovarlo, andare a Consegna e-mail e Configurazione.
- Porta SMTP: in genere 587 o 25, come specificato nella configurazione del servizio OCI Email Delivery.
- OCID segreto nome utente SMTP: l'OCID per il nome utente SMTP, memorizzato in modo sicuro nel vault OCI.
- OCID segreto password SMTP: l'OCID per la password SMTP, memorizzato in modo sicuro nel vault OCI.
- Livello di accesso Cloud Guard: definisce il livello di accesso per le risorse (
ACCESSIBLE
oRESTRICTED
). L'impostazione predefinita èACCESSIBLE
.
-
Verrà visualizzato un output di esempio che rappresenta un report Oracle Cloud Guard con interazione.
Questo report di Oracle Cloud Guard fornisce una panoramica strutturata dei problemi di sicurezza non risolti nell'ambiente OCI, classificati in base al livello di rischio. Dettagli critici come regione, tipo di risorsa, gravità e indicatori orari di rilevamento consentono ai team di sicurezza informatica di valutare e assegnare priorità alle azioni.
Passi successivi
Il reporting automatizzato di Oracle Cloud Guard offre ai team di sicurezza informatica un approccio semplificato e proattivo alla gestione dei rischi per la sicurezza del cloud. Le organizzazioni possono ricevere report settimanali su problemi di sicurezza non risolti con una configurazione una tantum, suddivisi per gravità e livello di rischio. Questa soluzione affronta il complesso compito manuale della gestione della sicurezza cloud, consentendo ai team di concentrarsi sulla risoluzione tempestiva dei problemi piuttosto che sul monitoraggio dei problemi. Per ulteriori informazioni sull'uso di Oracle Cloud Guard e delle relative funzionalità CNAPP, contatta il tuo rappresentante Oracle o consulta la sezione relativa ai servizi di sicurezza cloud.
Conferme
- Autore - Aneel Kanuri (architetto cloud distinto)
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.
Per la documentazione del prodotto, visita l'Oracle Help Center.
Send Oracle Cloud Guard Problems through Email using Oracle Cloud Infrastructure Functions
G23228-01
December 2024