<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luis Cruz</title>
    <description>The latest articles on DEV Community by Luis Cruz (@luiscruzcwb).</description>
    <link>https://dev.to/luiscruzcwb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1108147%2F45dd1a64-9315-4733-883b-f2f37e3057f0.png</url>
      <title>DEV Community: Luis Cruz</title>
      <link>https://dev.to/luiscruzcwb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luiscruzcwb"/>
    <language>en</language>
    <item>
      <title>The Five Ideals of DevOps: os Cinco Ideais que Sustentam a Transformação DevOps</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Thu, 30 Jul 2026 23:50:01 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/the-five-ideals-of-devops-os-cinco-ideais-que-sustentam-a-transformacao-devops-c24</link>
      <guid>https://dev.to/luiscruzcwb/the-five-ideals-of-devops-os-cinco-ideais-que-sustentam-a-transformacao-devops-c24</guid>
      <description>&lt;p&gt;Toda organização que tenta "fazer DevOps" acaba, cedo ou tarde, comprando um Jenkins, adotando Kubernetes e escrevendo Terraform e mesmo assim continua com deploys arriscados, times sobrecarregados e um MTTR (Mean Time to Recovery) que não sai do lugar. A ferramenta certa não resolve um problema de arquitetura e cultura errada por baixo. É esse o ponto de partida de &lt;strong&gt;The Five Ideals&lt;/strong&gt; (Os Cinco Ideais), um framework conceitual que separa DevOps de "conjunto de ferramentas" e o trata como ele realmente é: uma forma diferente de organizar trabalho, times e sistemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Origem do conceito
&lt;/h2&gt;

&lt;p&gt;Os Cinco Ideais foram apresentados por &lt;strong&gt;Gene Kim&lt;/strong&gt; em &lt;em&gt;The Unicorn Project&lt;/em&gt; (2019), romance técnico que funciona como continuação conceitual de &lt;em&gt;The Phoenix Project&lt;/em&gt; (2013), a obra que popularizou os "Três Caminhos" do DevOps (fluxo, feedback e aprendizagem contínua). Enquanto &lt;em&gt;The Phoenix Project&lt;/em&gt; olha a transformação DevOps pela perspectiva de operações, &lt;em&gt;The Unicorn Project&lt;/em&gt; conta a mesma história pelo lado do desenvolvimento, e os Cinco Ideais nascem justamente da frustração de uma desenvolvedora tentando fazer uma mudança simples em um sistema legado excessivamente acoplado.&lt;/p&gt;

&lt;p&gt;O framework não substitui os Três Caminhos — ele os detalha em princípios mais concretos, fáceis de usar como checklist ao avaliar processos, arquitetura e cultura de um time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Os cinco ideais, resumidos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Ideal&lt;/th&gt;
&lt;th&gt;Em uma frase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Localidade e Simplicidade&lt;/td&gt;
&lt;td&gt;Times mudam sistemas sem depender de dezenas de outros times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Foco, Fluxo e Alegria&lt;/td&gt;
&lt;td&gt;Trabalho acontece sem interrupção constante de contexto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Melhoria do Trabalho Diário&lt;/td&gt;
&lt;td&gt;Tempo é reservado para consertar o processo, não só a entrega&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Segurança Psicológica&lt;/td&gt;
&lt;td&gt;Errar e reportar erro não gera punição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Foco no Cliente&lt;/td&gt;
&lt;td&gt;Toda decisão técnica é avaliada pelo valor que gera para quem usa o produto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Localidade e Simplicidade
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Locality and Simplicity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O ideal descreve o quanto um time consegue fazer uma mudança &lt;strong&gt;sem precisar coordenar, negociar ou esperar&lt;/strong&gt; por outros times. Quanto mais serviços, times e dependências uma mudança simples atravessa, menor a localidade, e maior o risco, o tempo de entrega e a chance de quebrar algo que ninguém previu.&lt;/p&gt;

&lt;p&gt;Uma arquitetura de microsserviços mal desenhada é o exemplo clássico do problema: em vez de reduzir acoplamento, ela às vezes só move o acoplamento do código para a rede, exigindo que uma mudança de negócio toque em cinco ou dez serviços diferentes, cada um com seu próprio time, pipeline e prazo de deploy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Baixa localidade                    Alta localidade
─────────────────                   ────────────────
1 mudança de negócio      →         1 mudança de negócio
   ↓ toca 8 serviços                   ↓ toca 1 serviço
   ↓ 5 times envolvidos                ↓ 1 time envolvido
   ↓ 3 pipelines de deploy             ↓ 1 pipeline de deploy
   ↓ prazo: 3 semanas                  ↓ prazo: 2 dias
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na prática, isso se traduz em decisões arquiteturais concretas: bounded contexts bem definidos (Domain-Driven Design), times de plataforma que expõem self-service em vez de exigir ticket, e a disciplina de perguntar "quantos times essa mudança precisa acionar?" antes de aprovar um desenho técnico.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Foco, Fluxo e Alegria
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Focus, Flow, and Joy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trabalho de engenharia exige estado de fluxo, a concentração profunda que permite resolver um problema complexo de ponta a ponta. Esse estado leva, em média, entre 15 e 20 minutos para ser atingido depois de uma interrupção, segundo os estudos citados no próprio &lt;em&gt;The Unicorn Project&lt;/em&gt;. Um desenvolvedor interrompido a cada 10 minutos por reunião, mensagem urgente ou troca de contexto entre projetos nunca chega a entrar em fluxo — e a sensação de "trabalhei o dia inteiro e não produzi nada" é sintoma direto disso.&lt;/p&gt;

&lt;p&gt;Esse ideal é sobre desenhar o ambiente de trabalho — não só a agenda, mas os próprios sistemas — para proteger esse estado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduzir o número de sistemas que um desenvolvedor precisa tocar para uma tarefa (relação direta com o Ideal 1)&lt;/li&gt;
&lt;li&gt;Ambientes de desenvolvimento e teste que sobem em minutos, não em dias, evitando bloqueio por espera&lt;/li&gt;
&lt;li&gt;Deploys automatizados no lugar de checklists manuais que exigem atenção constante durante o processo&lt;/li&gt;
&lt;li&gt;Proteger blocos de tempo sem reunião para trabalho profundo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado esperado não é só produtividade é "alegria" no sentido literal do termo: satisfação genuína de resolver problemas e ver o trabalho chegar ao cliente, em vez de desgaste com burocracia.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Melhoria do Trabalho Diário
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Improvement of Daily Work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mike Rother, em &lt;em&gt;Toyota Kata&lt;/em&gt;, resume esse ideal em uma frase que Gene Kim cita diretamente: "melhorar o trabalho diário é ainda mais importante do que fazer o trabalho diário em si". Times sob pressão constante de entrega tendem a aceitar processos manuais e ferramentas ruins como "o jeito que as coisas são" e nunca sobra tempo para consertar a causa raiz, só para apagar o incêndio de novo a cada semana.&lt;/p&gt;

&lt;p&gt;Esse ideal exige reservar tempo, de forma explícita e recorrente, para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatizar uma tarefa manual repetitiva (ex.: um passo de deploy ainda feito por script rodado à mão)&lt;/li&gt;
&lt;li&gt;Refatorar um trecho de código ou pipeline que gera atrito toda semana&lt;/li&gt;
&lt;li&gt;Investigar a causa raiz de um problema recorrente, em vez de só contorná-lo de novo
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Exemplo: bloco de tempo reservado no sprint para dívida técnica de processo,&lt;/span&gt;
&lt;span class="c1"&gt;# não só de código&lt;/span&gt;
&lt;span class="na"&gt;sprint_capacity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;feature_work&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;70%&lt;/span&gt;
  &lt;span class="na"&gt;bugs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15%&lt;/span&gt;
  &lt;span class="na"&gt;improvement_of_daily_work&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem esse tempo protegido, o time acumula o que Gene Kim chama de "débito de processo" — o equivalente, em fricção operacional, à dívida técnica no código.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Segurança Psicológica
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Psychological Safety&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Termo cunhado pela pesquisadora Amy Edmondson, de Harvard, e confirmado como o fator mais determinante de times de alta performance pelo Project Aristotle do Google. Significa que um profissional pode admitir um erro, questionar uma decisão de alguém mais sênior ou levantar um problema em produção &lt;strong&gt;sem medo de retaliação&lt;/strong&gt; — e isso é o que determina se um problema é reportado cedo, quando é barato de corrigir, ou escondido até virar incidente grave.&lt;/p&gt;

&lt;p&gt;A prática mais associada a esse ideal em times DevOps é o &lt;strong&gt;blameless postmortem&lt;/strong&gt;: análise pós-incidente cujo objetivo é entender a cadeia de causas sistêmicas por que o sistema permitiu que aquele erro humano causasse dano em vez de identificar quem errou.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Postmortem com culpa&lt;/th&gt;
&lt;th&gt;Blameless postmortem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Quem fez o deploy sem revisar?"&lt;/td&gt;
&lt;td&gt;"Por que o pipeline permitiu deploy sem revisão obrigatória?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foco em punir o indivíduo&lt;/td&gt;
&lt;td&gt;Foco em corrigir o sistema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Próximo incidente similar é escondido&lt;/td&gt;
&lt;td&gt;Próximo incidente similar é reportado imediatamente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Segurança psicológica não é ausência de padrão de qualidade — é a garantia de que o erro, quando acontece, vira aprendizado para todo o time em vez de motivo de punição individual.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Foco no Cliente
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Customer Focus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O ideal final é o critério de desempate para todos os outros: toda decisão técnica precisa ser avaliada pelo valor que gera para quem usa o produto — não pela elegância da solução ou pela preferência tecnológica do time. Gene Kim chama de "trabalho de vaidade técnica" (&lt;em&gt;vanity engineering work&lt;/em&gt;) qualquer esforço que consome tempo de engenharia sem gerar valor perceptível para o cliente final: reescrever um serviço estável só para adotar uma stack mais nova, otimizar uma rota que ninguém usa, ou construir uma camada de abstração para um requisito hipotético.&lt;/p&gt;

&lt;p&gt;Times orientados por esse ideal costumam medir o próprio trabalho por métricas que conectam entrega técnica a resultado de negócio — não só uptime e velocidade de deploy, mas retenção, satisfação e tempo até o cliente perceber valor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como os cinco ideais se conectam às práticas DevOps
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ideal&lt;/th&gt;
&lt;th&gt;Onde aparece na prática&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Localidade e Simplicidade&lt;/td&gt;
&lt;td&gt;Arquitetura de microsserviços, bounded contexts, self-service de infraestrutura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foco, Fluxo e Alegria&lt;/td&gt;
&lt;td&gt;Pipeline CI/CD automatizado, ambientes de desenvolvimento efêmeros, redução de reuniões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Melhoria do Trabalho Diário&lt;/td&gt;
&lt;td&gt;Tempo de sprint reservado para automação e dívida de processo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segurança Psicológica&lt;/td&gt;
&lt;td&gt;Blameless postmortems, cultura de code review sem julgamento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foco no Cliente&lt;/td&gt;
&lt;td&gt;Priorização por métrica de negócio, redução de MTTR como indicador de confiabilidade percebida pelo usuário&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Não é coincidência que os cinco apareçam juntos: um pipeline de deploy automatizado (Ideal 2) só existe porque alguém teve tempo reservado para construí-lo (Ideal 3); e esse tempo só é bem investido se a arquitetura por trás permite mudanças localizadas (Ideal 1). Os ideais se reforçam entre si — fraquejar em um tende a corroer os demais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Boas práticas para aplicar os Cinco Ideais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use os ideais como checklist de arquitetura&lt;/strong&gt;, não só de cultura — ao desenhar um novo serviço, pergunte quantos times ele vai exigir para uma mudança simples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meça interrupção, não só velocity&lt;/strong&gt; — quantidade de trocas de contexto por dia é um indicador tão relevante quanto story points entregues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proteja o tempo de melhoria do trabalho diário no planejamento&lt;/strong&gt;, com percentual fixo de capacidade, não como "se sobrar tempo"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audite se os postmortems da sua empresa são realmente blameless&lt;/strong&gt; — se a pergunta "quem fez isso?" aparece antes de "por que o sistema permitiu isso?", a segurança psicológica só existe no papel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revise backlog técnico com a pergunta do Ideal 5&lt;/strong&gt; — se a resposta para "que valor isso gera para o cliente?" for vaga, é sinal de trabalho de vaidade técnica&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Os Cinco Ideais não são um framework de implementação com passo a passo, e essa é justamente a força deles: funcionam como lente para diagnosticar por que uma transformação DevOps travou, mesmo depois de a empresa ter comprado todas as ferramentas certas. Um time pode ter Kubernetes, pipeline de CI/CD e observabilidade completa e ainda assim sofrer com deploys lentos e arriscados, se a arquitetura por trás força alta dependência entre times (Ideal 1) ou se o medo de errar mantém problemas escondidos até virarem incidente (Ideal 4).&lt;/p&gt;

&lt;p&gt;Antes de comprar a próxima ferramenta, vale revisar os cinco ideais contra o processo atual do seu time: qual deles está mais fraco hoje é, quase sempre, a resposta para por que a transformação DevOps não está entregando o resultado esperado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kim, Gene. &lt;em&gt;The Unicorn Project&lt;/em&gt; (2019) — IT Revolution Press&lt;/li&gt;
&lt;li&gt;Kim, Gene; Behr, Kevin; Spafford, George. &lt;em&gt;The Phoenix Project&lt;/em&gt; (2013) — IT Revolution Press&lt;/li&gt;
&lt;li&gt;Rother, Mike. &lt;em&gt;Toyota Kata&lt;/em&gt; (2009) — McGraw-Hill&lt;/li&gt;
&lt;li&gt;Edmondson, Amy. &lt;em&gt;The Fearless Organization&lt;/em&gt; (2018) — Wiley&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>culture</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>DevOps na Prática: Como Reduzir Problemas com Servidores e Rede</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Thu, 23 Jul 2026 19:48:21 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/devops-na-pratica-como-reduzir-problemas-com-servidores-e-rede-91a</link>
      <guid>https://dev.to/luiscruzcwb/devops-na-pratica-como-reduzir-problemas-com-servidores-e-rede-91a</guid>
      <description>&lt;p&gt;Servidor caindo às três da manhã, rede instável derrubando uma transação em produção, deploy que funcionava em homologação e quebra tudo ao subir — quem já passou uma madrugada resolvendo esse tipo de incidente sabe que boa parte desses problemas não é falta de sorte, é falta de processo. A maioria das instabilidades de infraestrutura tem uma causa raiz recorrente: configuração manual, ausência de monitoramento proativo e deploys sem plano de rollback.&lt;/p&gt;

&lt;p&gt;DevOps não é uma ferramenta específica nem um cargo, é um conjunto de práticas que ataca exatamente esses pontos, unindo automação, observabilidade e colaboração entre quem desenvolve e quem opera a infraestrutura. Este artigo detalha as principais estratégias para reduzir problemas com servidores e rede usando DevOps, com exemplos práticos de configuração para cada uma.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral das estratégias
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frente&lt;/th&gt;
&lt;th&gt;Objetivo&lt;/th&gt;
&lt;th&gt;Ferramentas comuns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Automação de infraestrutura&lt;/td&gt;
&lt;td&gt;Eliminar configuração manual e divergência entre ambientes&lt;/td&gt;
&lt;td&gt;Terraform, Ansible, Jenkins, GitLab CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoramento e logging&lt;/td&gt;
&lt;td&gt;Detectar problemas antes que virem incidente&lt;/td&gt;
&lt;td&gt;Prometheus, Grafana, ELK Stack, Datadog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalabilidade e resiliência&lt;/td&gt;
&lt;td&gt;Absorver picos de carga e falhas sem downtime&lt;/td&gt;
&lt;td&gt;Docker, Kubernetes, Load Balancers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gestão de configuração e deployments&lt;/td&gt;
&lt;td&gt;Reduzir o raio de impacto de uma mudança ruim&lt;/td&gt;
&lt;td&gt;Canary/Blue-Green, imagens imutáveis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colaboração e cultura&lt;/td&gt;
&lt;td&gt;Encurtar o tempo entre "algo quebrou" e "está resolvido"&lt;/td&gt;
&lt;td&gt;Runbooks, on-call, postmortems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segurança e conformidade&lt;/td&gt;
&lt;td&gt;Achar vulnerabilidade antes que vire incidente de segurança&lt;/td&gt;
&lt;td&gt;Snyk, Aqua, HashiCorp Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Automação de infraestrutura
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Infraestrutura como Código (IaC)
&lt;/h3&gt;

&lt;p&gt;Servidor configurado manualmente é o principal motivo de "funciona no meu ambiente, mas não em produção". Cada alteração feita via SSH, sem registro, cria uma divergência que ninguém consegue reproduzir depois. A Infraestrutura como Código resolve isso descrevendo o estado desejado do ambiente em arquivos versionados, o mesmo código que provisiona um servidor de homologação provisiona o de produção, sem intervenção manual.&lt;/p&gt;

&lt;p&gt;Terraform, Ansible, Chef e Puppet cobrem esse espaço com abordagens diferentes: Terraform é declarativo e brilha em provisionamento de recursos de nuvem; Ansible é mais simples de aprender e cobre bem configuração de servidores já provisionados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ami-0c55b159cbfafe1f0"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.medium"&lt;/span&gt;

  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Name&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web-server"&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;lifecycle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;create_before_destroy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_lb_target_group_attachment"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;target_group_arn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_lb_target_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;
  &lt;span class="nx"&gt;target_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;port&lt;/span&gt;             &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pipeline CI/CD
&lt;/h3&gt;

&lt;p&gt;Sem pipeline automatizado, cada deploy depende de alguém lembrar todos os passos manuais, rodar teste, gerar build, copiar arquivo, reiniciar serviço. É nesse processo manual que surgem os erros que derrubam produção. Um pipeline de CI/CD com Jenkins, GitLab CI/CD ou CircleCI garante que toda mudança passe pelas mesmas etapas de teste e validação antes de chegar ao servidor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;

&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;npm run test&lt;/span&gt;

&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker build -t registry.exemplo.com/app:$CI_COMMIT_SHA .&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker push registry.exemplo.com/app:$CI_COMMIT_SHA&lt;/span&gt;

&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kubectl set image deployment/app app=registry.exemplo.com/app:$CI_COMMIT_SHA&lt;/span&gt;
  &lt;span class="na"&gt;only&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Monitoramento e logging
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Monitoramento contínuo
&lt;/h3&gt;

&lt;p&gt;Boa parte dos incidentes de servidor e rede só é percebida quando o cliente reclama, o que significa que o problema já está afetando produção há minutos ou horas. Ferramentas como Prometheus, Grafana, Nagios e Datadog monitoram métricas de CPU, memória, latência de rede e disponibilidade em tempo real, disparando alertas antes que o problema escale.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;node-exporter'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;servidor-web-01:9100'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;servidor-web-02:9100'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blackbox-http'&lt;/span&gt;
    &lt;span class="na"&gt;metrics_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/probe&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;http_2xx&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://app.exemplo.com'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;relabel_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source_labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;__address__&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;target_label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;__param_target&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;target_label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;__address__&lt;/span&gt;
        &lt;span class="na"&gt;replacement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;blackbox-exporter:9115&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Centralização de logs
&lt;/h3&gt;

&lt;p&gt;Investigar um incidente de rede sem logs centralizados significa entrar servidor por servidor procurando o que aconteceu — em uma arquitetura com dezenas de containers, isso é inviável. ELK Stack (Elasticsearch, Logstash, Kibana), Graylog e Splunk coletam logs de todos os componentes em um único lugar, permitindo correlacionar um erro de aplicação com um evento de rede acontecendo no mesmo segundo.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Escalabilidade e resiliência
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Infraestrutura escalável
&lt;/h3&gt;

