atualizacao
This commit is contained in:
215
python.py
Normal file
215
python.py
Normal file
@@ -0,0 +1,215 @@
|
||||
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<br/>& Segurança Microsoft", style_cover_title))
|
||||
story.append(Spacer(1, 1.5*cm))
|
||||
story.append(Paragraph("<b>Cliente:</b> 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("<b>1. Visão Geral:</b> Avaliação técnica dos ambientes On-Premises, Azure e M365 realizada em 19/01/2026.", style_body))
|
||||
story.append(Paragraph("<b>2. Ponto Forte (Cloud):</b> O ambiente possui um <b>Microsoft Secure Score de 82,13%</b>, superior à média de mercado (43%), indicando excelente maturidade em nuvem.", style_body))
|
||||
story.append(Paragraph("<b>3. Ponto de Atenção (On-Prem):</b> 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("• <b>Autenticação Passwordless:</b> Uso de FIDO2 e Windows Hello, eliminando vetores de ataque baseados em senha.", style_bullet))
|
||||
story.append(Paragraph("• <b>Proteção de Identidade:</b> Bloqueio de senhas fracas no AD Local e proteção contra força bruta ativos.", style_bullet))
|
||||
story.append(Paragraph("• <b>Acesso Condicional:</b> 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. <b>Saneamento do AD:</b> Rotacionar senha da conta KRBTGT e corrigir delegações Kerberos.", style_bullet))
|
||||
story.append(Paragraph("2. <b>Hardening de Servidores:</b> Resolver erros de replicação no SVM42000 e habilitar assinatura LDAP.", style_bullet))
|
||||
story.append(Paragraph("3. <b>Proteção de Endpoints:</b> Aplicar regras de redução de superfície de ataque (ASR) via Intune.", style_bullet))
|
||||
story.append(Paragraph("4. <b>Limpeza Financeira:</b> 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("<b>Recomendação Final:</b> 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)
|
||||
Reference in New Issue
Block a user