from reportlab.lib import colors from reportlab.lib.pagesizes import A4, landscape from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak from reportlab.lib.enums import TA_CENTER, TA_LEFT # 1. Configuração do Arquivo pdf_filename = "Apresentacao_Executiva_FGCOOP.pdf" doc = SimpleDocTemplate(pdf_filename, pagesize=landscape(A4), rightMargin=1*cm, leftMargin=1*cm, topMargin=3.5*cm, bottomMargin=1.5*cm) # 2. Estilos styles = getSampleStyleSheet() # Estilo de Título do Slide style_slide_title = ParagraphStyle( 'SlideTitle', parent=styles['Heading1'], fontSize=24, textColor=colors.HexColor("#003366"), # Azul Corporativo spaceAfter=20, alignment=TA_LEFT ) # Estilo de Corpo do Slide style_body = ParagraphStyle( 'SlideBody', parent=styles['Normal'], fontSize=14, leading=18, spaceAfter=12, textColor=colors.HexColor("#333333") ) # Estilo de Bullet Point style_bullet = ParagraphStyle( 'SlideBullet', parent=style_body, leftIndent=20, bulletIndent=10, firstLineIndent=0, spaceAfter=8 ) # Estilo da Capa (Título Gigante) style_cover_title = ParagraphStyle( 'CoverTitle', parent=styles['Title'], fontSize=36, textColor=colors.white, alignment=TA_CENTER, spaceAfter=20, leading=40 ) style_cover_sub = ParagraphStyle( 'CoverSub', parent=styles['Normal'], fontSize=18, textColor=colors.lightgrey, alignment=TA_CENTER ) # 3. Funções de Layout (Background) def draw_background(canvas, doc): """ Fundo padrão dos slides (Barra azul no topo e rodapé) """ width, height = landscape(A4) # Faixa Azul no Topo canvas.saveState() canvas.setFillColor(colors.HexColor("#003366")) canvas.rect(0, height - 2.5*cm, width, 2.5*cm, fill=1, stroke=0) # Texto do Header (na faixa azul) canvas.setFont("Helvetica-Bold", 16) canvas.setFillColor(colors.white) canvas.drawString(1*cm, height - 1.8*cm, "CLOUD ESSENTIAL | Assessment de Segurança") # Rodapé canvas.setStrokeColor(colors.HexColor("#CCCCCC")) canvas.setLineWidth(1) canvas.line(1*cm, 1*cm, width-1*cm, 1*cm) # Texto do Rodapé canvas.setFont("Helvetica", 10) canvas.setFillColor(colors.gray) canvas.drawString(1*cm, 0.5*cm, "Cliente: FGCOOP") page_num = canvas.getPageNumber() canvas.drawRightString(width-1*cm, 0.5*cm, f"Slide {page_num}") canvas.restoreState() def draw_cover_background(canvas, doc): """ Fundo exclusivo da capa (Azul Total) """ width, height = landscape(A4) canvas.saveState() # Fundo Azul Sólido canvas.setFillColor(colors.HexColor("#003366")) canvas.rect(0, 0, width, height, fill=1, stroke=0) # Elemento decorativo (Círculo sutil) canvas.setFillColor(colors.HexColor("#004080")) canvas.circle(width/2, height/2, 12*cm, fill=1, stroke=0) # Logo simulado no centro inferior canvas.setFont("Helvetica-Bold", 14) canvas.setFillColor(colors.white) canvas.drawCentredString(width/2, 2*cm, "CLOUD ESSENTIAL TECH") canvas.restoreState() # 4. Construção do Conteúdo (Story) story = [] # --- SLIDE 1: CAPA --- story.append(Spacer(1, 4*cm)) story.append(Paragraph("Assessment de Infraestrutura
& Segurança Microsoft", style_cover_title)) story.append(Spacer(1, 1.5*cm)) story.append(Paragraph("Cliente: FGCOOP", style_cover_sub)) story.append(Paragraph("Janeiro 2026", style_cover_sub)) story.append(PageBreak()) # --- SLIDE 2: RESUMO EXECUTIVO --- story.append(Paragraph("Resumo Executivo", style_slide_title)) # Texto com destaque story.append(Paragraph("1. Visão Geral: Avaliação técnica dos ambientes On-Premises, Azure e M365 realizada em 19/01/2026.", style_body)) story.append(Paragraph("2. Ponto Forte (Cloud): O ambiente possui um Microsoft Secure Score de 82,13%, superior à média de mercado (43%), indicando excelente maturidade em nuvem.", style_body)) story.append(Paragraph("3. Ponto de Atenção (On-Prem): A infraestrutura local (AD e Servidores) apresenta riscos críticos que podem comprometer a segurança da nuvem se não tratados.", style_body)) story.append(PageBreak()) # --- SLIDE 3: OTIMIZAÇÃO FINANCEIRA --- story.append(Paragraph("Otimização de Custos (Licenciamento)", style_slide_title)) story.append(Paragraph("Identificamos licenças ativas sem uso ou subutilizadas. Ação imediata recomendada:", style_body)) data_cost = [ ['Produto / Licença', 'Situação Identificada', 'Recomendação'], ['Microsoft 365 Business Basic', '44 Licenças não utilizadas', 'Cancelar ou realocar'], ['Power BI Premium', 'Subutilização de recursos', 'Downgrade para versão Pro'], ['Licenças F1', 'Baixo consumo', 'Revisar necessidade'] ] t_cost = Table(data_cost, colWidths=[7*cm, 8*cm, 8*cm]) t_cost.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#004080")), ('TEXTCOLOR', (0,0), (-1,0), colors.white), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('BOTTOMPADDING', (0,0), (-1,0), 12), ('BACKGROUND', (0,1), (-1,-1), colors.whitesmoke), ('GRID', (0,0), (-1,-1), 1, colors.white), ('ALIGN', (0,0), (-1,-1), 'LEFT'), ('PADDING', (0,0), (-1,-1), 8), ])) story.append(t_cost) story.append(PageBreak()) # --- SLIDE 4: PONTOS FORTES --- story.append(Paragraph("Destaques de Segurança (Pontos Fortes)", style_slide_title)) story.append(Paragraph("A FGCOOP já implementou controles avançados de identidade:", style_body)) story.append(Paragraph("• Autenticação Passwordless: Uso de FIDO2 e Windows Hello, eliminando vetores de ataque baseados em senha.", style_bullet)) story.append(Paragraph("• Proteção de Identidade: Bloqueio de senhas fracas no AD Local e proteção contra força bruta ativos.", style_bullet)) story.append(Paragraph("• Acesso Condicional: Políticas maduras que bloqueiam autenticação legada e validam o risco do login.", style_bullet)) story.append(PageBreak()) # --- SLIDE 5: RISCOS CRÍTICOS --- story.append(Paragraph("Riscos Críticos Identificados", style_slide_title)) story.append(Paragraph("Ativos que requerem intervenção imediata para evitar incidentes:", style_body)) data_risk = [ ['Ativo', 'Nível', 'Impacto Técnico'], ['Servidor SVM42000', 'CRÍTICO 🔴', 'Falha em Replicação, Sites e Certificados KDC'], ['SVMAZDC01 / SVMAWSAD1', 'ALTO 🟠', 'Instabilidade de conectividade e sub-redes'], ['Conta KRBTGT', 'ALTO 🟠', 'Senha nunca rotacionada (Risco de Golden Ticket)'], ['Protocolo NTLM', 'MÉDIO 🟡', 'Protocolo vulnerável ativo na rede interna'] ] t_risk = Table(data_risk, colWidths=[6*cm, 3*cm, 14*cm]) t_risk.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#CC0000")), ('TEXTCOLOR', (0,0), (-1,0), colors.white), ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), ('ALIGN', (0,0), (-1,-1), 'LEFT'), ('GRID', (0,0), (-1,-1), 0.5, colors.grey), ('PADDING', (0,0), (-1,-1), 10), ('BACKGROUND', (0,1), (-1,-1), colors.white), ])) story.append(t_risk) story.append(PageBreak()) # --- SLIDE 6: PLANO DE AÇÃO --- story.append(Paragraph("Plano de Ação: Quick Wins (0-30 Dias)", style_slide_title)) story.append(Paragraph("Ações prioritárias de baixo esforço e alto impacto:", style_body)) story.append(Paragraph("1. Saneamento do AD: Rotacionar senha da conta KRBTGT e corrigir delegações Kerberos.", style_bullet)) story.append(Paragraph("2. Hardening de Servidores: Resolver erros de replicação no SVM42000 e habilitar assinatura LDAP.", style_bullet)) story.append(Paragraph("3. Proteção de Endpoints: Aplicar regras de redução de superfície de ataque (ASR) via Intune.", style_bullet)) story.append(Paragraph("4. Limpeza Financeira: Remover licenças Business Basic ociosas identificadas.", style_bullet)) story.append(PageBreak()) # --- SLIDE 7: CONCLUSÃO --- story.append(Paragraph("Conclusão e Próximos Passos", style_slide_title)) story.append(Paragraph("A FGCOOP está bem posicionada na nuvem (Score 82%), mas possui um 'débito técnico' perigoso na infraestrutura base (On-Premises).", style_body)) story.append(Spacer(1, 1*cm)) story.append(Paragraph("Recomendação Final: Priorizar a estabilização dos servidores de identidade (SVM42000) antes de iniciar novos projetos de inovação.", style_body)) story.append(Spacer(1, 2*cm)) story.append(Paragraph("Documento gerado por Cloud Essential Tech", style_body)) # 5. Gerar PDF doc.build(story, onFirstPage=draw_cover_background, onLaterPages=draw_background)