&lt;p&gt;Servidor único sobrecarregado é causa clássica de indisponibilidade em picos de tráfego. Containers com Docker e orquestração com Kubernetes permitem escalabilidade horizontal, em vez de aumentar a capacidade de um único servidor (escalabilidade vertical, que tem limite físico), o sistema soma mais instâncias conforme a demanda cresce.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;autoscaling/v2&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HorizontalPodAutoscaler&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-hpa&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scaleTargetRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
  &lt;span class="na"&gt;minReplicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;maxReplicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Resource&lt;/span&gt;
      &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cpu&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Utilization&lt;/span&gt;
          &lt;span class="na"&gt;averageUtilization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;70&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Arquitetura resiliente
&lt;/h3&gt;

&lt;p&gt;Balanceadores de carga distribuem tráfego entre múltiplas instâncias, evitando que a falha de um único servidor derrube o serviço inteiro. Combinado com failover automático e replicação de dados, o sistema continua respondendo mesmo com um nó fora do ar. O padrão &lt;strong&gt;Circuit Breaker&lt;/strong&gt; complementa essa resiliência: quando um serviço dependente começa a falhar repetidamente, o circuito "abre" e para de enviar requisições para ele por um tempo, evitando que uma falha em cascata derrube toda a cadeia de serviços.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Gestão de configuração e deployments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Configuração imutável
&lt;/h3&gt;

&lt;p&gt;Servidor que recebe patches e ajustes manuais ao longo de meses acumula um estado que ninguém mais consegue reproduzir do zero, o clássico "servidor de estimação" que todo time tem medo de reiniciar. A prática de configuração imutável resolve isso tratando servidores como descartáveis: em vez de corrigir um servidor com problema, ele é destruído e recriado a partir de uma imagem base atualizada e testada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployments Canary e Blue-Green
&lt;/h3&gt;

&lt;p&gt;Subir uma versão nova diretamente para 100% dos usuários é apostar que não vai dar problema. Estratégias de deployment reduzem esse risco:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Estratégia&lt;/th&gt;
&lt;th&gt;Como funciona&lt;/th&gt;
&lt;th&gt;Quando usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blue-Green&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ambiente novo (green) sobe em paralelo ao atual (blue); tráfego migra de uma vez após validação&lt;/td&gt;
&lt;td&gt;Mudanças grandes, rollback precisa ser instantâneo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nova versão recebe uma fatia pequena do tráfego (ex.: 5%), que aumenta gradualmente se não houver erro&lt;/td&gt;
&lt;td&gt;Mudanças de risco incerto, quer validar com usuários reais antes de expandir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl argo rollouts &lt;span class="nb"&gt;set &lt;/span&gt;image app &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;registry.exemplo.com/app:v2
kubectl argo rollouts get rollout app &lt;span class="nt"&gt;--watch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Colaboração e cultura
&lt;/h2&gt;

&lt;p&gt;Automação e monitoramento resolvem o lado técnico, mas incidente que se repete porque ninguém documentou a causa raiz é problema de processo, não de ferramenta. Cultura DevOps significa que desenvolvimento e operações compartilham a responsabilidade pela infraestrutura em produção, em vez de "jogar o código por cima do muro" para um time de infra separado.&lt;/p&gt;

&lt;p&gt;Duas práticas concretas sustentam isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postmortem sem culpados&lt;/strong&gt;: todo incidente relevante gera um documento com linha do tempo, causa raiz e ações de prevenção — sem apontar culpado individual, para que o time reporte problemas sem medo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop de feedback contínuo&lt;/strong&gt;: métricas de produção (erros, latência, uso de recursos) voltam para o time de desenvolvimento como insumo de priorização, não só como alarme de incêndio&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Segurança e conformidade
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Segurança integrada (DevSecOps)
&lt;/h3&gt;

&lt;p&gt;Vulnerabilidade encontrada em produção custa muito mais para corrigir do que uma encontrada no pipeline, antes do deploy. DevSecOps integra a análise de segurança diretamente no CI/CD, ferramentas como Snyk, Clair e Aqua escaneiam código, dependências e imagens de container automaticamente a cada build, bloqueando o deploy se encontrarem uma vulnerabilidade crítica.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;security-scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snyk test --severity-threshold=high&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;snyk container test registry.exemplo.com/app:$CI_COMMIT_SHA&lt;/span&gt;
  &lt;span class="na"&gt;allow_failure&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conformidade e auditoria
&lt;/h3&gt;

&lt;p&gt;Toda mudança de infraestrutura aplicada via IaC e pipeline já fica registrada em controle de versão, quem mudou, o quê e quando. Isso, por si só, resolve boa parte do trabalho de auditoria que antes dependia de planilha e memória de quem fez a mudança.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ferramentas e tecnologias por categoria
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Ferramentas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Jenkins, GitLab CI, CircleCI, Travis CI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infraestrutura como Código&lt;/td&gt;
&lt;td&gt;Terraform, Ansible, Chef, Puppet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers e orquestração&lt;/td&gt;
&lt;td&gt;Docker, Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoramento e logging&lt;/td&gt;
&lt;td&gt;Prometheus, Grafana, ELK Stack, Datadog, Graylog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gerenciamento de configuração distribuída&lt;/td&gt;
&lt;td&gt;Consul, Etcd, Zookeeper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segurança&lt;/td&gt;
&lt;td&gt;Snyk, Clair, Aqua, HashiCorp Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Boas práticas e troubleshooting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comece pelo monitoramento, não pela automação mais sofisticada&lt;/strong&gt; — sem visibilidade do que está acontecendo, é impossível saber se a automação está resolvendo o problema certo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versione toda configuração de infraestrutura&lt;/strong&gt;, mesmo mudanças pequenas — o histórico do Git é o primeiro lugar a olhar quando algo quebra depois de um deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste o rollback antes de precisar dele&lt;/strong&gt; — pipeline que só testa o caminho feliz do deploy costuma falhar justamente na hora em que o rollback é necessário&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alerta demais é tão ruim quanto alerta de menos&lt;/strong&gt; — times que recebem centenas de alertas por dia passam a ignorá-los; calibre thresholds para que um alerta signifique ação real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evite scripts de configuração "só até resolvermos isso direito"&lt;/strong&gt; — esse tipo de gambiarra manual é justamente o que a configuração imutável e a IaC existem para eliminar&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Reduzir problemas com servidores e rede não depende de uma ferramenta mágica, mas da combinação de automação de infraestrutura, monitoramento contínuo, arquitetura resiliente e uma cultura em que desenvolvimento e operações dividem a responsabilidade pelo que está em produção. Cada uma das seis frentes descritas aqui ataca uma causa raiz específica de incidente — configuração manual, falta de visibilidade, ponto único de falha, deploy sem plano de rollback, silos entre equipes e vulnerabilidade não tratada.&lt;/p&gt;

&lt;p&gt;O ponto de partida não precisa ser a adoção completa de Kubernetes e um pipeline elaborado no primeiro mês. Comece identificando qual dessas causas gera mais incidentes no seu ambiente hoje, e ataque essa frente primeiro, o restante se constrói de forma incremental a partir daí.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>monitoring</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>CSPM, CWPP e CNAPP: o que cada sigla protege na sua nuvem e como se relacionam</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Wed, 15 Jul 2026 00:57:06 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/cspm-cwpp-e-cnapp-o-que-cada-sigla-protege-na-sua-nuvem-e-como-se-relacionam-4jgo</link>
      <guid>https://dev.to/luiscruzcwb/cspm-cwpp-e-cnapp-o-que-cada-sigla-protege-na-sua-nuvem-e-como-se-relacionam-4jgo</guid>
      <description>&lt;p&gt;Uma empresa que roda workloads em AWS, Azure ou GCP costuma acumular, sem perceber, três problemas de segurança diferentes ao mesmo tempo: um bucket S3 público que ninguém lembra de ter criado, uma imagem de container com uma CVE crítica rodando em produção há meses, e nenhuma visibilidade real de como esses dois problemas se conectam a um caminho de ataque. O mercado de segurança em nuvem batizou cada uma dessas frentes com uma sigla própria, &lt;strong&gt;CSPM&lt;/strong&gt;, &lt;strong&gt;CWPP&lt;/strong&gt; e &lt;strong&gt;CNAPP&lt;/strong&gt; e é comum confundir uma com a outra, ou tratar como três ferramentas concorrentes quando, na prática, a mais recente das três nasceu para unificar as outras duas.&lt;/p&gt;

&lt;p&gt;Este artigo explica o que cada sigla significa, para que serve, como usar na prática e como elas se encaixam quando combinadas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral rápida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sigla&lt;/th&gt;
&lt;th&gt;Nome completo&lt;/th&gt;
&lt;th&gt;Foco&lt;/th&gt;
&lt;th&gt;O que responde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSPM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Security Posture Management&lt;/td&gt;
&lt;td&gt;Configuração da infraestrutura em nuvem&lt;/td&gt;
&lt;td&gt;"Minha nuvem está configurada de forma segura?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CWPP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Workload Protection Platform&lt;/td&gt;
&lt;td&gt;Proteção do que roda dentro da nuvem (VM, container, serverless)&lt;/td&gt;
&lt;td&gt;"O que está rodando dentro da minha carga de trabalho é seguro?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CNAPP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud-Native Application Protection Platform&lt;/td&gt;
&lt;td&gt;Unificação de CSPM + CWPP + outras camadas&lt;/td&gt;
&lt;td&gt;"Qual é o meu risco real, do código à execução?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Repare que CSPM e CWPP olham para dois lados diferentes do mesmo ambiente — um olha a &lt;strong&gt;configuração ao redor&lt;/strong&gt; do workload, o outro olha &lt;strong&gt;o que roda dentro&lt;/strong&gt; dele — e o CNAPP surgiu justamente para juntar essas duas vistas (e outras) em uma plataforma só.&lt;/p&gt;




&lt;h2&gt;
  
  
  CSPM: postura de configuração da nuvem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;O termo foi cunhado pelo Gartner por volta de 2019, mas o problema é mais antigo: com a migração em massa para IaaS, times passaram a provisionar infraestrutura via console ou API em minutos, sem o mesmo processo de revisão que existia em datacenter próprio. O resultado recorrente eram erros de configuração — bucket de storage público, security group liberado para &lt;code&gt;0.0.0.0/0&lt;/code&gt;, banco de dados sem criptografia, chave de IAM com privilégio excessivo. Pesquisas do setor apontam configuração incorreta, não exploração de vulnerabilidade de software, como a causa mais comum de incidente em nuvem. O CSPM nasceu para automatizar a detecção contínua desse tipo de erro, que antes dependia de checklist manual ou auditoria pontual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;Uma ferramenta de CSPM conecta via API de leitura (read-only) às contas de nuvem do cliente (AWS, Azure, GCP, e às vezes Kubernetes gerenciado) e varre continuamente a configuração de cada recurso contra um conjunto de regras — benchmarks como &lt;strong&gt;CIS Benchmarks&lt;/strong&gt;, controles de &lt;strong&gt;PCI-DSS&lt;/strong&gt;, &lt;strong&gt;ISO 27001&lt;/strong&gt; ou frameworks próprios do provedor. Entre o que ela cobre:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Exemplo de verificação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exposição de rede&lt;/td&gt;
&lt;td&gt;Security group ou NSG liberando porta administrativa (22, 3389, 3306) para a internet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Bucket S3, Azure Blob ou GCS com acesso público não intencional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Criptografia&lt;/td&gt;
&lt;td&gt;Volume EBS, banco RDS ou disco sem criptografia em repouso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IAM&lt;/td&gt;
&lt;td&gt;Usuário ou role com política &lt;code&gt;*:*&lt;/code&gt;, MFA desabilitado, chave de acesso não rotacionada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logging/auditoria&lt;/td&gt;
&lt;td&gt;CloudTrail, Activity Log ou Cloud Audit Logs desabilitado em alguma região/projeto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance&lt;/td&gt;
&lt;td&gt;Mapeamento automático da configuração atual contra CIS, PCI-DSS, HIPAA, LGPD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A saída típica é um painel com findings priorizados por severidade, muitas vezes com &lt;strong&gt;remediação automática&lt;/strong&gt; (auto-fix) ou geração de ticket para o time responsável. Ferramentas conhecidas nessa categoria: &lt;strong&gt;Wiz&lt;/strong&gt;, &lt;strong&gt;Prisma Cloud&lt;/strong&gt;, &lt;strong&gt;Microsoft Defender for Cloud&lt;/strong&gt;, &lt;strong&gt;AWS Security Hub&lt;/strong&gt;, &lt;strong&gt;Orca Security&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático
&lt;/h3&gt;

&lt;p&gt;Um time sobe um bucket S3 para armazenar exports temporários de relatório e, por engano, deixa a política de bucket com &lt;code&gt;Principal: "*"&lt;/code&gt;. Sem CSPM, esse bucket fica exposto até alguém notar manualmente ou até aparecer em um scan externo de terceiros. Com CSPM rodando, a ferramenta detecta a mudança de configuração em minutos (via CloudTrail ou varredura periódica), classifica como severidade crítica por conter dados sensíveis, e dispara alerta ou já reverte a política automaticamente, dependendo da regra configurada.&lt;/p&gt;




