Entrar ou criar conta

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.

Automação de TI com Ansible: do provisionamento à segurança
Ligado ao treinamento Automação de TI com Ansible: do provisionamento à segurança
Duração estimada
120 min
Passos
12
Validações
4
Objetivo

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

ItemRequisito, 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+)
AnsibleGPLv3 · 2.14
OpenSSHBSD · a versão estável atual
Linux (Ubuntu ou CentOS)GPLv2 · 20.04 ou 8

Roteiro

  1. 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.

  2. 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  # CentOS

    O que você deve ver: O comando ansible --version retorna a versão instalada.

  3. 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.12

    O que você deve ver: Acesso SSH sem senha aos dois servidores.

  4. 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.

  5. 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
    EOF

    O que você deve ver: Arquivo hosts.ini criado com os IPs dos servidores.

  6. 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 ping

    O que você deve ver: Retorno SUCCESS para ambos os hosts.

  7. 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'
    EOF

    O que você deve ver: Playbook provisionamento.yml criado.

  8. Executar o playbook de provisionamento

    Aplique o playbook para instalar e atualizar tudo nos servidores.

    ansible-playbook -i hosts.ini provisionamento.yml

    O que você deve ver: Saída indicando mudanças e sucesso nas tarefas.

  9. 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'
    EOF

    O que você deve ver: Playbook hardening.yml criado.

  10. Executar o playbook de hardening

    Aplique as configurações de segurança nos servidores.

    ansible-playbook -i hosts.ini hardening.yml

    O que você deve ver: Saída indicando mudanças e sucesso nas tarefas.

  11. 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.

  12. 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.yml

    O que você deve ver: Saída mostra 'ok' para todas as tarefas, sem 'changed'.

Como saber que funcionou

TesteComandoCritério
Verificar acesso SSH sem rootssh root@192.168.56.11Acesso negado para root via SSH.
Checar pacotes instaladosansible -i hosts.ini servidores -a "which curl && which vim"Caminhos dos binários exibidos nos dois servidores.
Verificar atualização do sistemaansible -i hosts.ini servidores -a "uname -a"Kernel atualizado conforme esperado.
Validar idempotênciaansible-playbook -i hosts.ini provisionamento.ymlTodas as tarefas retornam 'ok', sem 'changed'.

Troubleshooting

SintomaCausa provávelCorreçã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 encontradoSistema 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 SSHSessã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 playbookPlaybook 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

  1. Documentação oficial do Ansible · Ansible (Red Hat) (docs.ansible.com)
  2. Especificação YAML 1.2 · Yaml (yaml.org)
  3. Repositório Ansible no GitHub · GitHub (repositório oficial do projeto) (github.com)