Laboratório em bancada
Laboratório: Provisionamento e Hardening de Servidores Linux com Ansible
Você irá provisionar e aplicar hardening básico em dois servidores Linux via Ansible, usando uma máquina de controle dedicada. Em cerca de 2 horas, terá um ambiente automatizado, reproduzível e seguro.

- Duração estimada
- 120 min
- Passos
- 12
- Validações
- 4
Demonstrar como usar Ansible para provisionar, configurar e aplicar políticas de segurança em servidores Linux de forma automatizada. O laboratório cobre desde a preparação do ambiente até a execução de playbooks de hardening, mostrando como reduzir riscos operacionais e padronizar configurações em escala.
Topologia
Uma máquina de controle (Ansible) conecta-se via SSH a dois servidores Linux (alvos), todos em uma rede privada (exemplo: 192.168.56.0/24). Os servidores podem ser VMs locais ou em nuvem. O controle é feito sem agentes nos alvos.
[ansible-control]
|
--------------
| |
[server1] [server2]
192.168.56.11 192.168.56.12
Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| Máquina de controle (VM ou física) | 1 vCPU, 1 GB RAM, Linux (Ubuntu 20.04+ ou CentOS 8+) |
| Servidor alvo 1 (VM) | 1 vCPU, 512 MB RAM, Linux (Ubuntu 20.04+ ou CentOS 8+) |
| Servidor alvo 2 (VM) | 1 vCPU, 512 MB RAM, Linux (Ubuntu 20.04+ ou CentOS 8+) |
| Ansible | GPLv3 · 2.14 |
| OpenSSH | BSD · a versão estável atual |
| Linux (Ubuntu ou CentOS) | GPLv2 · 20.04 ou 8 |
Roteiro
- Preparar as VMs e a rede
Crie três VMs: uma para o Ansible (controle) e duas para os servidores alvos. Coloque todas na mesma rede privada (exemplo: 192.168.56.0/24). Isso simula uma rede real, como em uma rede de fibra dedicada como a da Upnetix.
O que você deve ver: As três VMs se comunicam entre si via ping.
- Instalar o Ansible na máquina de controle
O Ansible é a ferramenta central. Instale-o apenas na máquina de controle para gerenciar os alvos sem agentes.
sudo apt update && sudo apt install ansible -y # Ubuntu # ou sudo dnf install ansible -y # CentOSO que você deve ver: O comando ansible --version retorna a versão instalada.
- Configurar acesso SSH sem senha
O Ansible usa SSH para conectar nos alvos. Gere um par de chaves e copie a chave pública para os dois servidores.
ssh-keygen -t ed25519 -C "ansible-lab" ssh-copy-id user@192.168.56.11 ssh-copy-id user@192.168.56.12O que você deve ver: Acesso SSH sem senha aos dois servidores.
- Testar conectividade SSH
Garanta que o controle acessa os dois alvos via SSH.
ssh user@192.168.56.11 'hostname' ssh user@192.168.56.12 'hostname'O que você deve ver: Os nomes dos hosts dos servidores aparecem no terminal.
- Criar o inventário do Ansible
O inventário define quais hosts o Ansible vai gerenciar. Crie um arquivo chamado hosts.ini.
cat > hosts.ini <<EOF [servidores] 192.168.56.11 ansible_user=user 192.168.56.12 ansible_user=user EOFO que você deve ver: Arquivo hosts.ini criado com os IPs dos servidores.
- Testar o inventário com Ansible
Use o módulo ping do Ansible para testar a comunicação com os alvos.
ansible -i hosts.ini servidores -m pingO que você deve ver: Retorno SUCCESS para ambos os hosts.
- Criar um playbook de provisionamento
Automatize a instalação de pacotes essenciais e atualização do sistema nos servidores.
cat > provisionamento.yml <<EOF - hosts: servidores become: yes tasks: - name: Atualizar pacotes apt: update_cache: yes upgrade: dist when: ansible_facts['os_family'] == 'Debian' - name: Instalar pacotes essenciais apt: name: - curl - vim state: present when: ansible_facts['os_family'] == 'Debian' - name: Atualizar pacotes dnf: name: "*" state: latest when: ansible_facts['os_family'] == 'RedHat' - name: Instalar pacotes essenciais dnf: name: - curl - vim state: present when: ansible_facts['os_family'] == 'RedHat' EOFO que você deve ver: Playbook provisionamento.yml criado.
- Executar o playbook de provisionamento
Aplique o playbook para instalar e atualizar tudo nos servidores.
ansible-playbook -i hosts.ini provisionamento.ymlO que você deve ver: Saída indicando mudanças e sucesso nas tarefas.
- Criar um playbook de hardening básico
Implemente políticas de segurança básicas: desabilite root remoto, force SSH seguro, ajuste permissões.
cat > hardening.yml <<EOF - hosts: servidores become: yes tasks: - name: Desabilitar login root via SSH lineinfile: path: /etc/ssh/sshd_config regexp: '^PermitRootLogin' line: 'PermitRootLogin no' - name: Forçar SSH protocolo 2 lineinfile: path: /etc/ssh/sshd_config regexp: '^Protocol' line: 'Protocol 2' - name: Reiniciar SSH service: name: ssh state: restarted when: ansible_facts['os_family'] == 'Debian' - name: Reiniciar SSH service: name: sshd state: restarted when: ansible_facts['os_family'] == 'RedHat' EOFO que você deve ver: Playbook hardening.yml criado.
- Executar o playbook de hardening
Aplique as configurações de segurança nos servidores.
ansible-playbook -i hosts.ini hardening.ymlO que você deve ver: Saída indicando mudanças e sucesso nas tarefas.
- Validar configurações de segurança
Verifique se as políticas de hardening foram aplicadas corretamente.
ansible -i hosts.ini servidores -a "grep '^PermitRootLogin' /etc/ssh/sshd_config"O que você deve ver: Saída mostra 'PermitRootLogin no' nos dois servidores.
- Reexecutar os playbooks (idempotência)
Execute novamente os playbooks para garantir que não há mudanças desnecessárias (idempotência).
ansible-playbook -i hosts.ini provisionamento.yml ansible-playbook -i hosts.ini hardening.ymlO que você deve ver: Saída mostra 'ok' para todas as tarefas, sem 'changed'.
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Verificar acesso SSH sem root | ssh root@192.168.56.11 | Acesso negado para root via SSH. |
| Checar pacotes instalados | ansible -i hosts.ini servidores -a "which curl && which vim" | Caminhos dos binários exibidos nos dois servidores. |
| Verificar atualização do sistema | ansible -i hosts.ini servidores -a "uname -a" | Kernel atualizado conforme esperado. |
| Validar idempotência | ansible-playbook -i hosts.ini provisionamento.yml | Todas as tarefas retornam 'ok', sem 'changed'. |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Falha ao conectar via SSH (Permission denied) | Chave pública não copiada corretamente ou usuário incorreto. | Verifique o usuário e recopie a chave com ssh-copy-id. |
| Módulo apt/dnf não encontrado | Sistema operacional do alvo não suportado ou Ansible desatualizado. | Confira o OS do alvo e a versão do Ansible; atualize se necessário. |
| Playbook trava ao reiniciar SSH | Sessão SSH perdida devido à reinicialização do serviço. | Use become e configure o SSH para não derrubar sessões existentes. |
| Mudanças inesperadas ao reexecutar playbook | Playbook não idempotente (falta de condições ou checagens). | Adicione condições e use módulos Ansible corretamente. |
Segurança e hardening
- Nunca execute playbooks como root direto; use become.
- Desabilite o login root via SSH em todos os servidores.
- Mantenha as chaves SSH protegidas e nunca compartilhe a privada.
- Revise permissões dos arquivos de inventário e playbooks.
- Aplique atualizações de segurança antes de expor servidores à internet.
Checklist final
Referências
- Documentação oficial do Ansible · Ansible (Red Hat) (docs.ansible.com)
- Especificação YAML 1.2 · Yaml (yaml.org)
- Repositório Ansible no GitHub · GitHub (repositório oficial do projeto) (github.com)