&lt;h2&gt;
  
  
  CWPP: proteção da carga de trabalho
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;O termo também é do Gartner, um pouco mais antigo que CSPM (por volta de 2018), evoluindo do conceito tradicional de proteção de servidor (antivírus, EDR) adaptado para o mundo de nuvem híbrida. A motivação: CSPM garante que a &lt;em&gt;configuração ao redor&lt;/em&gt; do workload está correta, mas não olha para dentro da VM, do container ou da função serverless, não detecta um processo malicioso rodando, uma imagem de container com vulnerabilidade conhecida, ou um binário malicioso plantado por um atacante que já obteve acesso inicial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;CWPP protege a carga de trabalho em si, ao longo de todo o ciclo de vida, do build ao runtime e normalmente cobre múltiplos tipos de workload sob uma mesma plataforma:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de workload&lt;/th&gt;
&lt;th&gt;O que o CWPP cobre&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Máquinas virtuais&lt;/td&gt;
&lt;td&gt;Hardening de SO, detecção de malware, EDR, gestão de patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Scan de vulnerabilidade de imagem, verificação de configuração do Dockerfile, proteção em runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;Políticas de admissão, detecção de comportamento anômalo em pod, segmentação de rede entre namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless (Lambda, Cloud Functions)&lt;/td&gt;
&lt;td&gt;Análise de permissões da função, detecção de código malicioso injetado, proteção de dependências&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As capacidades típicas se dividem em duas fases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antes do deploy (shift-left)&lt;/strong&gt;: scan de imagem de container em pipeline CI/CD, análise de IaC (Terraform, CloudFormation) antes do apply, verificação de dependências vulneráveis (SCA — Software Composition Analysis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durante a execução (runtime)&lt;/strong&gt;: monitoramento de comportamento do processo, detecção de escalonamento de privilégio, bloqueio de conexão de rede anômala, integridade de arquivo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ferramentas conhecidas: &lt;strong&gt;Aqua Security&lt;/strong&gt;, &lt;strong&gt;Sysdig&lt;/strong&gt;, &lt;strong&gt;Falco&lt;/strong&gt; (open source, focado em runtime), &lt;strong&gt;Trivy&lt;/strong&gt; (open source, focado em scan de imagem), &lt;strong&gt;CrowdStrike Falcon Cloud Security&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático
&lt;/h3&gt;

&lt;p&gt;Uma imagem de container publicada há seis meses usa uma versão do OpenSSL com uma CVE crítica divulgada na semana passada. O CWPP, ao reavaliar continuamente o inventário de imagens em uso (não só no momento do build), identifica que essa imagem específica está rodando em produção, calcula o risco combinando severidade da CVE com exposição real (a aplicação recebe tráfego externo?) e prioriza a remediação, algo que um scan único feito só no pipeline de CI, sem revarredura contínua, jamais pegaria depois do deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  CNAPP: a unificação das duas camadas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;Por volta de 2021, o Gartner formalizou o termo &lt;strong&gt;CNAPP&lt;/strong&gt; reconhecendo um problema prático: empresas estavam comprando uma ferramenta de CSPM, outra de CWPP, mais uma de scan de IaC, outra de gestão de segredo, e mais uma de gestão de identidade em nuvem (CIEM), cada uma com console próprio, sem correlação entre os achados. Um finding de CSPM ("esse security group está aberto") e um finding de CWPP ("essa VM tem uma vulnerabilidade crítica") não conversavam entre si, mesmo quando, juntos, formavam um caminho de ataque real e explorável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;CNAPP é uma &lt;strong&gt;plataforma consolidada&lt;/strong&gt; que integra, no mínimo, CSPM e CWPP sob um único data model, e tipicamente soma outras camadas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente incorporado&lt;/th&gt;
&lt;th&gt;O que adiciona&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSPM&lt;/td&gt;
&lt;td&gt;Postura de configuração de infraestrutura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWPP&lt;/td&gt;
&lt;td&gt;Proteção de workload (VM, container, serverless)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CIEM (Cloud Infrastructure Entitlement Management)&lt;/td&gt;
&lt;td&gt;Análise de permissões excessivas de identidades humanas e de máquina&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IaC scanning&lt;/td&gt;
&lt;td&gt;Verificação de Terraform/CloudFormation/Bicep antes do deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KSPM (Kubernetes Security Posture Management)&lt;/td&gt;
&lt;td&gt;Postura de configuração específica de cluster Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secrets scanning&lt;/td&gt;
&lt;td&gt;Detecção de credencial exposta em código ou imagem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSPM (Data Security Posture Management)&lt;/td&gt;
&lt;td&gt;Descoberta e classificação de dado sensível espalhado pela nuvem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O diferencial real de um CNAPP não é só "ter tudo isso na mesma assinatura" é a &lt;strong&gt;correlação entre camadas&lt;/strong&gt; para priorizar risco por caminho de ataque real, em vez de uma lista plana de milhares de findings isolados. Um bucket com dado sensível exposto (DSPM), acessível por uma role com permissão excessiva (CIEM), rodando atrás de uma VM com uma CVE crítica e exposta à internet (CWPP + CSPM), é um &lt;strong&gt;caminho de ataque completo&lt;/strong&gt; e é isso que um CNAPP maduro mostra graficamente, priorizando esse combo acima de mil alertas isolados de baixo risco.&lt;/p&gt;

&lt;p&gt;Ferramentas conhecidas: &lt;strong&gt;Wiz&lt;/strong&gt;, &lt;strong&gt;Prisma Cloud (Palo Alto)&lt;/strong&gt;, &lt;strong&gt;Microsoft Defender for Cloud&lt;/strong&gt;, &lt;strong&gt;Orca Security&lt;/strong&gt;, &lt;strong&gt;CrowdStrike Falcon Cloud Security&lt;/strong&gt;, &lt;strong&gt;Aqua Security&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo prático
&lt;/h3&gt;

&lt;p&gt;Retomando os dois exemplos anteriores: o bucket S3 mal configurado e a imagem de container vulnerável, isoladamente, geram dois alertas médios em ferramentas separadas o tipo de alerta que se acumula em uma fila e nunca é tratado com urgência. Em um CNAPP, o motor de correlação identifica que a role IAM usada pela aplicação vulnerável tem permissão de leitura sobre esse mesmo bucket. O resultado não são dois findings soltos: é um único alerta crítico descrevendo o caminho completo — "atacante explora CVE na imagem X, herda a role Y, acessa dado sensível no bucket Z" — com prioridade muito mais alta do que qualquer um dos dois problemas isolados sugeriria.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como as três siglas se relacionam
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;CSPM&lt;/th&gt;
&lt;th&gt;CWPP&lt;/th&gt;
&lt;th&gt;CNAPP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O que protege&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configuração da infraestrutura em nuvem&lt;/td&gt;
&lt;td&gt;O workload em execução (VM, container, função)&lt;/td&gt;
&lt;td&gt;Ambos, mais camadas adicionais (CIEM, DSPM, IaC, secrets)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Momento de atuação&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contínuo, pós-deploy (e cada vez mais pré-deploy via IaC scan)&lt;/td&gt;
&lt;td&gt;Build (shift-left) e runtime&lt;/td&gt;
&lt;td&gt;Do código ao runtime, ciclo completo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unidade de análise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recurso de nuvem (bucket, security group, role)&lt;/td&gt;
&lt;td&gt;Processo, imagem, container, função&lt;/td&gt;
&lt;td&gt;Caminho de ataque correlacionado entre recursos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nasce de&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Necessidade de detectar erro de configuração em escala&lt;/td&gt;
&lt;td&gt;Necessidade de estender EDR/antivírus para nuvem&lt;/td&gt;
&lt;td&gt;Necessidade de unificar CSPM + CWPP + ferramentas correlatas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Substitui as outras?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Tipicamente incorpora ambas em uma única plataforma&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Uma forma simples de visualizar: &lt;strong&gt;CSPM olha a casa&lt;/strong&gt; (portas e janelas trancadas, alarme ligado), &lt;strong&gt;CWPP olha quem está dentro da casa&lt;/strong&gt; (processos e comportamento), e &lt;strong&gt;CNAPP é o painel único que junta as duas vistas&lt;/strong&gt; e ainda soma outras câmeras (identidade, dado sensível, segredo) para mostrar o caminho de invasão completo, não só os pontos fracos isolados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como usar na prática
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Comece com CSPM se a maturidade em nuvem é baixa&lt;/strong&gt; — é o retorno mais rápido: a maioria dos ambientes tem erro de configuração crítico esperando para ser encontrado, e a implantação costuma ser só leitura via API, sem agente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adicione CWPP onde há workload sensível&lt;/strong&gt; — containers e VMs expostos à internet, ou que processam dado regulado, justificam agente de runtime além da varredura de configuração&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integre scan de IaC no pipeline antes do deploy&lt;/strong&gt; — encontrar o security group mal configurado no &lt;code&gt;terraform plan&lt;/code&gt;, antes do &lt;code&gt;apply&lt;/code&gt;, é ordens de magnitude mais barato do que corrigir depois de exposto em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avalie CNAPP quando a organização já opera CSPM e CWPP separados e sofre com alert fatigue&lt;/strong&gt; — a consolidação só compensa quando o time já tem findings suficientes para precisar de correlação; para um ambiente pequeno, CSPM isolado pode ser suficiente por um bom tempo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priorize por caminho de ataque, não por severidade isolada&lt;/strong&gt; — uma CVE crítica em uma máquina isolada, sem exposição de rede e sem dado sensível, é bem menos urgente que uma CVE média em uma máquina exposta com acesso a dado regulado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não trate como substituto de WAF, SIEM ou pentest&lt;/strong&gt; — CSPM/CWPP/CNAPP cobrem postura e workload de nuvem, não substituem proteção de borda de aplicação nem resposta a incidente formal&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Não deixe alertas de CSPM acumular sem triagem&lt;/strong&gt; — ambientes recém-conectados costumam gerar milhares de findings; comece filtrando por severidade crítica/alta e exposição pública antes de tentar zerar tudo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use as regras de CIS Benchmark como ponto de partida&lt;/strong&gt;, não como lista definitiva — adapte exceções documentadas para casos legítimos (ex: bucket público de assets estáticos de um site)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integre o CWPP à pipeline de CI/CD&lt;/strong&gt;, não só ao runtime — bloquear build com CVE crítica antes do deploy é mais barato do que caçar a imagem já rodando em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine CIEM com CSPM/CWPP sempre que possível&lt;/strong&gt; — permissão excessiva é o fator que transforma uma vulnerabilidade isolada em um caminho de ataque completo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revise a política de auto-remediação com cuidado&lt;/strong&gt; — corrigir automaticamente uma configuração de produção sem revisão humana pode causar indisponibilidade; comece com alerta e evolua para remediação automática só em regras bem testadas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;Resposta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CSPM detecta vulnerabilidade dentro de um container?&lt;/td&gt;
&lt;td&gt;Não — isso é função de CWPP. CSPM olha a configuração do ambiente ao redor, não o conteúdo do workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preciso de CWPP se uso só serviços gerenciados (managed services)?&lt;/td&gt;
&lt;td&gt;Em menor grau — o provedor cuida da infraestrutura subjacente, mas funções serverless e containers que você mesmo publica ainda têm código e dependências que precisam de verificação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CNAPP substitui completamente CSPM e CWPP separados?&lt;/td&gt;
&lt;td&gt;Na prática, sim — a maioria dos fornecedores de CNAPP oferece os módulos de CSPM e CWPP dentro da mesma plataforma, com a vantagem adicional da correlação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ferramentas open source como Trivy e Falco competem com CNAPP comercial?&lt;/td&gt;
&lt;td&gt;Cobrem pedaços específicos (scan de imagem, detecção de runtime) muito bem e sem custo de licença, mas não entregam a correlação entre camadas nem o painel de gestão unificado de um CNAPP comercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qual sigla é mais importante para começar?&lt;/td&gt;
&lt;td&gt;Depende do maior risco do ambiente: se a preocupação é configuração exposta, CSPM primeiro; se é código/imagem vulnerável rodando, CWPP primeiro; times maduros tendem a convergir para CNAPP de qualquer forma&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;CSPM, CWPP e CNAPP não competem entre si — são camadas que evoluíram para cobrir ângulos diferentes do mesmo problema. CSPM garante que a configuração da infraestrutura em nuvem está correta. CWPP garante que o que roda dentro dessa infraestrutura — VM, container, função — está livre de vulnerabilidade e comportamento malicioso. E CNAPP surgiu para unificar as duas vistas (e outras, como CIEM e DSPM) em uma plataforma só, com o benefício real de correlacionar findings isolados em caminhos de ataque priorizáveis.&lt;/p&gt;

&lt;p&gt;Antes de sair comprando uma plataforma de CNAPP completa, vale mapear onde está o maior risco real do seu ambiente hoje — configuração exposta, workload vulnerável, ou falta de correlação entre os dois — e usar isso para decidir por onde começar.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.gartner.com/en/documents" rel="noopener noreferrer"&gt;Gartner: Market Guide for Cloud-Native Application Protection Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisecurity.org/cis-benchmarks" rel="noopener noreferrer"&gt;CIS Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aquasecurity/trivy" rel="noopener noreferrer"&gt;Trivy (scanner open source de vulnerabilidade)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://falco.org/" rel="noopener noreferrer"&gt;Falco (detecção de runtime open source)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/security-hub/" rel="noopener noreferrer"&gt;AWS Security Hub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>cloud</category>
      <category>devops</category>
      <category>cnapp</category>
    </item>
    <item>
      <title>PCI-DSS, ISO 27001, ISO 27701 e ISO 27018: o que cada um cobre e como se relacionam</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Mon, 13 Jul 2026 13:59:42 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/pci-dss-iso-27001-iso-27701-e-iso-27018-o-que-cada-um-cobre-e-como-se-relacionam-1c8d</link>
      <guid>https://dev.to/luiscruzcwb/pci-dss-iso-27001-iso-27701-e-iso-27018-o-que-cada-um-cobre-e-como-se-relacionam-1c8d</guid>
      <description>&lt;p&gt;Uma empresa que processa pagamento com cartão, guarda dado de cliente e roda tudo em nuvem pública recebe, com frequência, quatro pedidos de auditoria diferentes: o adquirente de cartão cobrando conformidade com PCI-DSS, o cliente enterprise pedindo certificado ISO 27001, o jurídico perguntando sobre ISO 27701 por causa da LGPD, e o provedor de nuvem citando ISO 27018 no contrato. É comum o time de segurança tratar isso como quatro projetos separados, quando na prática são camadas que se apoiam umas nas outras — e boa parte do trabalho feito para uma serve de base para as outras três.&lt;/p&gt;

&lt;p&gt;Este artigo explica o que cada uma dessas normas cobre, para que serve, quem precisa de cada uma e como elas se encaixam quando aplicadas juntas.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral rápida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Norma&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Foco&lt;/th&gt;
&lt;th&gt;Órgão responsável&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PCI-DSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Padrão de conformidade obrigatório (não é ISO)&lt;/td&gt;
&lt;td&gt;Proteção de dados de cartão de pagamento&lt;/td&gt;
&lt;td&gt;PCI Security Standards Council&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISO/IEC 27001&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Norma internacional certificável&lt;/td&gt;
&lt;td&gt;Sistema de Gestão de Segurança da Informação (SGSI/ISMS)&lt;/td&gt;
&lt;td&gt;ISO/IEC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISO/IEC 27701&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Norma certificável (independente desde a revisão 2026)&lt;/td&gt;
&lt;td&gt;Sistema de Gestão de Privacidade da Informação (PIMS)&lt;/td&gt;
&lt;td&gt;ISO/IEC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISO/IEC 27018&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Código de prática (não certificável isoladamente)&lt;/td&gt;
&lt;td&gt;Proteção de dados pessoais em nuvem pública&lt;/td&gt;
&lt;td&gt;ISO/IEC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Repare que só a PCI-DSS não é uma norma ISO — ela nasceu de um consórcio das bandeiras de cartão, não do comitê de padronização internacional. As outras três pertencem à mesma família (a série ISO/IEC 27000) e foram desenhadas para se complementar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atualização (revisão 2026):&lt;/strong&gt; até então, a ISO 27701 só podia ser certificada como extensão de uma ISO 27001 já certificada. Com a revisão de 2026, ela passa a ser uma norma independente — uma empresa pode certificar seu Sistema de Gestão de Privacidade da Informação (PIMS) sem precisar ter ou implementar a 27001 junto. Isso não muda o fato de que as duas continuam extremamente complementares na prática (ver seção da ISO 27701 abaixo).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  PCI-DSS: proteção de dados de cartão
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;PCI-DSS&lt;/strong&gt; (Payment Card Industry Data Security Standard) nasceu em 2004/2006 quando as principais bandeiras de cartão — Visa, Mastercard, American Express, Discover e JCB — perceberam que cada uma tinha seu próprio programa de segurança, e comerciantes que aceitavam múltiplas bandeiras precisavam seguir requisitos diferentes e conflitantes para a mesma transação. As bandeiras se uniram e criaram o &lt;strong&gt;PCI Security Standards Council (PCI SSC)&lt;/strong&gt;, unificando essas exigências em um único padrão. A motivação prática por trás disso foi a onda de vazamentos de dados de cartão do início dos anos 2000, como o caso da TJX Companies, que expôs dezenas de milhões de números de cartão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;O PCI-DSS define &lt;strong&gt;12 requisitos técnicos e operacionais&lt;/strong&gt; obrigatórios para qualquer organização que armazena, processa ou transmite dados de titular de cartão (PAN — Primary Account Number, dados da trilha magnética, CVV, etc.):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requisito&lt;/th&gt;
&lt;th&gt;Resumo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;td&gt;Firewall configurado e sem senhas padrão de fabricante&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3–4&lt;/td&gt;
&lt;td&gt;Proteção de dados de cartão armazenados e em trânsito (criptografia)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–6&lt;/td&gt;
&lt;td&gt;Antivírus/anti-malware e desenvolvimento seguro de aplicações&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7–8&lt;/td&gt;
&lt;td&gt;Controle de acesso por necessidade de uso e autenticação forte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Restrição de acesso físico aos dados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Rastreamento e monitoramento de todo acesso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Testes de segurança regulares (scans de vulnerabilidade, pentest)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Política de segurança da informação formalizada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Diferente das normas ISO, PCI-DSS &lt;strong&gt;não é uma certificação opcional&lt;/strong&gt; — é uma exigência contratual imposta pelas bandeiras e adquirentes. O nível de rigor da validação (SAQ auto-declarado ou auditoria formal por um QSA — Qualified Security Assessor) depende do volume de transações processadas por ano.&lt;/p&gt;




&lt;h2&gt;
  
  
  ISO/IEC 27001: gestão de segurança da informação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;A ISO/IEC 27001 tem origem no &lt;strong&gt;BS 7799&lt;/strong&gt;, um padrão britânico de segurança da informação publicado pela BSI (British Standards Institution) em 1995. A parte 2 desse padrão, focada em como implementar um sistema de gestão, foi adotada pela ISO em 2005 e se tornou a ISO/IEC 27001. Passou por revisões relevantes em 2013 e na versão mais atual, 2022, que reorganizou os controles do Anexo A.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;Diferente da PCI-DSS, que é prescritiva e focada em um tipo específico de dado (cartão), a &lt;strong&gt;ISO 27001 é um framework de gestão&lt;/strong&gt;, agnóstico ao tipo de negócio. Ela não diz exatamente "use criptografia AES-256"; ela exige que a organização estabeleça um &lt;strong&gt;SGSI (Sistema de Gestão de Segurança da Informação)&lt;/strong&gt; — um ciclo contínuo de identificar riscos, aplicar controles proporcionais a esses riscos, e melhorar com o tempo (o clássico PDCA: Plan-Do-Check-Act).&lt;/p&gt;

&lt;p&gt;Os controles de referência ficam no &lt;strong&gt;Anexo A&lt;/strong&gt; (hoje alinhado à ISO/IEC 27002), organizados em quatro temas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema do Anexo A&lt;/th&gt;
&lt;th&gt;Exemplos de controle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Organizacional&lt;/td&gt;
&lt;td&gt;Política de segurança, gestão de fornecedores, resposta a incidentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pessoas&lt;/td&gt;
&lt;td&gt;Contratação, treinamento, encerramento de acesso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Físico&lt;/td&gt;
&lt;td&gt;Controle de acesso a datacenters e escritórios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tecnológico&lt;/td&gt;
&lt;td&gt;Criptografia, backup, segmentação de rede, logging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A certificação ISO 27001 é feita por um organismo certificador acreditado, com auditoria de recertificação a cada três anos e auditorias de manutenção anuais.&lt;/p&gt;




&lt;h2&gt;
  
  
  ISO/IEC 27701: gestão de privacidade
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;Publicada em 2019, a ISO/IEC 27701 surgiu da pressão crescente por conformidade com leis de proteção de dados como o &lt;strong&gt;GDPR&lt;/strong&gt; europeu e, no Brasil, a &lt;strong&gt;LGPD&lt;/strong&gt;. Antes dela, empresas certificadas em ISO 27001 tinham uma base sólida de segurança, mas nada que endereçasse formalmente obrigações específicas de privacidade — como direitos do titular dos dados, base legal para tratamento, ou o papel de controlador versus operador.&lt;/p&gt;

&lt;p&gt;Na versão original de 2019, a norma nasceu desenhada como &lt;strong&gt;extensão&lt;/strong&gt; da ISO 27001/27002: só era possível certificar o PIMS (Privacy Information Management System) como um adendo de escopo sobre um SGSI já certificado. A &lt;strong&gt;revisão de 2026&lt;/strong&gt; muda esse desenho — a ISO 27701 passa a ser publicada como norma &lt;strong&gt;independente&lt;/strong&gt;, com sua própria estrutura de requisitos, deixando de depender de uma certificação 27001 prévia ou simultânea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;Com a revisão 2026, a ISO 27701 &lt;strong&gt;não depende mais da ISO 27001&lt;/strong&gt; para ser certificada — uma organização pode implementar e certificar seu Sistema de Gestão de Privacidade da Informação (PIMS) de forma autônoma, sem precisar ter ou estar implementando a 27001 junto. Na prática, porém, as duas normas continuam extremamente complementares: como a 27701 herda boa parte da estrutura de gestão de riscos e controles da 27001/27002, empresas que já têm um SGSI implementado aproveitam grande parte do trabalho ao adicionar a camada de privacidade — só que agora essa combinação é uma opção estratégica, não um pré-requisito obrigatório.&lt;/p&gt;

&lt;p&gt;Ela adiciona controles como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identificação da base legal para cada tratamento de dado pessoal&lt;/li&gt;
&lt;li&gt;Processos para atender direitos do titular (acesso, correção, exclusão, portabilidade)&lt;/li&gt;
&lt;li&gt;Distinção clara de responsabilidades entre &lt;strong&gt;PII Controller&lt;/strong&gt; (quem decide a finalidade do tratamento) e &lt;strong&gt;PII Processor&lt;/strong&gt; (quem trata em nome de outro)&lt;/li&gt;
&lt;li&gt;Avaliação de impacto à privacidade (equivalente ao DPIA do GDPR ou RIPD da LGPD)&lt;/li&gt;
&lt;li&gt;Gestão de consentimento e de transferência internacional de dados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para uma empresa brasileira, a ISO 27701 funciona como evidência estruturada de conformidade com a LGPD, mesmo a norma não citando a lei diretamente — os controles mapeiam de forma bem próxima.&lt;/p&gt;




&lt;h2&gt;
  
  
  ISO/IEC 27018: privacidade em nuvem pública
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como e por que surgiu
&lt;/h3&gt;

&lt;p&gt;Publicada em 2014 (revisada em 2019), a ISO/IEC 27018 respondeu a uma lacuna específica: a ISO 27002 tinha controles genéricos de segurança, mas nenhum tratava da situação particular de um &lt;strong&gt;provedor de nuvem pública que processa dados pessoais em nome de seus clientes&lt;/strong&gt; — ou seja, quando o provedor é o &lt;em&gt;processor&lt;/em&gt; e o cliente é o &lt;em&gt;controller&lt;/em&gt;. A adoção em massa de AWS, Azure e Google Cloud ao longo dos anos 2010 tornou essa lacuna crítica: sem um padrão específico, cada contrato de nuvem tratava a proteção de PII de um jeito diferente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;A ISO 27018 é um &lt;strong&gt;código de prática&lt;/strong&gt;, não uma norma certificável por si só — ela estende os controles da ISO 27002 com diretrizes adicionais voltadas especificamente a provedores de nuvem que atuam como processadores de PII. Entre os pontos que ela cobre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O provedor de nuvem só pode usar os dados pessoais do cliente para os fins contratados, nunca para publicidade própria sem consentimento explícito&lt;/li&gt;
&lt;li&gt;Transparência sobre em quais países/subcontratados os dados são processados&lt;/li&gt;
&lt;li&gt;Notificação ao cliente em caso de acesso não autorizado ou solicitação legal de terceiros&lt;/li&gt;
&lt;li&gt;Direito do cliente de recuperar ou apagar seus dados ao encerrar o contrato&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na prática, quem busca essa certificação (normalmente combinada com a 27001, como um adendo de escopo) são os &lt;strong&gt;provedores de nuvem, SaaS e serviços de hospedagem&lt;/strong&gt; — não a empresa cliente final. Se sua empresa contrata AWS ou Azure, o que você quer ver é o certificado ISO 27018 &lt;em&gt;deles&lt;/em&gt;, como evidência de que tratam os dados dos seus usuários com o cuidado esperado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como as quatro normas se relacionam
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PCI-DSS&lt;/th&gt;
&lt;th&gt;ISO 27001&lt;/th&gt;
&lt;th&gt;ISO 27701&lt;/th&gt;
&lt;th&gt;ISO 27018&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;O que protege&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dados de cartão de pagamento&lt;/td&gt;
&lt;td&gt;Ativos de informação em geral&lt;/td&gt;
&lt;td&gt;Dados pessoais (PII) em geral&lt;/td&gt;
&lt;td&gt;Dados pessoais (PII) especificamente em nuvem pública&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depende de outra norma?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Independente&lt;/td&gt;
&lt;td&gt;Independente (é a base)&lt;/td&gt;
&lt;td&gt;Independente desde a revisão 2026 (mas complementa a 27001/27002 na prática)&lt;/td&gt;
&lt;td&gt;Sim, estende a 27002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quem certifica/valida&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QSA ou autoavaliação (SAQ)&lt;/td&gt;
&lt;td&gt;Organismo certificador acreditado&lt;/td&gt;
&lt;td&gt;Organismo certificador acreditado&lt;/td&gt;
&lt;td&gt;Geralmente incluída no escopo de auditoria da 27001 do provedor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Obrigatória ou voluntária&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Obrigatória por contrato com bandeiras/adquirente&lt;/td&gt;
&lt;td&gt;Voluntária (mas cada vez mais exigida por clientes B2B)&lt;/td&gt;
&lt;td&gt;Voluntária&lt;/td&gt;
&lt;td&gt;Voluntária, relevante sobretudo para provedores de nuvem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Papel típico de quem certifica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Comerciante ou processador de pagamento&lt;/td&gt;
&lt;td&gt;Qualquer organização&lt;/td&gt;
&lt;td&gt;Controller e/ou Processor de dados pessoais&lt;/td&gt;
&lt;td&gt;Processor de PII atuando como provedor de nuvem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Uma forma simples de visualizar a pilha: a &lt;strong&gt;ISO 27001 é a fundação&lt;/strong&gt; (gestão de segurança da informação como um todo). A &lt;strong&gt;ISO 27701 pode rodar de forma independente&lt;/strong&gt; desde a revisão 2026, mas continua se apoiando conceitualmente na 27001/27002 para adicionar controles de privacidade — a maioria das empresas ainda opta por certificar as duas juntas por causa da sobreposição de controles. A &lt;strong&gt;ISO 27018 se apoia na 27002&lt;/strong&gt; para o caso específico de provedores de nuvem. E a &lt;strong&gt;PCI-DSS roda em paralelo&lt;/strong&gt;, como uma trilha independente e obrigatória sempre que há dado de cartão envolvido — mesmo que a empresa já tenha as três certificações ISO.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quem precisa de cada uma
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perfil da empresa&lt;/th&gt;
&lt;th&gt;Normas relevantes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce que processa pagamento com cartão&lt;/td&gt;
&lt;td&gt;PCI-DSS obrigatório; ISO 27001 recomendada para maturidade geral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS B2B que lida com dados de clientes corporativos&lt;/td&gt;
&lt;td&gt;ISO 27001 quase sempre exigida em processo de venda enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empresa que trata dados pessoais de usuários finais (qualquer app com cadastro)&lt;/td&gt;
&lt;td&gt;ISO 27701 relevante para evidenciar conformidade com LGPD/GDPR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provedor de nuvem, hosting ou infraestrutura como serviço&lt;/td&gt;
&lt;td&gt;ISO 27018 relevante como diferencial de confiança para clientes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fintech ou gateway de pagamento&lt;/td&gt;
&lt;td&gt;Todas as quatro, dependendo do escopo de dados e de nuvem usada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Exemplo prático: um SaaS de e-commerce
&lt;/h2&gt;

&lt;p&gt;Imagine uma plataforma de e-commerce SaaS, hospedada em nuvem pública, que processa pagamento via cartão e armazena dados de clientes dos seus lojistas.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PCI-DSS&lt;/strong&gt;: obrigatório porque a plataforma processa transações de cartão. Mesmo se o processamento do cartão em si for terceirizado a um gateway (reduzindo o escopo via tokenização), a plataforma ainda precisa validar conformidade com os requisitos que sobram no seu ambiente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISO 27001&lt;/strong&gt;: a plataforma implementa um SGSI cobrindo toda a operação — desenvolvimento, infraestrutura, RH, fornecedores. Vira pré-requisito comum em propostas comerciais de clientes maiores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISO 27701&lt;/strong&gt;: como a plataforma trata dados pessoais de consumidores finais (nome, endereço, e-mail) em nome dos lojistas, ela atua como &lt;strong&gt;Processor&lt;/strong&gt;. A extensão de privacidade formaliza como esses dados são protegidos e como direitos do titular são atendidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ISO 27018&lt;/strong&gt;: se essa plataforma, além de SaaS, também oferece infraestrutura para terceiros hospedarem aplicações (um cenário IaaS/PaaS), essa certificação vira relevante para o próprio provedor de nuvem que ela usa (AWS/Azure/GCP) — e é isso que ela deve exigir contratualmente do fornecedor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O ponto central: &lt;strong&gt;as quatro normas não competem entre si&lt;/strong&gt; — cada uma cobre uma fatia diferente do mesmo problema (proteger dado sensível), e a sobreposição de controles entre elas (gestão de acesso, criptografia, resposta a incidente) significa que implementar a ISO 27001 primeiro reduz bastante o esforço para as demais.&lt;/p&gt;




&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comece pela ISO 27001&lt;/strong&gt; se ainda não tem nenhuma base de governança de segurança — mesmo com a 27701 sendo independente desde 2026, a sobreposição de controles faz o SGSI da 27001 acelerar bastante a implementação do PIMS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não trate PCI-DSS como algo à parte&lt;/strong&gt; — mapeie os controles que já existem no SGSI (controle de acesso, logging, resposta a incidente) contra os 12 requisitos, a sobreposição costuma passar de 60%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduza o escopo de PCI-DSS com tokenização&lt;/strong&gt; — delegar a captura e armazenamento do cartão a um gateway (Stripe, Adyen, etc.) reduz drasticamente o que precisa ser auditado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peça o certificado ISO 27018 do seu provedor de nuvem&lt;/strong&gt;, não tente certificar sua própria empresa nessa norma a menos que você também seja um provedor de infraestrutura&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mantenha uma matriz de controles cruzada&lt;/strong&gt; — uma planilha simples relacionando cada controle das quatro normas evita retrabalho em auditorias e evidências duplicadas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Perguntas frequentes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pergunta&lt;/th&gt;
&lt;th&gt;Resposta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Preciso ser ISO 27001 antes de fazer ISO 27701?&lt;/td&gt;
&lt;td&gt;Não mais — desde a revisão 2026 a ISO 27701 é uma norma independente. Antes disso, a certificação era emitida como extensão de escopo de uma 27001 já certificada ou em processo de certificação conjunta; hoje isso é uma opção estratégica, não um requisito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCI-DSS substitui a ISO 27001?&lt;/td&gt;
&lt;td&gt;Não — PCI-DSS cobre só dado de cartão; ISO 27001 cobre segurança da informação como um todo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minha empresa pequena precisa de tudo isso?&lt;/td&gt;
&lt;td&gt;Depende do que ela processa. Uma loja pequena que usa um gateway de pagamento pronto pode ter escopo de PCI-DSS mínimo (SAQ A); ISO 27701/27018 só fazem sentido se há tratamento relevante de PII ou oferta de infraestrutura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISO 27018 é uma certificação própria?&lt;/td&gt;
&lt;td&gt;Não isoladamente — é um código de prática auditado como extensão de escopo dentro de uma certificação ISO 27001/27002&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LGPD exige ISO 27701?&lt;/td&gt;
&lt;td&gt;Não exige formalmente, mas a norma é hoje a forma mais reconhecida de evidenciar conformidade estruturada com a lei&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;PCI-DSS, ISO 27001, ISO 27701 e ISO 27018 não são quatro auditorias concorrentes disputando o tempo do time de segurança — são camadas complementares que protegem tipos diferentes de dado sensível, com graus diferentes de obrigatoriedade. A ISO 27001 estabelece a fundação de gestão de segurança; a ISO 27701 — independente desde a revisão 2026, mas ainda fortemente complementar a ela — cobre a camada de privacidade; a ISO 27018 endereça o caso específico de provedores de nuvem tratando PII de terceiros; e a PCI-DSS roda à parte, como exigência contratual sempre que há dado de cartão envolvido.&lt;/p&gt;

&lt;p&gt;Antes de sair atrás de todas ao mesmo tempo, mapeie qual dado sensível sua empresa realmente processa e em que papel (controller, processor, comerciante, provedor de infraestrutura) — isso já reduz bastante a lista do que de fato se aplica.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pcisecuritystandards.org/" rel="noopener noreferrer"&gt;PCI Security Standards Council&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iso.org/standard/27001" rel="noopener noreferrer"&gt;ISO/IEC 27001:2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iso.org/standard/71670.html" rel="noopener noreferrer"&gt;ISO/IEC 27701:2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iso.org/standard/76559.html" rel="noopener noreferrer"&gt;ISO/IEC 27018:2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gov.br/cidadania/pt-br/acesso-a-informacao/lgpd" rel="noopener noreferrer"&gt;Lei Geral de Proteção de Dados (LGPD)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>compliance</category>
      <category>privacy</category>
      <category>iso</category>
    </item>
    <item>
      <title>Conventional Commits: Guia Completo para Padronizar suas Mensagens de Commit</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Fri, 10 Jul 2026 14:45:37 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/conventional-commits-guia-completo-para-padronizar-suas-mensagens-de-commit-2i3o</link>
      <guid>https://dev.to/luiscruzcwb/conventional-commits-guia-completo-para-padronizar-suas-mensagens-de-commit-2i3o</guid>
      <description>&lt;p&gt;Abra o histórico de commits de qualquer projeto que já passou por várias mãos e você vai encontrar de tudo: &lt;code&gt;"fix"&lt;/code&gt;, &lt;code&gt;"ajustes"&lt;/code&gt;, &lt;code&gt;"correção final"&lt;/code&gt;, &lt;code&gt;"correção final 2"&lt;/code&gt;, &lt;code&gt;"wip"&lt;/code&gt;. Nenhuma dessas mensagens diz o que mudou, por que mudou, ou se quebra algo. O resultado prático: gerar um changelog vira trabalho manual, descobrir quando um bug foi introduzido vira arqueologia, e decidir se a próxima versão é &lt;code&gt;1.2.0&lt;/code&gt; ou &lt;code&gt;2.0.0&lt;/code&gt; vira palpite.&lt;/p&gt;

&lt;p&gt;É esse o problema que o &lt;strong&gt;Conventional Commits&lt;/strong&gt; resolve: uma convenção leve para escrever mensagens de commit de um jeito que tanto humanos quanto máquinas conseguem interpretar, permitindo automatizar changelog, versionamento semântico e até gatilhos de CI a partir do próprio histórico do Git.&lt;/p&gt;

&lt;p&gt;Este artigo cobre a origem da especificação, para que ela serve, sua estrutura formal e exemplos práticos do dia a dia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como e por que surgiu
&lt;/h2&gt;

&lt;p&gt;O Conventional Commits nasceu da observação de que vários projetos open source já usavam, de forma independente, convenções parecidas para prefixar mensagens de commit. O &lt;a href="https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit" rel="noopener noreferrer"&gt;Angular Commit Message Guidelines&lt;/a&gt; é a referência mais citada como origem direta do formato. A ideia central do Angular era simples: prefixar cada commit com um tipo (&lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;...) para que uma ferramenta pudesse gerar o &lt;code&gt;CHANGELOG.md&lt;/code&gt; automaticamente, sem depender de alguém escrever isso manualmente a cada release.&lt;/p&gt;

&lt;p&gt;A especificação &lt;strong&gt;Conventional Commits 1.0.0&lt;/strong&gt; consolidou essa prática em um padrão formal, documentado e versionado, inspirado também no &lt;a href="https://semver.org/lang/pt-BR/" rel="noopener noreferrer"&gt;SemVer&lt;/a&gt;, com o qual se integra diretamente (mais sobre isso adiante). Hoje é mantida como projeto aberto em &lt;a href="https://www.conventionalcommits.org/pt-br/v1.0.0/" rel="noopener noreferrer"&gt;conventionalcommits.org&lt;/a&gt;, com traduções para várias línguas, incluindo português.&lt;/p&gt;




&lt;h2&gt;
  
  
  Para que serve
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Necessidade&lt;/th&gt;
&lt;th&gt;Como o Conventional Commits ajuda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gerar changelog automaticamente&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ferramentas leem o histórico e montam o &lt;code&gt;CHANGELOG.md&lt;/code&gt; sem intervenção manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Determinar a próxima versão semântica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fix&lt;/code&gt; sugere PATCH, &lt;code&gt;feat&lt;/code&gt; sugere MINOR, &lt;code&gt;BREAKING CHANGE&lt;/code&gt; sugere MAJOR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comunicar a natureza da mudança ao time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quem revisa o PR já sabe se é bug, feature ou refatoração antes de abrir o diff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disparar builds e pipelines automaticamente&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CI pode decidir se publica um pacote, dispara um deploy ou pula uma etapa com base no tipo de commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilitar contribuição em projetos abertos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduz a barreira para quem nunca contribuiu entender como categorizar a própria mudança&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Na prática, o ganho não é estético, é que o histórico do Git passa a ser &lt;strong&gt;dado estruturado&lt;/strong&gt;, não só texto livre, e dá para automatizar em cima dele.&lt;/p&gt;




&lt;h2&gt;
  
  
  Estrutura da mensagem
&lt;/h2&gt;

&lt;p&gt;O formato básico definido pela especificação é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;tipo&amp;gt;[escopo opcional]: &amp;lt;descrição&amp;gt;

[corpo opcional]

[rodapé(s) opcional(is)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Os tipos mais usados
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Quando usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nova funcionalidade (correlaciona com MINOR no SemVer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Correção de bug (correlaciona com PATCH no SemVer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mudança apenas em documentação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Formatação, espaços, ponto e vírgula, sem mudança de lógica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mudança de código que não corrige bug nem adiciona feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;perf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mudança que melhora performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adição ou correção de testes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mudança no sistema de build ou dependências externas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ci&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mudança em arquivos e scripts de CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tarefas de manutenção que não afetam código de produção&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;A especificação define oficialmente apenas &lt;code&gt;feat&lt;/code&gt; e &lt;code&gt;fix&lt;/code&gt; como obrigatórios para a relação com SemVer. Os demais tipos (baseados na convenção do Angular) são uma extensão amplamente adotada, mas o time pode ajustar a lista conforme a necessidade do projeto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Exemplos práticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Commit simples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat: adiciona endpoint de exportação de relatórios em PDF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Commit com escopo
&lt;/h3&gt;

&lt;p&gt;O escopo (entre parênteses) indica qual parte do código foi afetada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(auth): corrige expiração prematura do token JWT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(checkout): adiciona suporte a pagamento via Pix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Commit com corpo explicando o contexto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(api): corrige timeout em requisições de upload grandes

O timeout estava fixo em 30s independente do tamanho do arquivo.
Agora o timeout escala proporcionalmente ao tamanho do payload,
com um teto máximo de 5 minutos.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Commit com breaking change
&lt;/h3&gt;

&lt;p&gt;Uma mudança que quebra compatibilidade é sinalizada com &lt;code&gt;!&lt;/code&gt; após o tipo/escopo, ou com o rodapé &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; os dois podem ser usados juntos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(api)!: remove suporte ao endpoint /v1/users

BREAKING CHANGE: o endpoint /v1/users foi descontinuado.
Use /v2/users, que retorna o campo `email` como obrigatório.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse commit, por conter &lt;code&gt;BREAKING CHANGE&lt;/code&gt;, indica que a próxima versão deve ser um &lt;strong&gt;MAJOR&lt;/strong&gt; no versionamento semântico (ex: &lt;code&gt;2.4.1&lt;/code&gt; → &lt;code&gt;3.0.0&lt;/code&gt;), independente de conter também um &lt;code&gt;feat&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Commit apenas de manutenção
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chore: atualiza dependências de dev para as versões mais recentes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Múltiplos rodapés
&lt;/h3&gt;

&lt;p&gt;Rodapés seguem o mesmo formato de trailers do Git (chave: valor), e podem referenciar issues, coautores ou revisores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(payments): corrige arredondamento incorreto no cálculo de juros

Refs: #482
Reviewed-by: Ana Costa
Co-authored-by: João Silva &amp;lt;joao@example.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Relação com Versionamento Semântico (SemVer)
&lt;/h2&gt;

&lt;p&gt;A especificação foi desenhada para mapear diretamente para as três posições do &lt;a href="https://semver.org/lang/pt-BR/" rel="noopener noreferrer"&gt;SemVer&lt;/a&gt; (&lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de commit&lt;/th&gt;
&lt;th&gt;Impacto na versão&lt;/th&gt;
&lt;th&gt;Exemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1.4.2&lt;/code&gt; → &lt;code&gt;1.4.3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MINOR&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1.4.2&lt;/code&gt; → &lt;code&gt;1.5.0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qualquer tipo com &lt;code&gt;BREAKING CHANGE&lt;/code&gt; ou &lt;code&gt;!&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;MAJOR&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1.4.2&lt;/code&gt; → &lt;code&gt;2.0.0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;Nenhum (não gera release)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Essa correlação é o que permite que ferramentas de release automatizem a decisão de qual versão publicar, sem que ninguém precise decidir manualmente "isso é uma minor ou uma patch?".&lt;/p&gt;




&lt;h2&gt;
  
  
  Ferramentas do ecossistema
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://commitlint.js.org/" rel="noopener noreferrer"&gt;&lt;code&gt;commitlint&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Valida no commit (via hook) se a mensagem segue o padrão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/commitizen/cz-cli" rel="noopener noreferrer"&gt;&lt;code&gt;commitizen&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;CLI interativa que monta a mensagem de commit por perguntas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;&lt;code&gt;semantic-release&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Automatiza versionamento e publicação de pacotes com base nos commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/conventional-changelog/standard-version" rel="noopener noreferrer"&gt;&lt;code&gt;standard-version&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Gera changelog e bump de versão localmente, sem publicar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/conventional-changelog/conventional-changelog" rel="noopener noreferrer"&gt;&lt;code&gt;conventional-changelog&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Biblioteca base para gerar changelogs a partir do histórico&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Exemplo de hook local com commitlint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; @commitlint/cli @commitlint/config-conventional
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// commitlint.config.js&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@commitlint/config-conventional&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integrando com &lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; para rodar a validação em todo commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx husky add .husky/commit-msg &lt;span class="s1"&gt;'npx --no -- commitlint --edit "$1"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir daí, um commit fora do padrão é rejeitado antes mesmo de entrar no histórico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"ajustei umas coisas"&lt;/span&gt;
&lt;span class="go"&gt;⧗   input: ajustei umas coisas
✖   subject may not be empty [subject-empty]
✖   type may not be empty [type-empty]

✖ found 2 problems, 0 warnings
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descrição no imperativo, minúscula, sem ponto final&lt;/strong&gt; — ex: &lt;code&gt;fix: corrige&lt;/code&gt;, não &lt;code&gt;fix: Corrigido.&lt;/code&gt; ou &lt;code&gt;fix: correção de&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Um commit, uma mudança lógica&lt;/strong&gt; — evite misturar &lt;code&gt;feat&lt;/code&gt; e &lt;code&gt;refactor&lt;/code&gt; no mesmo commit só porque tocaram os mesmos arquivos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escopo consistente&lt;/strong&gt; — combine com o time uma lista fixa de escopos (&lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;ui&lt;/code&gt;, &lt;code&gt;db&lt;/code&gt;) em vez de deixar livre&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corpo explica o "porquê", não o "o quê"&lt;/strong&gt; — o diff já mostra o que mudou; o corpo do commit deve justificar a decisão&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;BREAKING CHANGE&lt;/code&gt; sempre no rodapé, em maiúsculas&lt;/strong&gt; — é o texto que as ferramentas de automação procuram para disparar um MAJOR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine com &lt;code&gt;commitlint&lt;/code&gt; no pipeline ou pre-commit hook&lt;/strong&gt; — depender de disciplina manual do time não escala além de poucas pessoas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problema&lt;/th&gt;
&lt;th&gt;Causa provável&lt;/th&gt;
&lt;th&gt;Solução&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;commitlint&lt;/code&gt; rejeita commit com mensagem que parece correta&lt;/td&gt;
&lt;td&gt;Espaço faltando após os dois-pontos, ou tipo com maiúscula (&lt;code&gt;Feat:&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sempre &lt;code&gt;tipo: descrição&lt;/code&gt;, tipo em minúsculas, um espaço após &lt;code&gt;:&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changelog gerado não lista uma mudança importante&lt;/td&gt;
&lt;td&gt;Commit usou tipo que não gera changelog por padrão (&lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Reclassifique como &lt;code&gt;feat&lt;/code&gt;/&lt;code&gt;fix&lt;/code&gt; se a mudança for relevante ao usuário final&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;semantic-release&lt;/code&gt; não bumpou a versão MAJOR esperada&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;BREAKING CHANGE&lt;/code&gt; escrito errado no corpo (ex: &lt;code&gt;Breaking change:&lt;/code&gt; com minúscula)&lt;/td&gt;
&lt;td&gt;Use exatamente &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; maiúsculo, ou &lt;code&gt;!&lt;/code&gt; após o tipo/escopo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time reclama que o padrão é burocrático demais&lt;/td&gt;
&lt;td&gt;Falta de ferramenta que automatize a checagem, virando esforço manual&lt;/td&gt;
&lt;td&gt;Adicione &lt;code&gt;commitizen&lt;/code&gt; para gerar a mensagem por prompt interativo, reduzindo fricção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge commit "genérico" polui o changelog&lt;/td&gt;
&lt;td&gt;Merge de branch sem squash mistura vários commits não convencionais&lt;/td&gt;
&lt;td&gt;Prefira squash merge com uma mensagem convencional única no PR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Conventional Commits não é sobre burocratizar o Git, é sobre transformar uma mensagem de commit em um dado que máquinas conseguem ler, sem tirar a legibilidade para humanos. O ganho aparece principalmente na escala: um projeto pequeno sobrevive com &lt;code&gt;"fix bug"&lt;/code&gt;, mas um projeto com múltiplos contribuidores, releases frequentes e changelog público sente a diferença entre montar isso manualmente ou automaticamente a cada versão.&lt;/p&gt;

&lt;p&gt;Comece pequeno: adote &lt;code&gt;feat:&lt;/code&gt; e &lt;code&gt;fix:&lt;/code&gt; no seu próximo commit, adicione o &lt;code&gt;commitlint&lt;/code&gt; como hook local, e deixe o time se acostumar antes de cobrar escopos e rodapés. Depois de validado no dia a dia, avalie ferramentas como &lt;code&gt;semantic-release&lt;/code&gt; para automatizar versionamento e publicação por completo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/pt-br/v1.0.0/" rel="noopener noreferrer"&gt;Especificação oficial Conventional Commits 1.0.0 (PT-BR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit" rel="noopener noreferrer"&gt;Angular Commit Message Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://semver.org/lang/pt-BR/" rel="noopener noreferrer"&gt;Semantic Versioning 2.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commitlint.js.org/" rel="noopener noreferrer"&gt;commitlint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;semantic-release&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>devops</category>
      <category>boaspraticas</category>
      <category>github</category>
    </item>
    <item>
      <title>Checkov: Guia Completo de Segurança para Infraestrutura como Código</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Thu, 02 Jul 2026 14:03:59 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/checkov-guia-completo-de-seguranca-para-infraestrutura-como-codigo-3cij</link>
      <guid>https://dev.to/luiscruzcwb/checkov-guia-completo-de-seguranca-para-infraestrutura-como-codigo-3cij</guid>
      <description>&lt;p&gt;Escrever infraestrutura como código resolve o problema de reprodutibilidade, mas cria um novo risco: erros de configuração (misconfigurations) agora são versionados, replicados e revisados com a mesma pressa de qualquer outro código. Um bucket S3 público, um security group aberto para &lt;code&gt;0.0.0.0/0&lt;/code&gt; ou um container rodando como root passam despercebidos em um &lt;code&gt;terraform plan&lt;/code&gt;, porque o plan mostra &lt;em&gt;o que&lt;/em&gt; vai mudar, não &lt;em&gt;se aquilo é seguro&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;É esse o problema que o &lt;strong&gt;Checkov&lt;/strong&gt; resolve: análise estática de segurança (SAST) para arquivos de IaC, rodando &lt;strong&gt;antes&lt;/strong&gt; do &lt;code&gt;apply&lt;/code&gt;, direto no seu terminal, editor ou pipeline de CI/CD.&lt;/p&gt;

&lt;p&gt;Este artigo cobre tudo para sair do zero: o que é, para quem é, como instalar, como usar no dia a dia e como integrar em um pipeline real.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o Checkov
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Checkov&lt;/strong&gt; é uma ferramenta open source de &lt;em&gt;policy-as-code&lt;/em&gt; criada pela Bridgecrew (adquirida pela Palo Alto Networks) que analisa arquivos de infraestrutura como código em busca de erros de configuração de segurança, conformidade e boas práticas &lt;strong&gt;sem precisar aplicar nada na nuvem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ele funciona construindo um grafo de recursos a partir do seu código (Terraform, CloudFormation, Kubernetes, etc.), entendendo as relações entre eles, e comparando cada recurso contra centenas de &lt;em&gt;checks&lt;/em&gt; pré-definidos como "bucket S3 não deve permitir acesso público" ou "security group não deve expor a porta 22 para a internet".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais características:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mais de 1.000 checks embutidos, cobrindo AWS, Azure, GCP e boas práticas gerais&lt;/li&gt;
&lt;li&gt;Suporte a múltiplas linguagens de IaC: Terraform, CloudFormation, Kubernetes, Helm, Dockerfile, Serverless Framework, ARM templates, Bicep e mais&lt;/li&gt;
&lt;li&gt;Checks escritos em Python ou YAML - customizáveis e extensíveis&lt;/li&gt;
&lt;li&gt;Análise baseada em grafo (entende variáveis, módulos e referências entre recursos, não só regex)&lt;/li&gt;
&lt;li&gt;Gratuito e open source (com uma camada paga opcional via Prisma Cloud para políticas centralizadas)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Para quem é o Checkov
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Perfil&lt;/th&gt;
&lt;th&gt;Como usa o Checkov&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Devs que escrevem Terraform/Helm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Roda local antes do commit, corrige o erro antes do PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Times de DevOps/Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Integra no pipeline de CI/CD como gate obrigatório&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Engineers / AppSec&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define políticas customizadas e audita compliance (CIS, PCI-DSS, SOC2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Garante que ambientes de produção seguem baseline de segurança antes do deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estudantes de Cloud/DevSecOps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aprende boas práticas de segurança na prática, com feedback imediato&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Se você já usa &lt;code&gt;terraform validate&lt;/code&gt; ou &lt;code&gt;terraform plan&lt;/code&gt; no seu fluxo, o Checkov entra como uma etapa adicional, ele não substitui essas ferramentas, complementa: elas garantem que o código é &lt;em&gt;sintaticamente correto&lt;/em&gt;, o Checkov garante que ele é &lt;em&gt;seguro&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8+ instalado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip&lt;/code&gt; disponível&lt;/li&gt;
&lt;li&gt;Um projeto de IaC para testar (vamos usar Terraform no exemplo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verifique sua versão do Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  1. Instalação
&lt;/h2&gt;

&lt;p&gt;O Checkov pode ser instalado de várias formas. As mais comuns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Via pip (recomendado)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;checkov

&lt;span class="c"&gt;# Via pipx (isola em ambiente virtual próprio)&lt;/span&gt;
pipx &lt;span class="nb"&gt;install &lt;/span&gt;checkov

&lt;span class="c"&gt;# Via Homebrew (macOS/Linux)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;checkov

&lt;span class="c"&gt;# Via Docker (sem instalar nada localmente)&lt;/span&gt;
docker pull bridgecrew/checkov
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirme a instalação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;checkov &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;No Debian/Ubuntu, se &lt;code&gt;pip install checkov&lt;/code&gt; reclamar de ambiente gerenciado externamente (PEP 668), use &lt;code&gt;pipx install checkov&lt;/code&gt; ou crie um virtualenv (&lt;code&gt;python3 -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Primeiro scan: encontrando problemas reais
&lt;/h2&gt;

&lt;p&gt;Vamos criar um exemplo propositalmente inseguro para ver o Checkov em ação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/checkov-demo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/checkov-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie o arquivo &lt;code&gt;main.tf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"minha-empresa-dados-2026"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web-sg"&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Security group da aplicacao web"&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;identifier&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-db"&lt;/span&gt;
  &lt;span class="nx"&gt;engine&lt;/span&gt;            &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_class&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.t3.micro"&lt;/span&gt;
  &lt;span class="nx"&gt;allocated_storage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt;
  &lt;span class="nx"&gt;password&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SenhaSuperSecreta123"&lt;/span&gt;
  &lt;span class="nx"&gt;publicly_accessible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;skip_final_snapshot&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rode o scan apontando para o diretório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Checkov vai listar dezenas de checks, com resultado &lt;code&gt;PASSED&lt;/code&gt; ou &lt;code&gt;FAILED&lt;/code&gt; para cada recurso. Entre os &lt;code&gt;FAILED&lt;/code&gt; esperados neste exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_24&lt;/strong&gt; — Security group permite SSH (porta 22) aberto para &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_260&lt;/strong&gt; — Security group permite HTTP aberto para o mundo sem necessidade&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_16&lt;/strong&gt; — Instância RDS sem criptografia habilitada&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_161&lt;/strong&gt; — Instância RDS não força autenticação via IAM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_129&lt;/strong&gt; — RDS sem logging de auditoria habilitado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_SECRET_2&lt;/strong&gt; — Senha em texto plano detectada no código (&lt;code&gt;password = "SenhaSuperSecreta123"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV2_AWS_6&lt;/strong&gt; — Bucket S3 sem política de bloqueio de acesso público&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CKV_AWS_18&lt;/strong&gt; — Bucket S3 sem access logging habilitado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada linha do resultado mostra o &lt;strong&gt;ID do check&lt;/strong&gt;, uma descrição, o arquivo e a linha exata do recurso problemático — dá para ir direto ao ponto.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Entendendo o output
&lt;/h2&gt;

&lt;p&gt;Formato padrão (texto colorido no terminal):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check: CKV_AWS_24: "Ensure no security groups allow ingress from 0.0.0.0:0 to port 22"
    FAILED for resource: aws_security_group.web
    File: /main.tf:6-15
    Guide: https://docs.bridgecrew.io/docs/networking_1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para integrações e leitura por outras ferramentas, use formatos estruturados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# JSON — útil para parsing programático&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json

&lt;span class="c"&gt;# JUnit XML — direto em relatórios de CI (GitLab, Jenkins, Azure DevOps)&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; junitxml

&lt;span class="c"&gt;# SARIF — formato padrão para GitHub Code Scanning&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; sarif

&lt;span class="c"&gt;# Múltiplos formatos ao mesmo tempo, salvando em arquivos&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; cli &lt;span class="nt"&gt;-o&lt;/span&gt; json &lt;span class="nt"&gt;--output-file-path&lt;/span&gt; console,results.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;exit code&lt;/strong&gt; também importa em automação: por padrão o Checkov retorna &lt;code&gt;1&lt;/code&gt; se houver qualquer check &lt;code&gt;FAILED&lt;/code&gt;, o que quebra o pipeline — é esse comportamento que você quer como &lt;em&gt;gate&lt;/em&gt; de segurança.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Corrigindo os problemas
&lt;/h2&gt;

&lt;p&gt;Ajustando o &lt;code&gt;main.tf&lt;/code&gt; para resolver os principais achados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"minha-empresa-dados-2026"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_public_access_block"&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;block_public_acls&lt;/span&gt;       &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;block_public_policy&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;ignore_public_acls&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;restrict_public_buckets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket_server_side_encryption_configuration"&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_s3_bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;

  &lt;span class="nx"&gt;rule&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;apply_server_side_encryption_by_default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;sse_algorithm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aws:kms"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web-sg"&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Security group da aplicacao web"&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"HTTPS publico"&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SSH restrito a VPN corporativa"&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"203.0.113.0/24"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;identifier&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-db"&lt;/span&gt;
  &lt;span class="nx"&gt;engine&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mysql"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_class&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"db.t3.micro"&lt;/span&gt;
  &lt;span class="nx"&gt;allocated_storage&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"admin"&lt;/span&gt;
  &lt;span class="nx"&gt;manage_master_user_password&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;storage_encrypted&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;publicly_accessible&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="nx"&gt;skip_final_snapshot&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="nx"&gt;deletion_protection&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Principais mudanças: bucket com &lt;em&gt;public access block&lt;/em&gt; e criptografia; security group sem SSH aberto ao mundo; RDS privado, criptografado, com senha gerenciada pelo Secrets Manager (&lt;code&gt;manage_master_user_password&lt;/code&gt;) em vez de hardcoded.&lt;/p&gt;

&lt;p&gt;Rode o scan de novo - o número de &lt;code&gt;FAILED&lt;/code&gt; deve cair drasticamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--compact&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Suprimindo checks (quando necessário)
&lt;/h2&gt;

&lt;p&gt;Nem todo &lt;code&gt;FAILED&lt;/code&gt; é um bug, às vezes é uma decisão consciente (ex: um bucket público de assets estáticos de um site). Para esses casos, suprima o check pontualmente, &lt;strong&gt;sempre com justificativa&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"site_publico"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"meu-site-assets-publicos"&lt;/span&gt;

  &lt;span class="c1"&gt;# checkov:skip=CKV2_AWS_6:Bucket serve assets estaticos publicos por design (CDN de imagens do site)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para suprimir vários checks em um recurso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;  &lt;span class="c1"&gt;#checkov:skip=CKV_AWS_18:Logging desnecessario neste bucket de teste&lt;/span&gt;
  &lt;span class="c1"&gt;#checkov:skip=CKV_AWS_21:Versionamento desnecessario neste bucket de teste&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é possível ignorar checks globalmente via linha de comando — use com cautela, pois afeta o repositório inteiro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--skip-check&lt;/span&gt; CKV_AWS_8,CKV_AWS_79
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Prefira sempre o &lt;code&gt;#checkov:skip&lt;/code&gt; inline no código: fica documentado, versionado e visível em code review, diferente de uma flag de CLI que vive escondida em um script de pipeline.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Criando um baseline (para projetos legados)
&lt;/h2&gt;

&lt;p&gt;Ao rodar o Checkov pela primeira vez em um projeto grande e antigo, é comum encontrar centenas de findings acumulados, inviável corrigir tudo de uma vez sem travar o time. A solução é gerar um &lt;strong&gt;baseline&lt;/strong&gt;: um snapshot dos problemas atuais, para que o pipeline falhe só em &lt;em&gt;novos&lt;/em&gt; problemas introduzidos daqui pra frente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gera o baseline com o estado atual (findings existentes)&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--create-baseline&lt;/span&gt;

&lt;span class="c"&gt;# Nas próximas execuções, compara contra o baseline&lt;/span&gt;
checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--baseline&lt;/span&gt; .checkov.baseline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite adotar segurança em pipelines de forma incremental, sem bloquear o time por dívida técnica pré-existente.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Integração com CI/CD (GitHub Actions)
&lt;/h2&gt;

&lt;p&gt;Exemplo de workflow que roda o Checkov em todo PR que altera arquivos Terraform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkov IaC Security Scan&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**.tf'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;checkov&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Checkov&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridgecrewio/checkov-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;directory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
          &lt;span class="na"&gt;framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;terraform&lt;/span&gt;
          &lt;span class="na"&gt;output_format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sarif&lt;/span&gt;
          &lt;span class="na"&gt;output_file_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;results.sarif&lt;/span&gt;
          &lt;span class="na"&gt;soft_fail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload SARIF para GitHub Code Scanning&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always()&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;results.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com &lt;code&gt;soft_fail: false&lt;/code&gt;, o job falha e bloqueia o merge se houver check crítico reprovado, esse é o comportamento recomendado para branches protegidas. Use &lt;code&gt;soft_fail: true&lt;/code&gt; apenas durante a fase de adoção gradual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integração como pre-commit hook
&lt;/h3&gt;

&lt;p&gt;Para pegar problemas antes mesmo do push, adicione ao &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/bridgecrewio/checkov.git&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.2.0'&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;checkov&lt;/span&gt;
        &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--compact"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--quiet"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pre-commit
pre-commit &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Checks customizados
&lt;/h2&gt;

&lt;p&gt;Quando as regras padrão não cobrem uma política interna da empresa (ex: "toda instância EC2 deve ter a tag &lt;code&gt;cost-center&lt;/code&gt;"), é possível escrever checks próprios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom check em Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;checkov.terraform.checks.resource.base_resource_check&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseResourceCheck&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;checkov.common.models.enums&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CheckCategories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CheckResult&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnsureCostCenterTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseResourceCheck&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ensure EC2 instances have a cost-center tag&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CKV_CUSTOM_1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;supported_resources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_instance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CheckCategories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GENERAL_SECURITY&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;supported_resources&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;supported_resources&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scan_resource_conf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{}])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost-center&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CheckResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PASSED&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;CheckResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;


&lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;EnsureCostCenterTag&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;checkov &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--external-checks-dir&lt;/span&gt; ./custom_checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Custom check em YAML&lt;/strong&gt; (mais simples, sem precisar de Python):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CKV_CUSTOM_2"&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ensure&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;S3&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;bucket&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;follows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;naming&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;convention"&lt;/span&gt;
  &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GENERAL_SECURITY"&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws"&lt;/span&gt;
&lt;span class="na"&gt;definition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;and&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cond_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attribute"&lt;/span&gt;
      &lt;span class="na"&gt;resource_types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_s3_bucket"&lt;/span&gt;
      &lt;span class="na"&gt;attribute&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bucket"&lt;/span&gt;
      &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;starts_with"&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;empresa-"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Referência rápida de flags úteis
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d &amp;lt;dir&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Escaneia todo o diretório recursivamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Escaneia um arquivo específico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--framework terraform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limita o scan a um framework (terraform, kubernetes, dockerfile, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--check CKV_AWS_24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Roda apenas checks específicos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--skip-check CKV_AWS_8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ignora checks específicos globalmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--compact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output resumido, sem detalhes de cada check &lt;code&gt;PASSED&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--quiet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mostra só os &lt;code&gt;FAILED&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--soft-fail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Não retorna exit code de erro mesmo com findings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`-o json\&lt;/td&gt;
&lt;td&gt;junitxml\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;--create-baseline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Gera baseline com findings atuais&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--external-checks-dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Carrega checks customizados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  10. Checkov vs. outras ferramentas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ferramenta&lt;/th&gt;
&lt;th&gt;Foco&lt;/th&gt;
&lt;th&gt;Linguagens suportadas&lt;/th&gt;
&lt;th&gt;Diferencial&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Checkov&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IaC security + compliance&lt;/td&gt;
&lt;td&gt;Terraform, CFN, K8s, Helm, Dockerfile, Bicep, Serverless&lt;/td&gt;
&lt;td&gt;Maior cobertura de frameworks, análise por grafo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;tfsec&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terraform security&lt;/td&gt;
&lt;td&gt;Apenas Terraform&lt;/td&gt;
&lt;td&gt;Muito rápido, focado só em Terraform (hoje integrado ao Trivy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terrascan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IaC security + compliance&lt;/td&gt;
&lt;td&gt;Terraform, K8s, Helm, CFN&lt;/td&gt;
&lt;td&gt;Motor baseado em OPA/Rego&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trivy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vulnerabilidades + IaC + containers&lt;/td&gt;
&lt;td&gt;IaC, imagens de container, filesystems&lt;/td&gt;
&lt;td&gt;Escopo mais amplo (inclui CVEs de pacotes), não só IaC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Na prática, muitos times usam &lt;strong&gt;Checkov + Trivy&lt;/strong&gt; juntos: Checkov para configuração de IaC, Trivy para vulnerabilidades de imagens de container e dependências. Eles não são mutuamente exclusivos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Boas práticas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rode local antes do commit&lt;/strong&gt; — pre-commit hook pega o problema em segundos, antes de virar um PR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trave a versão do Checkov&lt;/strong&gt; no pipeline (&lt;code&gt;checkov==3.2.0&lt;/code&gt;) para evitar que uma nova versão introduza checks que quebrem o build sem aviso&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use baseline em projetos legados&lt;/strong&gt; — não tente corrigir 300 findings de uma vez, adote incrementalmente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documente todo skip&lt;/strong&gt; — &lt;code&gt;#checkov:skip&lt;/code&gt; sempre com motivo, nunca silencioso&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine com scanning de secrets&lt;/strong&gt; — o Checkov já detecta segredos em texto plano (&lt;code&gt;CKV_SECRET_*&lt;/code&gt;), mas para repositórios grandes considere complementar com &lt;code&gt;gitleaks&lt;/code&gt; no histórico de commits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trate achados críticos como bloqueadores&lt;/strong&gt; — &lt;code&gt;soft_fail&lt;/code&gt; é aceitável só durante a fase de adoção, não como estado permanente&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problema&lt;/th&gt;
&lt;th&gt;Causa provável&lt;/th&gt;
&lt;th&gt;Solução&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;error: externally-managed-environment&lt;/code&gt; no &lt;code&gt;pip install&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;PEP 668 em distros recentes (Debian 12+, Ubuntu 23.04+)&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;pipx install checkov&lt;/code&gt; ou um virtualenv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkov não encontra nenhum recurso&lt;/td&gt;
&lt;td&gt;Diretório errado ou &lt;code&gt;.tf&lt;/code&gt; com erro de sintaxe&lt;/td&gt;
&lt;td&gt;Rode &lt;code&gt;terraform validate&lt;/code&gt; antes; confirme o &lt;code&gt;-d&lt;/code&gt; aponta pro diretório certo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check falha mas parece um falso positivo&lt;/td&gt;
&lt;td&gt;Contexto que o Checkov não enxerga (ex: recurso protegido por outra camada)&lt;/td&gt;
&lt;td&gt;Suprima com &lt;code&gt;#checkov:skip&lt;/code&gt; e justificativa, não desabilite globalmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline trava sempre no primeiro scan&lt;/td&gt;
&lt;td&gt;Débito técnico acumulado no repositório&lt;/td&gt;
&lt;td&gt;Gere baseline com &lt;code&gt;--create-baseline&lt;/code&gt; e adote incrementalmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scan muito lento em monorepo grande&lt;/td&gt;
&lt;td&gt;Escaneando diretórios desnecessários (&lt;code&gt;.terraform/&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;--skip-path&lt;/code&gt; para excluir pastas irrelevantes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Checkov transforma segurança de infraestrutura de uma revisão manual — que depende de alguém lembrar de checar security groups e permissões — em um portão automatizado que roda em segundos, local ou no pipeline. Ele não substitui uma revisão de arquitetura ou um pentest, mas elimina a categoria inteira de erros básicos e repetitivos que hoje são a causa mais comum de incidentes de cloud: bucket público, credencial hardcoded, porta aberta para o mundo.&lt;/p&gt;

&lt;p&gt;Comece pequeno: rode &lt;code&gt;checkov -d .&lt;/code&gt; no seu projeto Terraform atual, veja o que aparece, gere um baseline se for muito, e adicione como pre-commit hook. Depois de validado localmente, leve para o CI/CD como gate obrigatório em PRs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.checkov.io/" rel="noopener noreferrer"&gt;Documentação oficial do Checkov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bridgecrewio/checkov" rel="noopener noreferrer"&gt;Repositório no GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.checkov.io/5.Policy%20Index/all.html" rel="noopener noreferrer"&gt;Catálogo completo de checks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bridgecrewio/checkov-action" rel="noopener noreferrer"&gt;Checkov GitHub Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.checkov.io/3.Custom%20Policies/Python%20Custom%20Policies.html" rel="noopener noreferrer"&gt;Guia de checks customizados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>terraform</category>
      <category>iac</category>
    </item>
    <item>
      <title>AWS - Projeto Cloud: Implementação IAM</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 19:30:21 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/aws-projeto-cloud-implementacao-iam-1k35</link>
      <guid>https://dev.to/luiscruzcwb/aws-projeto-cloud-implementacao-iam-1k35</guid>
      <description>&lt;p&gt;Neste projeto prático você vai implementar um ambiente IAM completo na AWS: criar grupos com permissões específicas, migrar usuários via script automatizado, configurar MFA obrigatório e aplicar uma política de senhas forte — tudo seguindo as boas práticas de segurança da AWS.&lt;/p&gt;

&lt;p&gt;O projeto está dividido em duas partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parte 1:&lt;/strong&gt; Criação de grupos, preparação do CSV e automação da criação de usuários&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parte 2:&lt;/strong&gt; Boas práticas de segurança — MFA, política de senhas e validação de acesso&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Acesso ao &lt;strong&gt;AWS Console&lt;/strong&gt; com permissões de administrador&lt;/li&gt;
&lt;li&gt;Arquivo CSV com os dados dos usuários (formato explicado abaixo)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Parte 1 — Criação e Migração de Usuários
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1 — Criar os Grupos IAM
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;AWS Console&lt;/strong&gt;, acesse &lt;strong&gt;IAM → User groups → Create group&lt;/strong&gt; e crie os seguintes grupos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grupo&lt;/th&gt;
&lt;th&gt;Perfil&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CloudAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores da conta AWS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LinuxAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de servidores Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RedesAdmin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de rede&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DBA&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Administradores de banco de dados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Estagiarios&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Acesso limitado para estagiários&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Nomes de grupos suportam até 128 caracteres, são únicos por conta e não diferenciam maiúsculas de minúsculas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Passo 2 — Preparar o arquivo CSV
&lt;/h3&gt;

&lt;p&gt;O script espera um arquivo CSV com exatamente três colunas: &lt;code&gt;usuarios&lt;/code&gt;, &lt;code&gt;grupo&lt;/code&gt; e &lt;code&gt;senha&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se você tiver uma planilha Excel com os dados dos usuários, faça os seguintes ajustes antes de exportar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Renomeie a coluna de e-mails para &lt;code&gt;usuarios&lt;/code&gt; e remova o domínio (ex: remova &lt;code&gt;@empresa.com&lt;/code&gt; usando &lt;strong&gt;Localizar e Substituir&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Renomeie a coluna de equipes para &lt;code&gt;grupo&lt;/code&gt; e ajuste os valores para bater exatamente com os nomes dos grupos criados na AWS&lt;/li&gt;
&lt;li&gt;Adicione a coluna &lt;code&gt;senha&lt;/code&gt; com uma senha padrão inicial (ex: &lt;code&gt;AlterarSenha@123!&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Salve como &lt;strong&gt;CSV separado por vírgula (UTF-8)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O arquivo final deve ter este formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;grupo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;senha&lt;/span&gt;
&lt;span class="k"&gt;joao&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;silva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;souza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;DBA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;pedro&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;lima&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Estagiarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;ana&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;costa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;RedesAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;carlos&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;melo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;CloudAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;AlterarSenha&lt;/span&gt;&lt;span class="kp"&gt;@123&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Para validar o processo, comece com 4 ou 5 usuários antes de rodar o arquivo completo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Passo 3 — O script de criação de usuários
&lt;/h3&gt;

&lt;p&gt;Salve o conteúdo abaixo como &lt;code&gt;aws-iam-cria-usuario.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Propósito:   Automatiza a criação de usuários na AWS&lt;/span&gt;
&lt;span class="c"&gt;# Utilização:  ./aws-iam-cria-usuario.sh &amp;lt;arquivo.csv&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# Formato CSV: usuarios,grupo,senha&lt;/span&gt;
&lt;span class="c"&gt;# Autor:       Luis Cruz&lt;/span&gt;
&lt;span class="c"&gt;# ------------------------------------------&lt;/span&gt;

&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nv"&gt;OLDIFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$IFS&lt;/span&gt;
&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;',;'&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt; arquivo não encontrado"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;99&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; dos2unix &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Utilitário dos2unix não encontrado. Instale com: sudo yum install dos2unix -y"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

dos2unix &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; usuario grupo senha &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"usuarios"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"──────────────────────────────────────"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Criando: &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt; | Grupo: &lt;/span&gt;&lt;span class="nv"&gt;$grupo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam create-login-profile &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--password-reset-required&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$senha&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    aws iam add-user-to-group &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--group-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$grupo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✓ &lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="s2"&gt; criado com sucesso"&lt;/span&gt;
  &lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$INPUT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OLDIFS&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Migração concluída."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Valida se o arquivo CSV foi informado e existe&lt;/li&gt;
&lt;li&gt;Converte o arquivo com &lt;code&gt;dos2unix&lt;/code&gt; (necessário se criado no Windows)&lt;/li&gt;
&lt;li&gt;Lê cada linha ignorando o cabeçalho&lt;/li&gt;
&lt;li&gt;Cria o usuário IAM, define a senha inicial com troca obrigatória no primeiro acesso e adiciona ao grupo&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Passo 4 — Executar no AWS CloudShell
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;AWS CloudShell&lt;/strong&gt; é um terminal no próprio console da AWS com AWS CLI já configurada. Acesse pelo ícone de terminal no menu superior do console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instalar o dos2unix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;dos2unix &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fazer upload dos arquivos&lt;/strong&gt; via &lt;strong&gt;Actions → Upload file&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws-iam-cria-usuario.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usuarios.csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Preparar e executar:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# verificar os arquivos enviados&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;

&lt;span class="c"&gt;# tornar o script executável&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x aws-iam-cria-usuario.sh

&lt;span class="c"&gt;# verificar o conteúdo do CSV&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;usuarios.csv

&lt;span class="c"&gt;# executar&lt;/span&gt;
./aws-iam-cria-usuario.sh usuarios.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Passo 5 — Validar os usuários criados
&lt;/h3&gt;

&lt;p&gt;No console, acesse &lt;strong&gt;IAM → Users&lt;/strong&gt; e confirme que os usuários foram criados e estão nos grupos corretos.&lt;/p&gt;

&lt;p&gt;Ou via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar todos os usuários&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# verificar grupos de um usuário&lt;/span&gt;
aws iam list-groups-for-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; joao.silva

&lt;span class="c"&gt;# listar usuários de um grupo&lt;/span&gt;
aws iam get-group &lt;span class="nt"&gt;--group-name&lt;/span&gt; DBA &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Passo 6 — Permitir troca de senha no primeiro acesso
&lt;/h3&gt;

&lt;p&gt;Antes de testar o login com os usuários criados, anexe a política &lt;code&gt;IAMUserChangePassword&lt;/code&gt; a todos os grupos.&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → User groups → [grupo] → Permissions → Add permissions → Attach policies&lt;/strong&gt;, filtre por &lt;code&gt;IAM&lt;/code&gt; e adicione &lt;code&gt;IAMUserChangePassword&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Repita para todos os grupos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Testando o acesso (Passo a passo)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;strong&gt;IAM → Dashboard&lt;/strong&gt; e copie a &lt;strong&gt;URL de login da conta&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Abra uma aba anônima no navegador e acesse com a URL copiada&lt;/li&gt;
&lt;li&gt;Faça login com um dos usuários criados (ex: &lt;code&gt;adolfo.carlos&lt;/code&gt;, grupo &lt;code&gt;DBA&lt;/code&gt;, senha &lt;code&gt;AlterarSenha@123!&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Troque a senha quando solicitado&lt;/li&gt;
&lt;li&gt;Tente acessar o &lt;strong&gt;DynamoDB&lt;/strong&gt; e criar uma tabela → o acesso deve ser negado, pois o grupo &lt;code&gt;DBA&lt;/code&gt; tem apenas &lt;code&gt;AmazonRDSFullAccess&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse teste confirma que o princípio do &lt;strong&gt;mínimo privilégio&lt;/strong&gt; está funcionando corretamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Parte 2 — Boas Práticas de Segurança
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1 — Habilitar MFA no usuário Root
&lt;/h3&gt;

&lt;p&gt;O usuário root é a identidade mais poderosa da conta AWS. Proteja-o primeiro.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o console com o usuário root&lt;/li&gt;
&lt;li&gt;Clique no nome da conta → &lt;strong&gt;Security Credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;Multi-factor authentication (MFA)&lt;/strong&gt; → &lt;strong&gt;Assign MFA device&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escolha &lt;strong&gt;Authenticator app&lt;/strong&gt; (ex: Google Authenticator ou Authy)&lt;/li&gt;
&lt;li&gt;Escaneie o QR Code com o aplicativo&lt;/li&gt;
&lt;li&gt;Informe dois tokens consecutivos para confirmar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A partir de agora, além de usuário e senha, o login do root exigirá o token do autenticador.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 2 — Criar e aplicar a política EnforceMFAPolicy
&lt;/h3&gt;

&lt;p&gt;Esta política bloqueia qualquer acesso a recursos da AWS enquanto o usuário não tiver o MFA ativo.&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → Create policy → JSON&lt;/strong&gt;, remova o conteúdo existente e cole:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowViewAccountInfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetAccountPasswordPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:mfa/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnUserMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:DeactivateMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:user/${aws:username}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DenyAllExceptListedIfNoMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"NotAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"sts:GetSessionToken"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"BoolIfExists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clique em &lt;strong&gt;Next → Next&lt;/strong&gt; e defina o nome como &lt;code&gt;EnforceMFAPolicy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anexar a política em todos os grupos de uma vez:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → EnforceMFAPolicy → Entities attached → Attach → Filter: User groups&lt;/strong&gt; → selecione todos os grupos → &lt;strong&gt;Attach policy&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 3 — Configurar política de senhas da conta
&lt;/h3&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Account settings → Password policy → Edit → Custom&lt;/strong&gt; e ative:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Letra maiúscula (A-Z)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Letra minúscula (a-z)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Número (0-9)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caractere especial &lt;code&gt;! @ # $ % ...&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permitir que usuários troquem a própria senha&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impedir reutilização de senhas&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Clique em &lt;strong&gt;Save changes&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Passo 4 — Testar o bloqueio por MFA
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;strong&gt;IAM → Dashboard&lt;/strong&gt; e copie a URL de login&lt;/li&gt;
&lt;li&gt;Abra uma aba anônima e faça login com um usuário que &lt;strong&gt;não tem MFA configurado&lt;/strong&gt; (ex: &lt;code&gt;alda.lage&lt;/code&gt;, grupo &lt;code&gt;CloudAdmin&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Tente acessar o &lt;strong&gt;IAM&lt;/strong&gt; → o acesso será negado com erro de permissão&lt;/li&gt;
&lt;li&gt;Isso confirma que a &lt;code&gt;EnforceMFAPolicy&lt;/code&gt; está funcionando&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ativando o MFA como usuário:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique no nome do usuário no canto superior direito → &lt;strong&gt;Security Credentials&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;MFA device&lt;/strong&gt; → &lt;strong&gt;Assign MFA device → Authenticator app&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escaneie o QR Code e informe dois tokens consecutivos&lt;/li&gt;
&lt;li&gt;Faça &lt;strong&gt;Logoff → Login&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Teste novamente o acesso — agora deve funcionar normalmente&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resumo do que foi implementado
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuração&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grupos IAM com permissões específicas&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuários criados via script automatizado&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troca de senha obrigatória no primeiro acesso&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA habilitado no usuário root&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EnforceMFAPolicy aplicada em todos os grupos&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Política de senhas forte na conta&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/best-practices.html" rel="noopener noreferrer"&gt;Boas práticas de segurança no IAM – AWS Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-services-iam-new-user-group.html" rel="noopener noreferrer"&gt;Gerenciar usuários e grupos com AWS CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html" rel="noopener noreferrer"&gt;Tutorial: MFA obrigatório com política IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html" rel="noopener noreferrer"&gt;Configurar política de senhas da conta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you later 🤘🏻&lt;/p&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Automatizando a Migração de Usuários e o Gerenciamento de IAM na AWS</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 18:51:49 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/automatizando-a-migracao-de-usuarios-e-otimizando-o-gerenciamento-de-iam-na-aws-1d0l</link>
      <guid>https://dev.to/luiscruzcwb/automatizando-a-migracao-de-usuarios-e-otimizando-o-gerenciamento-de-iam-na-aws-1d0l</guid>
      <description>&lt;p&gt;Migrar 100 usuários manualmente no console da AWS é lento, suscetível a erros e impossível de auditar com precisão. Neste artigo você vai ver como automatizar esse processo usando &lt;strong&gt;AWS CLI&lt;/strong&gt; e &lt;strong&gt;Shell Script&lt;/strong&gt; direto no &lt;strong&gt;AWS CloudShell&lt;/strong&gt; — sem instalar nada localmente.&lt;/p&gt;

&lt;p&gt;O resultado final: usuários criados, alocados nos grupos corretos e com MFA obrigatório, tudo em minutos.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o IAM?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;AWS Identity and Access Management (IAM)&lt;/strong&gt; é o serviço que controla quem pode acessar os recursos da sua conta AWS e o que cada pessoa ou serviço pode fazer.&lt;/p&gt;

&lt;p&gt;Com o IAM você gerencia:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usuário&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identidade individual com credenciais próprias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grupo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conjunto de usuários que compartilham as mesmas permissões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Política&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Documento JSON que define o que é permitido ou negado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identidade temporária assumida por serviços ou usuários&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A boa prática é nunca conceder permissões diretamente a um usuário — sempre use grupos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral da solução
&lt;/h2&gt;

&lt;p&gt;O fluxo é simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar os &lt;strong&gt;grupos IAM&lt;/strong&gt; no console&lt;/li&gt;
&lt;li&gt;Montar um &lt;strong&gt;arquivo CSV&lt;/strong&gt; com os dados dos usuários&lt;/li&gt;
&lt;li&gt;Rodar um &lt;strong&gt;shell script&lt;/strong&gt; no CloudShell que lê o CSV e cria tudo automaticamente&lt;/li&gt;
&lt;li&gt;Aplicar a &lt;strong&gt;política de MFA obrigatório&lt;/strong&gt; nos grupos&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Passo 1 — Criar os Grupos IAM
&lt;/h2&gt;

&lt;p&gt;Antes de importar os usuários, os grupos precisam existir.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;AWS Console&lt;/strong&gt;, acesse &lt;strong&gt;IAM → User groups → Create group&lt;/strong&gt; e crie um grupo para cada perfil do seu ambiente. Neste exemplo usaremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RedesAdmin&lt;/code&gt; — administradores de rede&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;LinuxAdmin&lt;/code&gt; — administradores de servidores Linux&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DBA&lt;/code&gt; — administradores de banco de dados&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Estagiarios&lt;/code&gt; — acesso limitado para estagiários&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nomes de grupos suportam até 128 caracteres (letras, números e &lt;code&gt;+ = , . @ _ -&lt;/code&gt;), são únicos por conta e não diferenciam maiúsculas de minúsculas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Passo 2 — Montar o arquivo CSV
&lt;/h2&gt;

&lt;p&gt;Crie uma planilha com os dados dos usuários e salve como &lt;strong&gt;CSV separado por vírgula (UTF-8)&lt;/strong&gt;. O arquivo deve ter exatamente três colunas: &lt;code&gt;Username&lt;/code&gt;, &lt;code&gt;Group&lt;/code&gt; e &lt;code&gt;Password&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Password&lt;/span&gt;
&lt;span class="k"&gt;joao&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;silva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;souza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;DBA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;pedro&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;lima&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Estagiarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;ana&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;costa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;RedesAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;carlos&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="k"&gt;melo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;LinuxAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;Senha&lt;/span&gt;&lt;span class="kp"&gt;@2024&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O valor em &lt;code&gt;Group&lt;/code&gt; deve corresponder exatamente ao nome do grupo criado no Passo 1&lt;/li&gt;
&lt;li&gt;Use senhas que atendam à política da conta AWS (mínimo 8 caracteres, maiúsculas, minúsculas, números e símbolos)&lt;/li&gt;
&lt;li&gt;Se o arquivo foi criado no Excel (Windows), salve como &lt;strong&gt;CSV UTF-8&lt;/strong&gt; — o script vai precisar do &lt;code&gt;dos2unix&lt;/code&gt; para converter os caracteres de fim de linha&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Passo 3 — O script de criação de usuários
&lt;/h2&gt;

&lt;p&gt;Este é o script que lê o CSV e cria cada usuário no IAM. Salve-o como &lt;code&gt;criar-usuarios-iam.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Valida se o arquivo CSV foi informado&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Uso: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;arquivo.csv&amp;gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;CSV_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Ignora o cabeçalho e lê linha por linha&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CSV_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; USERNAME GROUP PASSWORD&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

  &lt;span class="c"&gt;# Remove espaços e caracteres de retorno de carro (Windows)&lt;/span&gt;
  &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'[:space:]\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;GROUP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;       | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'[:space:]\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"──────────────────────────────────────"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Criando usuário: &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt; | Grupo: &lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Cria o usuário com acesso ao console&lt;/span&gt;
  aws iam create-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="c"&gt;# Define a senha inicial e exige troca no primeiro login&lt;/span&gt;
  aws iam create-login-profile &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--password-reset-required&lt;/span&gt;

  &lt;span class="c"&gt;# Adiciona ao grupo&lt;/span&gt;
  aws iam add-user-to-group &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--group-name&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✓ &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt; criado e adicionado ao grupo &lt;/span&gt;&lt;span class="nv"&gt;$GROUP&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Migração concluída."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Passo 4 — Executar no AWS CloudShell
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;AWS CloudShell&lt;/strong&gt; é um terminal no próprio console da AWS com AWS CLI já configurada e autenticada. Não é necessário instalar nada localmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Instalar o dos2unix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;dos2unix &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Fazer upload dos arquivos
&lt;/h3&gt;

&lt;p&gt;No CloudShell, clique em &lt;strong&gt;Actions → Upload file&lt;/strong&gt; e envie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;criar-usuarios-iam.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ListaDeUsuarios.csv&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3 Preparar e executar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# converter o CSV (necessário se o arquivo foi criado no Windows)&lt;/span&gt;
dos2unix ListaDeUsuarios.csv

&lt;span class="c"&gt;# tornar o script executável&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x criar-usuarios-iam.sh

&lt;span class="c"&gt;# executar&lt;/span&gt;
./criar-usuarios-iam.sh ListaDeUsuarios.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída esperada é uma linha de confirmação para cada usuário criado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 5 — Validar os usuários criados
&lt;/h2&gt;

&lt;p&gt;Verifique os usuários no console em &lt;strong&gt;IAM → Users&lt;/strong&gt;, ou via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar todos os usuários da conta&lt;/span&gt;
aws iam list-users &lt;span class="nt"&gt;--output&lt;/span&gt; table

&lt;span class="c"&gt;# verificar os grupos de um usuário específico&lt;/span&gt;
aws iam list-groups-for-user &lt;span class="nt"&gt;--user-name&lt;/span&gt; joao.silva

&lt;span class="c"&gt;# verificar todos os usuários de um grupo&lt;/span&gt;
aws iam get-group &lt;span class="nt"&gt;--group-name&lt;/span&gt; LinuxAdmin &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Passo 6 — Aplicar política de MFA obrigatório
&lt;/h2&gt;

&lt;p&gt;Sem essa etapa, os usuários conseguem acessar recursos da AWS sem configurar autenticação multifator. A política abaixo bloqueia qualquer ação enquanto o MFA não estiver ativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Criar a política
&lt;/h3&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → Policies → Create policy → JSON&lt;/strong&gt; e cole o conteúdo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowViewAccountInfo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetAccountPasswordPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:mfa/*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AllowManageOwnUserMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:DeactivateMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arn:aws:iam::*:user/${aws:username}"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DenyAllExceptListedIfNoMFA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Deny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"NotAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:CreateVirtualMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:EnableMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:GetUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ListVirtualMFADevices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"iam:ResyncMFADevice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"sts:GetSessionToken"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"BoolIfExists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"aws:MultiFactorAuthPresent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dê o nome &lt;code&gt;EnforceMFAPolicy&lt;/code&gt; e salve.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Anexar as políticas aos grupos
&lt;/h3&gt;

&lt;p&gt;Para cada grupo, adicione as duas políticas abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;IAMUserChangePassword&lt;/code&gt; — permite que o usuário troque sua própria senha no primeiro acesso&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EnforceMFAPolicy&lt;/code&gt; — bloqueia acesso a qualquer recurso enquanto o MFA não estiver configurado&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Acesse &lt;strong&gt;IAM → User groups → [nome do grupo] → Permissions → Add permissions → Attach policies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para aplicar em todos os grupos de uma vez, use a política diretamente:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IAM → Policies → EnforceMFAPolicy → Entities attached → Attach → selecione todos os grupos → Attach&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Boas práticas aplicadas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mínimo privilégio&lt;/strong&gt; — cada grupo tem apenas as permissões necessárias para sua função&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MFA obrigatório&lt;/strong&gt; — nenhum usuário acessa recursos sem segundo fator ativo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Troca de senha no primeiro acesso&lt;/strong&gt; — o parâmetro &lt;code&gt;--password-reset-required&lt;/code&gt; garante que o usuário defina sua própria senha&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automação auditável&lt;/strong&gt; — o script e o CSV podem ser versionados e revisados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nunca usar o usuário root&lt;/strong&gt; — toda operação deve ser feita com usuários IAM com permissões adequadas&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Considerações finais
&lt;/h2&gt;

&lt;p&gt;O mesmo processo funciona para qualquer escala — 10 ou 10.000 usuários. Para ambientes maiores, o próximo passo natural é evoluir para &lt;strong&gt;AWS SSO (IAM Identity Center)&lt;/strong&gt; com integração a um provedor de identidade como Azure AD ou Okta, eliminando a necessidade de gerenciar senhas individuais no IAM.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html" rel="noopener noreferrer"&gt;Introdução ao IAM – AWS Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/best-practices.html" rel="noopener noreferrer"&gt;Boas práticas de segurança no IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html" rel="noopener noreferrer"&gt;Gerenciar usuários IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/id_groups.html" rel="noopener noreferrer"&gt;Gerenciar grupos IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/pt_br/IAM/latest/UserGuide/access_policies.html" rel="noopener noreferrer"&gt;Políticas e permissões no IAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html" rel="noopener noreferrer"&gt;Tutorial: MFA obrigatório com política IAM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See you later 🤘🏻&lt;/p&gt;

</description>
      <category>aws</category>
      <category>iam</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Bicep: A Linguagem Moderna de IaC para Azure</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Tue, 02 Jun 2026 17:46:37 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/bicep-a-linguagem-moderna-de-iac-para-azure-5h0</link>
      <guid>https://dev.to/luiscruzcwb/bicep-a-linguagem-moderna-de-iac-para-azure-5h0</guid>
      <description>&lt;p&gt;Se você já trabalhou com &lt;strong&gt;ARM Templates&lt;/strong&gt; na Azure, sabe bem o quanto pode ser frustrante: arquivos JSON verbosos, difíceis de ler e ainda mais difíceis de manter. O &lt;strong&gt;Bicep&lt;/strong&gt; chegou para resolver exatamente isso, uma linguagem de domínio específico (DSL) criada pela &lt;strong&gt;Microsoft&lt;/strong&gt; para declarar infraestrutura no Azure de forma limpa, simples e poderosa.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Bicep?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bicep&lt;/strong&gt; é uma linguagem de IaC (Infrastructure as Code) desenvolvida pela Microsoft que compila diretamente para ARM Templates. Ou seja, por baixo dos panos, a Azure ainda usa ARM, mas você escreve um código muito mais legível e produtivo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bicep é o ARM Template que você sempre quis escrever."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lançado em 2021 como GA (Generally Available), o Bicep é hoje a forma &lt;strong&gt;recomendada pela Microsoft&lt;/strong&gt; para definir recursos Azure via código.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que usar Bicep e não ARM Templates puro?
&lt;/h2&gt;

&lt;p&gt;Veja a diferença para criar um simples Storage Account:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARM Template (JSON):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"storageAccountName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Storage/storageAccounts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-09-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('storageAccountName')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[resourceGroup().location]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Standard_LRS"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"StorageV2"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bicep (equivalente):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;param storageAccountName string

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: resourceGroup().location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito mais limpo, não é? Menos linhas, sem JSON aninhado e sem aquelas funções &lt;code&gt;[parameters(...)]&lt;/code&gt; espalhadas por todo lado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bicep vs ARM vs Terraform: qual escolher?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Bicep&lt;/th&gt;
&lt;th&gt;ARM Template&lt;/th&gt;
&lt;th&gt;Terraform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sintaxe&lt;/td&gt;
&lt;td&gt;Limpa, DSL própria&lt;/td&gt;
&lt;td&gt;JSON verboso&lt;/td&gt;
&lt;td&gt;HCL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-cloud&lt;/td&gt;
&lt;td&gt;❌ Apenas Azure&lt;/td&gt;
&lt;td&gt;❌ Apenas Azure&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suporte a recursos Azure&lt;/td&gt;
&lt;td&gt;✅ Primeiro dia&lt;/td&gt;
&lt;td&gt;✅ Primeiro dia&lt;/td&gt;
&lt;td&gt;⚠️ Depende do provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Curva de aprendizado&lt;/td&gt;
&lt;td&gt;Baixa&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;Média&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State file&lt;/td&gt;
&lt;td&gt;❌ Não precisa&lt;/td&gt;
&lt;td&gt;❌ Não precisa&lt;/td&gt;
&lt;td&gt;✅ Necessário&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Módulos&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;td&gt;⚠️ Linked templates&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integração nativa Azure DevOps/GitHub&lt;/td&gt;
&lt;td&gt;✅ Nativa&lt;/td&gt;
&lt;td&gt;✅ Nativa&lt;/td&gt;
&lt;td&gt;Requer setup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Resumo prático:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se você trabalha &lt;strong&gt;exclusivamente com Azure&lt;/strong&gt; → Bicep é a melhor escolha&lt;/li&gt;
&lt;li&gt;Se precisa de &lt;strong&gt;multi-cloud&lt;/strong&gt; → Terraform&lt;/li&gt;
&lt;li&gt;Se está &lt;strong&gt;migrando ARM existente&lt;/strong&gt; → Bicep (tem conversor automático!)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pré-requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/pt-br/cli/azure/install-azure-cli" rel="noopener noreferrer"&gt;Azure CLI&lt;/a&gt; instalado&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalar o Bicep CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Via Azure CLI (recomendado)&lt;/span&gt;
az bicep &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Verificar versão&lt;/span&gt;
az bicep version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extensão para VS Code
&lt;/h3&gt;

&lt;p&gt;Instale a extensão oficial &lt;strong&gt;Bicep&lt;/strong&gt; da Microsoft no VS Code. Ela oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IntelliSense completo&lt;/li&gt;
&lt;li&gt;Validação em tempo real&lt;/li&gt;
&lt;li&gt;Autocompletar de tipos de recursos e propriedades&lt;/li&gt;
&lt;li&gt;Visualização do diagrama de dependências&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conceitos Fundamentais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Parâmetros (&lt;code&gt;param&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@description('Nome do ambiente')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'

@minLength(3)
@maxLength(24)
param storageAccountName string
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os &lt;strong&gt;decorators&lt;/strong&gt; (&lt;code&gt;@description&lt;/code&gt;, &lt;code&gt;@allowed&lt;/code&gt;, &lt;code&gt;@minLength&lt;/code&gt;) substituem as validações que no ARM eram feitas dentro do JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Variáveis (&lt;code&gt;var&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var location = resourceGroup().location
var tags = {
  environment: environment
  project: 'meu-projeto'
  managedBy: 'bicep'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Recursos (&lt;code&gt;resource&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: 'plan-${environment}'
  location: location
  tags: tags
  sku: {
    name: 'B1'
    tier: 'Basic'
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Outputs (&lt;code&gt;output&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output appServicePlanId string = appServicePlan.id
output storageAccountEndpoint string = storageAccount.properties.primaryEndpoints.blob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exemplo Prático: Web App com Storage
&lt;/h2&gt;

&lt;p&gt;Vamos criar um arquivo Bicep que provisiona um &lt;strong&gt;App Service + Storage Account&lt;/strong&gt; completo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// main.bicep

@description('Prefixo para os recursos')
param prefix string

@description('Ambiente de deploy')
@allowed(['dev', 'staging', 'prod'])
param environment string = 'dev'

var location = resourceGroup().location
var tags = {
  environment: environment
  managedBy: 'bicep'
}

// Storage Account
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '${prefix}${environment}st'
  location: location
  tags: tags
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
    supportsHttpsTrafficOnly: true
    minimumTlsVersion: 'TLS1_2'
  }
}

// App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: '${prefix}-${environment}-plan'
  location: location
  tags: tags
  sku: {
    name: environment == 'prod' ? 'S1' : 'B1'
  }
}

// Web App
resource webApp 'Microsoft.Web/sites@2022-03-01' = {
  name: '${prefix}-${environment}-app'
  location: location
  tags: tags
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      appSettings: [
        {
          name: 'STORAGE_CONNECTION'
          value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};AccountKey=${storageAccount.listKeys().keys[0].value}'
        }
      ]
    }
  }
}

output webAppUrl string = 'https://${webApp.properties.defaultHostName}'
output storageAccountName string = storageAccount.name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar Resource Group&lt;/span&gt;
az group create &lt;span class="nt"&gt;--name&lt;/span&gt; rg-meu-projeto-dev &lt;span class="nt"&gt;--location&lt;/span&gt; brazilsouth

&lt;span class="c"&gt;# Preview do que será criado (What-If)&lt;/span&gt;
az deployment group what-if &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-meu-projeto-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--template-file&lt;/span&gt; main.bicep &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;meuprojeto &lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev

&lt;span class="c"&gt;# Deploy&lt;/span&gt;
az deployment group create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-meu-projeto-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--template-file&lt;/span&gt; main.bicep &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--parameters&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;meuprojeto &lt;span class="nv"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Módulos: reutilizando código
&lt;/h2&gt;

&lt;p&gt;Uma das funcionalidades mais poderosas do Bicep são os &lt;strong&gt;módulos&lt;/strong&gt;, que permitem quebrar a infraestrutura em partes reutilizáveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// modules/storage.bicep
param name string
param location string = resourceGroup().location

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: name
  location: location
  sku: { name: 'Standard_LRS' }
  kind: 'StorageV2'
}

output id string = storageAccount.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// main.bicep — usando o módulo
module storage './modules/storage.bicep' = {
  name: 'storageDeployment'
  params: {
    name: 'mystorageaccount'
  }
}

output storageId string = storage.outputs.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode referenciar módulos diretamente de um &lt;strong&gt;Bicep Registry&lt;/strong&gt; (ACR) para compartilhar entre times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module storage 'br:meuregistry.azurecr.io/bicep/storage:v1.0' = {
  name: 'storageDeployment'
  params: {
    name: 'mystorageaccount'
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Convertendo ARM Templates existentes para Bicep
&lt;/h2&gt;

&lt;p&gt;Se você já tem ARM Templates, a migração é simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Decompila ARM Template para Bicep&lt;/span&gt;
az bicep decompile &lt;span class="nt"&gt;--file&lt;/span&gt; template.json

&lt;span class="c"&gt;# Converte Bicep de volta para ARM (útil para debug)&lt;/span&gt;
az bicep build &lt;span class="nt"&gt;--file&lt;/span&gt; main.bicep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Dicas e Boas Práticas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use parâmetros com defaults&lt;/strong&gt; para ambientes distintos (&lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adicione tags&lt;/strong&gt; em todos os recursos para facilitar o custo e governança&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;what-if&lt;/code&gt;&lt;/strong&gt; antes de todo deploy em produção&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize em módulos&lt;/strong&gt; desde o início evita refatorações grandes depois&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versione no Git&lt;/strong&gt; junto ao código da aplicação (mesmo repositório)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use o Bicep Registry&lt;/strong&gt; (Azure Container Registry) para compartilhar módulos entre projetos e times&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Próximos passos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/azure/azure-resource-manager/bicep/" rel="noopener noreferrer"&gt;Documentação oficial do Bicep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aka.ms/bicepdemo" rel="noopener noreferrer"&gt;Bicep Playground&lt;/a&gt; — teste Bicep no browser&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.github.io/Azure-Verified-Modules/" rel="noopener noreferrer"&gt;Azure Verified Modules&lt;/a&gt; — módulos Bicep oficiais e auditados pela Microsoft&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O Bicep é, sem dúvida, a evolução natural para quem trabalha com IaC na Azure. Se você ainda usa ARM Templates puros, vale muito a pena considerar a migração, pois a curva de aprendizado é baixa e os ganhos em produtividade e manutenibilidade são imediatos.&lt;/p&gt;

&lt;p&gt;E você, já está usando Bicep nos seus projetos? Deixa nos comentários!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>bicep</category>
      <category>iac</category>
      <category>devops</category>
    </item>
    <item>
      <title>Automação GitOps com Terraform e Proxmox</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Fri, 30 Jan 2026 14:45:43 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/automacao-gitops-com-terraform-e-proxmox-12m7</link>
      <guid>https://dev.to/luiscruzcwb/automacao-gitops-com-terraform-e-proxmox-12m7</guid>
      <description>&lt;p&gt;Há alguns meses, adquiri um &lt;strong&gt;M910q Desktop (ThinkCentre)&lt;/strong&gt; para utilizá-lo no meu homelab, permitindo que o WSL do meu Lenovo S145 tivesse um pouco de descanso.&lt;/p&gt;

&lt;p&gt;Essa iniciativa faz parte da minha busca contínua por evolução técnica, criando ambientes de teste e homologação que me permitam experimentar novas ferramentas e abordagens com mais liberdade.&lt;/p&gt;

&lt;p&gt;Na criação das VMs, sempre utilizei o Terraform para o provisionamento. No entanto, recentemente realizei alguns ajustes importantes, integrando o GitHub e o &lt;a href="https://developer.hashicorp.com/terraform/cloud-docs" rel="noopener noreferrer"&gt;HCP Terraform&lt;/a&gt; ao fluxo de trabalho.&lt;/p&gt;

&lt;p&gt;Após dedicar algumas horas a esse processo, concluí um projeto que mudou completamente a forma como gerencio minha infraestrutura de homelab, e decidi compartilhar essa jornada com vocês.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O problema inicial&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sempre que eu precisava criar uma VM no Proxmox, o processo se repetia: abrir a interface web, preencher formulários, configurar rede manualmente, aguardar a criação da VM, acessar via SSH e configurar o ambiente. &lt;/p&gt;

&lt;p&gt;Além disso, era necessário torcer para lembrar exatamente quais passos haviam sido executados caso fosse preciso replicar o processo no futuro. &lt;/p&gt;

&lt;p&gt;Não havia histórico de mudanças, automação consistente ou rastreabilidade.&lt;/p&gt;

&lt;p&gt;Mesmo utilizando scripts ou o próprio Terraform, ainda existiam etapas manuais, tornando o processo mais demorado do que deveria e com pontos claros de melhoria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A solução: GitOps + Terraform + GitHub Actions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementei um fluxo completo de GitOps, no qual toda a infraestrutura passou a ser gerenciada exclusivamente por código versionado em Git.&lt;/p&gt;

&lt;p&gt;O resultado foi bastante expressivo.&lt;/p&gt;

&lt;p&gt;Hoje, consigo criar, modificar ou remover VMs simplesmente realizando um commit e um push. Em cerca de dois a três minutos, a alteração é automaticamente aplicada no ambiente Proxmox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que aprendi no caminho&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nem tudo é simples, especialmente para quem está começando do zero.&lt;/p&gt;

&lt;p&gt;Como já possuo uma boa experiência com essas ferramentas, configurar corretamente as permissões no Proxmox, implementar um self-hosted runner na rede local, já que o Proxmox não é acessível diretamente da nuvem, e estruturar o código de forma escalável e reutilizável não foi algo particularmente difícil.&lt;/p&gt;

&lt;p&gt;Ainda assim, cada etapa se mostrou uma oportunidade de aprendizado e de refinamento dos processos relacionados a Infrastructure as Code, CI/CD e boas práticas de automação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: para quem nunca fez algo semelhante, deixei um passo a passo detalhado, além de uma FAQ, para facilitar a reprodução do ambiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tecnologias utilizadas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A stack é 100% open source e gratuita. &lt;/p&gt;

&lt;p&gt;Utilizei Terraform para IaC, GitHub Actions para automação, Terraform Cloud para gerenciamento remoto de estado e Proxmox como hypervisor. Tudo isso rodando em um ambiente self-hosted, garantindo controle total sobre os dados e a infraestrutura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O impacto real&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes: entre 15 e 20 minutos para criar cada VM, com um processo manual, sujeito a erros e sem histórico de alterações.&lt;/p&gt;

&lt;p&gt;Agora: cerca de 30 segundos para definir a VM em código, seguido de commit e push automáticos, com rastreabilidade completa via Git.&lt;/p&gt;

&lt;p&gt;Mais importante do que o tempo economizado foi o ganho em confiabilidade.&lt;/p&gt;

&lt;p&gt;Cada mudança passa por revisão, fica registrada no histórico do Git e pode ser revertida facilmente com um simples git revert. Isso é especialmente valioso em ambientes de experimentação, onde a possibilidade de voltar atrás com segurança faz toda a diferença.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lições aprendidas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automação não é sobre eliminar o trabalho manual, mas sim reduzir tarefas repetitivas e propensas a erros.&lt;/p&gt;

&lt;p&gt;Infrastructure as Code não é exclusiva de grandes empresas. Homelabs são ambientes ideais para experimentação.&lt;/p&gt;

&lt;p&gt;Documentação é tão importante quanto o código. Dediquei tempo a documentar cada etapa pensando no meu “eu do futuro”.&lt;/p&gt;

&lt;p&gt;Self-hosted runners ampliam significativamente as possibilidades de automação em ambientes locais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp19lnc9a36u6i7zvurl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp19lnc9a36u6i7zvurl5.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Próximos passos / Melhorias&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Pretendo evoluir esse projeto integrando o Ansible, já que atualmente utilizo o &lt;a href="https://semaphoreui.com/" rel="noopener noreferrer"&gt;Semaphore UI&lt;/a&gt; para a configuração pós-criação das VMs, além de adicionar testes automatizados antes do deploy.&lt;/p&gt;

&lt;p&gt;Para quem se interessou pelos detalhes técnicos da implementação, e quiser fazer a implementação, o passo a passo, incluindo troubleshooting de todos os problemas enfrentados: &lt;a href="https://github.com/luiscruzcwb/homelab-infrastructure-template.git" rel="noopener noreferrer"&gt;homelab-infrastructure-template&lt;br&gt;
Public&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trabalhar com infraestrutura é uma jornada contínua de aprendizado.&lt;/p&gt;

&lt;p&gt;Compartilhar conhecimento e aprender com a comunidade faz toda a diferença.&lt;/p&gt;




</description>
      <category>devops</category>
      <category>gitops</category>
      <category>terraform</category>
      <category>proxmox</category>
    </item>
    <item>
      <title>Windows - Instalando o WSL 2 e o Docker</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Wed, 10 Dec 2025 02:12:55 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/windows-instalando-o-wsl-e-o-docker-1bi2</link>
      <guid>https://dev.to/luiscruzcwb/windows-instalando-o-wsl-e-o-docker-1bi2</guid>
      <description>&lt;p&gt;Se você usa Windows e precisa trabalhar com Docker, Terraform, scripts Bash ou qualquer ferramenta nativa de Linux, o &lt;strong&gt;WSL 2 (Windows Subsystem for Linux)&lt;/strong&gt; é o caminho certo. Ele roda um kernel Linux real dentro do Windows — sem dual boot, sem máquina virtual pesada — e se integra perfeitamente com o Docker.&lt;/p&gt;

&lt;p&gt;Neste artigo você vai instalar o WSL 2 com Ubuntu e configurar o Docker, com duas opções: via &lt;strong&gt;Docker Desktop&lt;/strong&gt; (mais simples) ou via &lt;strong&gt;Docker Engine&lt;/strong&gt; direto no Linux (mais leve).&lt;/p&gt;




&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows 11 ou Windows 10 (build 19041 ou superior)&lt;/li&gt;
&lt;li&gt;Virtualização por hardware habilitada na BIOS/UEFI&lt;/li&gt;
&lt;li&gt;Conexão à internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para verificar se a virtualização está ativa, abra o Gerenciador de Tarefas → aba &lt;strong&gt;Desempenho&lt;/strong&gt; → CPU → confirme que "Virtualização: Habilitado" aparece.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Instalar o WSL 2
&lt;/h2&gt;

&lt;p&gt;Abra o &lt;strong&gt;PowerShell como Administrador&lt;/strong&gt; e execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando habilita os componentes necessários, instala o WSL 2 e baixa o &lt;strong&gt;Ubuntu&lt;/strong&gt; como distribuição padrão. Ao final, reinicie o computador quando solicitado.&lt;/p&gt;

&lt;p&gt;Para instalar uma distribuição diferente, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# listar distribuições disponíveis&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--online&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# instalar uma específica&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Debian&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verificar a instalação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-v&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A coluna &lt;strong&gt;VERSION&lt;/strong&gt; deve mostrar &lt;code&gt;2&lt;/code&gt; para confirmar que está usando WSL 2. Novas instalações com &lt;code&gt;wsl --install&lt;/code&gt; já são configuradas para WSL 2 por padrão.&lt;/p&gt;

&lt;p&gt;Para instruções detalhadas, consulte a &lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="noopener noreferrer"&gt;documentação oficial da Microsoft&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Instalar o Docker
&lt;/h2&gt;

&lt;p&gt;Você tem duas opções. Escolha a que melhor se encaixa no seu uso:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Docker Desktop&lt;/th&gt;
&lt;th&gt;Docker Engine no WSL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface gráfica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Sim&lt;/td&gt;
&lt;td&gt;❌ Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;td&gt;Média&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumo de recursos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maior&lt;/td&gt;
&lt;td&gt;Menor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licença&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gratuito para uso pessoal&lt;/td&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recomendado para&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Iniciantes e uso geral&lt;/td&gt;
&lt;td&gt;Devs que preferem CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Opção A: Docker Desktop com integração WSL 2
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Baixe o &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop para Windows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Durante a instalação, mantenha marcada a opção &lt;strong&gt;Use WSL 2 instead of Hyper-V&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Após instalar, abra o Docker Desktop e vá em &lt;strong&gt;Settings → General&lt;/strong&gt; → ative &lt;strong&gt;Use the WSL 2 based engine&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Em &lt;strong&gt;Settings → Resources → WSL Integration&lt;/strong&gt;, habilite a distro que você usa (ex: Ubuntu)&lt;/li&gt;
&lt;li&gt;Abra o terminal do WSL — os comandos &lt;code&gt;docker&lt;/code&gt; e &lt;code&gt;docker compose&lt;/code&gt; já estarão disponíveis
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Opção B: Docker Engine dentro do Ubuntu (WSL 2)
&lt;/h3&gt;

&lt;p&gt;Abra o terminal do Ubuntu no WSL e execute os passos abaixo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adicionar o repositório oficial do Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ca-certificates curl gnupg lsb-release

curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/docker-archive-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Instalar o Docker Engine e o Compose:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Adicionar seu usuário ao grupo docker&lt;/strong&gt; (evita usar &lt;code&gt;sudo&lt;/code&gt; a cada comando):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reiniciar o WSL&lt;/strong&gt; para aplicar as permissões. No PowerShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--shutdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reabra o terminal do Ubuntu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iniciar o daemon do Docker:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;service docker start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se quiser que o Docker inicie automaticamente, ative o systemd no WSL adicionando ao &lt;code&gt;/etc/wsl.conf&lt;/code&gt;:&lt;/p&gt;


&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[boot]&lt;/span&gt;
&lt;span class="py"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Após salvar, execute &lt;code&gt;wsl --shutdown&lt;/code&gt; no PowerShell e reabra o WSL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Verificar a instalação:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; hello-world
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consulte o &lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;guia oficial de instalação no Ubuntu&lt;/a&gt; para mais detalhes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Exemplos práticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Subir um NGINX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; exemplo-nginx &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;-d&lt;/span&gt; nginx:stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acesse &lt;code&gt;http://localhost:8080&lt;/code&gt; no navegador do Windows, o Docker no WSL expõe as portas automaticamente para o host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usar Docker Compose
&lt;/h3&gt;

&lt;p&gt;Crie um arquivo &lt;code&gt;compose.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:stable&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# subir os serviços&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# verificar status&lt;/span&gt;
docker compose ps

&lt;span class="c"&gt;# ver logs em tempo real&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# encerrar e remover os containers&lt;/span&gt;
docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="noopener noreferrer"&gt;Como instalar o WSL – Microsoft (pt-BR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/windows/wsl/wsl-config" rel="noopener noreferrer"&gt;Configuração do WSL (wsl.conf / systemd)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/desktop/wsl/" rel="noopener noreferrer"&gt;Docker Desktop: integração com WSL 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;Instalar Docker Engine no Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Documentação do Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>wsl</category>
      <category>windows</category>
      <category>linux</category>
    </item>
    <item>
      <title>O que é Gemba? E como aplicar em times de DevOps remotos</title>
      <dc:creator>Luis Cruz</dc:creator>
      <pubDate>Fri, 24 Oct 2025 19:13:53 +0000</pubDate>
      <link>https://dev.to/luiscruzcwb/o-que-e-gemba-211d</link>
      <guid>https://dev.to/luiscruzcwb/o-que-e-gemba-211d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Gemba&lt;/strong&gt; (現場) é um termo japonês que significa, literalmente, &lt;em&gt;"o lugar real"&lt;/em&gt; ou &lt;em&gt;"onde as coisas acontecem"&lt;/em&gt;. Popularizado pelo Lean Manufacturing, o conceito é simples: para entender um problema de verdade, você precisa ir até onde ele acontece, não confiar apenas em relatórios ou reuniões.&lt;/p&gt;

&lt;p&gt;Mas o que isso tem a ver com times de DevOps, engenharia de software e ambientes remotos? Muito mais do que parece.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é Lean?
&lt;/h2&gt;

&lt;p&gt;Antes de aprofundar no Gemba, vale contextualizar: o &lt;strong&gt;Lean&lt;/strong&gt; (também chamado de Lean Thinking ou Mentalidade Enxuta) é uma filosofia de gestão originada na Toyota que busca maximizar valor e eliminar desperdícios em processos. Nos últimos anos, seus princípios migraram da manufatura para times de tecnologia — e se tornaram base de frameworks como DevOps, Agile e SRE.&lt;/p&gt;

&lt;p&gt;O Gemba é um dos pilares práticos do Lean.&lt;/p&gt;




&lt;h2&gt;
  
  
  O conceito de Gemba
&lt;/h2&gt;

&lt;p&gt;No contexto empresarial, o Gemba é o local onde o valor é criado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em uma fábrica → o chão de produção&lt;/li&gt;
&lt;li&gt;Em uma empresa de software → onde os desenvolvedores codificam e operam sistemas&lt;/li&gt;
&lt;li&gt;Em uma loja de varejo → o piso de atendimento ao cliente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A filosofia incentiva líderes e gestores a irem até esse local para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Observar os processos diretamente&lt;/li&gt;
&lt;li&gt;Identificar problemas reais, não apenas dados em relatórios&lt;/li&gt;
&lt;li&gt;Ouvir os colaboradores que estão na linha de frente&lt;/li&gt;
&lt;li&gt;Tomar decisões baseadas em fatos, não em suposições&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Gemba Walk
&lt;/h2&gt;

&lt;p&gt;O conceito associado mais conhecido é o &lt;strong&gt;Gemba Walk&lt;/strong&gt; — uma visita estruturada ao local de trabalho com o objetivo de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entender o fluxo de trabalho real&lt;/li&gt;
&lt;li&gt;Detectar desperdícios ou gargalos&lt;/li&gt;
&lt;li&gt;Promover a melhoria contínua (Kaizen)&lt;/li&gt;
&lt;li&gt;Fortalecer o relacionamento entre gestão e equipe&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; o Gemba Walk não é uma auditoria ou fiscalização. É uma oportunidade de aprendizado mútuo — a ideia é entender, não julgar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Princípios de uma boa prática de Gemba
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Princípio&lt;/th&gt;
&lt;th&gt;Como aplicar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ir ao Gemba&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visite o local real com frequência, sem intermediários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observar com propósito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Veja como o trabalho realmente é feito, não como deveria ser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fazer perguntas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Entenda os "porquês" por trás dos processos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ouvir os colaboradores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eles conhecem os desafios diários melhor que qualquer relatório&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agir com respeito&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A ideia é aprender, nunca expor ou pressionar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Promover melhorias&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use os insights para implementar melhorias sustentáveis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Benefícios do Gemba
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Aumento da eficiência operacional&lt;/li&gt;
&lt;li&gt;Redução de desperdícios no fluxo de trabalho&lt;/li&gt;
&lt;li&gt;Maior engajamento e confiança da equipe&lt;/li&gt;
&lt;li&gt;Tomada de decisão mais assertiva e baseada em fatos&lt;/li&gt;
&lt;li&gt;Cultura de melhoria contínua enraizada no dia a dia&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Como aplicar Gemba e Lean com trabalho remoto e times distribuídos
&lt;/h2&gt;

&lt;p&gt;Essa é a pergunta prática: como ir ao "lugar real" quando o time está espalhado em fusos diferentes?&lt;/p&gt;

&lt;p&gt;A resposta é que o Gemba não precisa ser físico — ele precisa ser &lt;strong&gt;real&lt;/strong&gt;. Em times remotos, o Gemba é o espaço digital onde o trabalho acontece.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redefinindo o Gemba no remoto
&lt;/h3&gt;

&lt;p&gt;O "lugar real" de um time de tecnologia remoto está em:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Repositórios de código&lt;/strong&gt; — GitHub, GitLab (onde o trabalho é registrado)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sistemas de tickets&lt;/strong&gt; — Jira, Linear, ServiceNow (onde o fluxo é visível)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards de observabilidade&lt;/strong&gt; — Grafana, Prometheus, Datadog (onde os problemas aparecem)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas de colaboração&lt;/strong&gt; — Slack, Teams, Confluence (onde as decisões acontecem)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipelines de CI/CD&lt;/strong&gt; — onde o valor chega ao cliente&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fazendo Gemba Walks digitais
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ação&lt;/th&gt;
&lt;th&gt;Como adaptar no remoto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observar o trabalho em tempo real&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sessões de pair programming, compartilhamento de tela, gravações de Loom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fazer perguntas abertas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check-ins por vídeo ou threads assíncronas no Slack/Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identificar desperdícios&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Analisar tempo de espera em PRs, filas de aprovação, lead time no Jira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Documentar aprendizados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logs de Gemba Walks no Confluence ou Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Aplicando Lean no remoto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mapeie o fluxo de valor digital (Value Stream Mapping)
&lt;/h3&gt;

&lt;p&gt;Entenda todas as etapas entre a demanda e a entrega. Exemplo em infraestrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Solicitação → Escrita do Terraform → Code Review → CI/CD → Validação → Deploy → Monitoramento
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada etapa pode ter desperdícios escondidos — tempo de espera, retrabalho, falta de clareza.&lt;/p&gt;

&lt;h3&gt;
  
  
  Identifique desperdícios remotos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Espera por aprovações manuais&lt;/li&gt;
&lt;li&gt;Retrabalho por requisitos mal definidos&lt;/li&gt;
&lt;li&gt;Sobrecarga por excesso de reuniões&lt;/li&gt;
&lt;li&gt;Falta de visibilidade do progresso para o time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Estimule o Kaizen remoto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Faça retrospectivas Lean curtas e frequentes (não apenas no fim do sprint)&lt;/li&gt;
&lt;li&gt;Capture ideias de melhoria em murais colaborativos (Miro, FigJam)&lt;/li&gt;
&lt;li&gt;Implemente pequenas melhorias rápidas e meça os resultados antes de escalar&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Ferramentas para suportar Lean + Gemba em times remotos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Ferramentas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gestão visual (Kanban)&lt;/td&gt;
&lt;td&gt;Trello, Jira, Linear, Asana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automação e fluxo&lt;/td&gt;
&lt;td&gt;GitHub Actions, GitLab CI/CD, Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observabilidade&lt;/td&gt;
&lt;td&gt;Grafana, Prometheus, Datadog, New Relic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colaboração&lt;/td&gt;
&lt;td&gt;Slack, Zoom, Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentação de Gemba Walks&lt;/td&gt;
&lt;td&gt;Confluence, Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Exemplo prático: Gemba em uma equipe de DevOps remota
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problema identificado&lt;/th&gt;
&lt;th&gt;Gemba Walk digital&lt;/th&gt;
&lt;th&gt;Ação Lean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Demora no provisionamento de VMs&lt;/td&gt;
&lt;td&gt;Acompanhar fluxo no Terraform + GitLab CI com a equipe&lt;/td&gt;
&lt;td&gt;Automatizar aprovações com policy as code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incidentes frequentes em produção&lt;/td&gt;
&lt;td&gt;Analisar logs no Grafana + entrevistar o on-call&lt;/td&gt;
&lt;td&gt;Criar runbooks e alertas mais precisos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backlog sem clareza&lt;/td&gt;
&lt;td&gt;Revisitar o Jira ao vivo com o time&lt;/td&gt;
&lt;td&gt;Definir Definition of Ready para cada ticket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Gemba não é um conceito preso em fábricas japonesas dos anos 1950. É uma mentalidade que permanece relevante em qualquer contexto onde haja trabalho real acontecendo — incluindo times de DevOps, engenharia de plataforma e operações em nuvem.&lt;/p&gt;

&lt;p&gt;A chave está em fazer a pergunta certa: &lt;em&gt;onde, de fato, o trabalho acontece no nosso time?&lt;/em&gt; E depois ir lá — seja fisicamente ou digitalmente — para observar, ouvir e melhorar de forma contínua.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Em inglês:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kaizen.com/insights/gemba/" rel="noopener noreferrer"&gt;Gemba and Its Meaning – The Heart of Lean Management (Kaizen Institute)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.processexcellencenetwork.com/lean-six-sigma-business-performance/articles/what-is-lean" rel="noopener noreferrer"&gt;What is Lean? (Process Excellence Network)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leanconstruction.org/" rel="noopener noreferrer"&gt;Gemba Walks in Lean Construction (LeanConstruction.org)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Em português:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://voitto.com.br/blog/artigo/gemba" rel="noopener noreferrer"&gt;Gemba: entenda o conceito que faz parte do Lean (Voitto)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sydle.com/br/blog/lean-ti" rel="noopener noreferrer"&gt;Lean TI: como otimizar processos de TI (Sydle)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manageengine.com/br/itil/metodologia-lean.html" rel="noopener noreferrer"&gt;Metodologia Lean aplicada à TI (ManageEngine Brasil)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>lean</category>
      <category>agile</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
