Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos Básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
Enviar Problemas do Oracle Cloud Guard por E-mail usando o Oracle Cloud Infrastructure Functions
Introdução
Hoje, as equipes de segurança cibernética em todos os setores enfrentam o complexo desafio de manter uma postura de segurança sólida enquanto lidam com a natureza dinâmica dos ambientes de nuvem. Com inúmeros recursos, configurações e ameaças em evolução, rastrear e resolver problemas prontamente é crucial. Na Oracle, reconhecemos a importância de equipar as organizações com ferramentas para agilizar seu gerenciamento de segurança, ajudando-as a enfrentar esses desafios de frente. O Oracle Cloud Guard oferece uma funcionalidade robusta para ajudar as empresas a simplificar o gerenciamento de segurança na nuvem, passando da simples identificação de vulnerabilidades para a distribuição automática de problemas entre as equipes para resolução oportuna.
Este tutorial descreve uma solução automatizada aproveitando os serviços nativos da OCI que permite que as equipes de segurança recebam e compartilhem relatórios detalhados de segurança do Oracle Cloud Guard diretamente por e-mail. Essa abordagem reduz a intervenção manual, facilita o monitoramento contínuo e garante uma postura proativa na segurança da nuvem.
Objetivo
- Receba todos os problemas abertos do Oracle Cloud Guard em um e-mail que pode ser distribuído às equipes apropriadas, simplificando o caminho para a resolução.
Pré-requisitos
-
Acesso a uma tenancy do Oracle Cloud Infrastructure (OCI).
-
Privilégios para gerenciar Oracle Cloud Guard, OCI Functions, serviço OCI Email Delivery, OCI Vault e OCI Resource Scheduler.
Tarefa 1: Configurar as Políticas Necessárias e as Permissões do OCI IAM (Oracle Cloud Infrastructure Identity and Access Management)
Cada componente desta solução deve ter acesso aos recursos do OCI com os quais interage.
-
Política do Programador de Recursos: Permita que o programador execute a função em uma programação definida. Para obter mais informações, consulte Exemplo de Políticas.
-
Política de Função: Conceda a permissão de função para ler segredos do OCI Vault e recuperar problemas do Oracle Cloud Guard. Para obter mais informações, consulte Detalhes do Serviço Functions.
Tarefa 2: Configurar o Serviço OCI Email Delivery
-
Configure o serviço OCI Email Delivery criando um endereço de e-mail do Remetente Aprovado, que será usado para enviar relatórios. Para obter mais informações, consulte Criando um Remetente Aprovado.
-
Gere credenciais SMTP (Simple Mail Transfer Protocol) para a conta de e-mail criando um usuário dedicado com permissões de acesso SMTP limitadas.
-
Criar um usuário do OCI IAM. Para obter mais informações, consulte Criando um Usuário.
-
Para editar recursos do usuário, consulte Editando Recursos de um Usuário.
-
Para criar credenciais SMTP, consulte Criando Credenciais SMTP.
-
Tarefa 3: Armazenar Credenciais SMTP no OCI Vault
Usando o OCI Vault, armazene com segurança as credenciais SMTP. Isso adiciona uma camada extra de segurança, mantendo informações confidenciais fora da função.
-
Configure um Vault do OCI. Para obter mais informações, consulte Criando um Vault.
-
Para criar uma Chave de Criptografia Principal, consulte Criando uma Chave de Criptografia Principal.
-
Para criar um segredo, consulte Criando um Segredo em um Vault.
Tarefa 4: Desenvolver e Implantar a Função
Esta função busca problemas de postura de segurança não resolvidos detectados no ano passado. Ele formata os dados em um relatório estruturado com base em parâmetros como nível de risco e tempo de detecção e, em seguida, os envia como um anexo de valores separados por vírgulas (CSV) por e-mail. Para obter mais informações, consulte Implantando uma função.
Aqui está uma visão geral das etapas da função principal:
- Recupere problemas não resolvidos do Oracle Cloud Guard.
- Organize e formate os problemas com base na gravidade.
- Gere um relatório CSV e formate o relatório.
- Recupere as credenciais SMTP do vault.
- Envie o e-mail para destinatários designados com CSV como anexo.
Usando os recursos de função serverless da OCI, este relatório pode ser personalizado para fornecer clareza máxima sobre áreas críticas de segurança para equipes de segurança cibernética.
-
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
Tarefa 5: Programar a Função com o Programador de Recursos do OCI
A tarefa final é usar o OCI Resource Scheduler para automatizar a execução da função. Essa configuração pode ser executada semanalmente ou em um intervalo personalizado, garantindo relatórios de segurança oportunos e consistentes. Para obter mais informações, consulte Criando agendamentos.
-
Para executar a função, insira as seguintes informações obrigatórias.
Antes de implantar a função, obtenha os seguintes detalhes de configuração. Essas entradas serão fornecidas no arquivo de configuração de função (
func.yaml
) ou diretamente na Console do OCI, dependendo do seu método de implantação.- ID do Compartimento: Este é o ID da tenancy em que o Oracle Cloud Guard está ativado.
- E-mail do Remetente: o e-mail do remetente aprovado que você criou no Serviço OCI Email Delivery.
- E-mail de Destino: O endereço de e-mail para o qual o relatório será enviado.
- Ponto Final SMTP: Para encontrá-lo, vá para Entrega de E-mail e Configuração.
- Porta SMTP: Geralmente, 587 ou 25, conforme especificado na configuração do serviço OCI Email Delivery.
- OCID do Segredo do Nome de Usuário SMTP: O OCID do nome de usuário SMTP, armazenado com segurança no OCI Vault.
- OCID do Segredo da Senha SMTP: O OCID da senha SMTP, armazenado com segurança no OCI Vault.
- Nível de Acesso do Cloud Guard: Define o nível de acesso para recursos (
ACCESSIBLE
ouRESTRICTED
). O padrão éACCESSIBLE
.
-
Obteremos uma saída de amostra que é um relatório acionável do Oracle Cloud Guard.
Este relatório do Oracle Cloud Guard fornece uma visão geral estruturada de problemas de segurança não resolvidos em seu ambiente OCI, categorizados por nível de risco. Detalhes críticos, como região, tipo de recurso, gravidade e timestamps de detecção, permitem que as equipes de segurança cibernética avaliem e priorizem ações.
Próximas Etapas
Os relatórios automatizados do Oracle Cloud Guard oferecem às equipes de segurança cibernética uma abordagem simplificada e proativa para gerenciar os riscos de segurança na nuvem. As organizações podem receber relatórios semanais sobre problemas de segurança não resolvidos com uma configuração única, categorizada por gravidade e nível de risco. Esta solução aborda a tarefa manual complexa do gerenciamento de segurança na nuvem, capacitando as equipes a se concentrarem na resolução oportuna de problemas, em vez de rastrear problemas. Para obter mais informações sobre como usar o Oracle Cloud Guard e seus recursos CNAPP, entre em contato com o representante da Oracle ou consulte Serviços de Segurança na Nuvem.
Confirmações
- Autor - Aneel Kanuri (Arquiteto de Nuvem Distinto)
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Send Oracle Cloud Guard Problems through Email using Oracle Cloud Infrastructure Functions
G23231-01
December 2024