Como reforçar rapidamente a segurança da sua nova VPS com um Playbook Ansible simples!

Sou um desenvolvedor de software movido pela curiosidade e pela paixão por tecnologia. Aqui no blog, compartilho minhas aventuras desbravando novas ferramentas, frameworks e ideias, sempre testando o que há de mais interessante no mundo digital.
Adquiri uma VPS para testes e, confesso, a preguiça de executar as configurações iniciais básicas, como criar um novo usuário ou definir autenticações, pode ser um grande vacilo. Quem nunca adiou um projeto por conta desses pequenos detalhes? Optar pela rapidez, usando o usuário root com senha, pode parecer eficiente no início, mas é um risco. Imagine os testes evoluindo, o projeto sendo implementado e, de repente, sua máquina é invadida porque, hipoteticamente, uma aplicação desatualizada foi instalada com permissões de root. 😱 Aí a questão: como isso pôde acontecer? É por isso que, neste artigo, vou mostrar como automatizar essas "insignificantes" configurações iniciais e fortalecer a segurança de seus projetos.
Conhecendo um pouco do Ansible
O Ansible é uma ferramenta de automação de TI desenvolvida para configurar sistemas, implantar software e orquestrar tarefas mais complexas de forma simplificada, utilizando a linguagem de marcação YAML o primo bonito do HTML que é bem simples. A ideia por trás de sua criação foi proporcionar uma solução de automação mais simples e acessível em comparação com as ferramentas existentes como Puppet e Chef. Ele opera de forma agent-less, significando que não requer instalação de software adicional nos sistemas que estão sendo gerenciados, comunicando-se com eles via SSH e o melhor, é desenvolvido em Python. 💛💙 🐍
Este projeto está disponível no GitHub clicando aqui, para você usar como uma ferramenta, mas se desejar replicá-lo localmente e aprender mais sobre Ansible, continue a leitura:
Instalando o Ansible
Se você ainda não possui o Ansible instalado em sua máquina local, siga as etapas abaixo executando os comandos no seu terminal:
Instale o pacote software-properties-common para adicionar repositórios facilmente:
sudo apt install software-properties-common
Adicione o repositório PPA do Ansible:
sudo add-apt-repository ppa:ansible/ansible
Após adicionar o repositório, atualize a lista de pacotes:
sudo apt update
Agora você pode instalar o Ansible: 😀
sudo apt install ansible
Verifique se o Ansible foi instalado corretamente, exibindo a sua versão:
ansible --version
No Fedora é mais simples:
sudo dnf install ansible
A estrutura de um repositório Ansible
A estrutura de um projeto em Ansible geralmente é direta. No nosso cenário, incluímos apenas três componentes: o arquivo "hosts" um arquivo "readme" com instruções sobre como utilizar o projeto e o playbook, que, na verdade, é um script Ansible.
setupvps/
├─ hosts
├─ playbook.yml
├─ README.md
Criando o playbook Ansible
Antes de iniciar o playbook, crie um arquivo de texto chamado "hosts" e insira o seguinte conteúdo nele:
[all]
# Substitua ESSA linha com o IP da sua VPS
O arquivo "hosts" no Ansible, normalmente chamado de inventário, desempenha um papel fundamental na definição dos nós ou "hosts" nos quais você deseja que o Ansible atue. Este arquivo identifica os nós de máquina, que podem ser servidores, desktops, entre outros, e os grupos de nós aos quais tarefas ou comandos Ansible serão direcionados.
No nosso exemplo, temos apenas um grupo de hosts definido: "all," e esse grupo inclui apenas um host. No entanto, é importante destacar que poderiam existir vários grupos ou vários hosts dentro desse grupo.
Agora, vamos finalmente criar o playbook. Começe pelo cabeçalho:
- name: Configurando uma nova VPS
hosts: all
become: true
Este trecho de script Ansible, intitulado "Configurando uma nova VPS", define uma tarefa que será executada em todos os hosts listados no inventário. O comando become: true indica que as tarefas serão executadas com privilégios elevados, geralmente como superusuário. Essa abordagem permite a configuração inicial da VPS com as ações necessárias para personalização e ajustes.
Trabalhando com variáveis no Ansible
No Ansible, as variáveis desempenham um papel crucial ao lidar com valores que podem variar a cada execução do playbook. Elas proporcionam uma forma de gerenciar dinamicamente as configurações e a execução do playbook, resultando em código mais reutilizável e flexível. As variáveis no Ansible podem ser definidas de diversas maneiras e em vários contextos, seja no playbook, nos arquivos de inventário, em arquivos de variáveis externas, ou até mesmo na linha de comando.
Variáveis no Ansible: Aprenda a tirar o máximo proveito dessa funcionalidade
Este comando cria uma variável que nos permite especificar o nome do usuário que desejamos criar na máquina. Esse usuário será configurado de forma segura e utilizado para operar a VPS.
vars:
new_username: "john_doe"
O nome de usuário padrão é "John Doe," mas você pode alterá-lo para o nome de sua escolha. Além disso, lembre-se de que esse nome pode ser modificado a qualquer momento durante a execução do playbook, e vamos realizar isso facilmente no modo inline, diretamente pelo terminal, quando formos executar o playbook.
Criando tasks no Ansible
Agora vamos criar a primeira task.
tasks:
- name: Criar usuário sem senha
user:
name: "{{ new_username }}"
shell: /bin/bash
password: ""
generate_ssh_key: yes
Este trecho cria um usuário sem senha no sistema. O nome do usuário é fornecido pela variável new_username que criamos anteriormente, o shell é configurado como "/bin/bash", e uma chave SSH é gerada para permitir autenticação sem senha. Essa abordagem é útil quando a autenticação por chave SSH é preferida sobre senha e é bem mais seguro.
Permitindo comandos em sudo sem o uso de senha
Neste bloco de tarefa, uma configuração é realizada para permitir que um usuário possa executar comandos sudo sem ser solicitado a fornecer uma senha.
- name: Permitir sudo sem senha
lineinfile:
dest: /etc/sudoers
line: "{{ new_username }} ALL=(ALL) NOPASSWD: ALL"
validate: "visudo -cf %s"
become: true
become_user: root
Ativando autenticação SSH
Este bloco incorpora uma chave SSH pública específica ao usuário definido, possibilitando que o usuário realize login ou execute comandos via SSH sem a necessidade de uma senha.
- name: Ativar autenticação SSH para o usuário
authorized_key:
user: "{{ new_username }}"
state: present
key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
Desabilitando login no root
Este bloco desativa o login SSH direto como usuário root. Utiliza o módulo "lineinfile" para modificar o arquivo de configuração do SSH, adicionando ou alterando a linha "PermitRootLogin no". Após a alteração, notifica o serviço SSH para reiniciar, assegurando que as mudanças entrem em vigor.
- name: Desativar login SSH como root
lineinfile:
path: /etc/ssh/sshd_config
regex: '^#?PermitRootLogin'
line: 'PermitRootLogin no'
state: present
notify:
- restart ssh
Disparando um evento no Ansible
handlers:
- name: restart ssh
service:
name: ssh
state: restarted
O bloco handlers define ações que só são executadas se notificadas por outras tarefas. No contexto fornecido, ele especifica o que deve acontecer quando uma tarefa notifica o handler restart ssh.
Então, se uma tarefa no playbook fizer mudanças que necessitem de uma reinicialização do serviço SSH (por exemplo, a tarefa que altera o arquivo /etc/ssh/sshd_config para desativar o login do root), ela notificará esse handler, e o serviço SSH será reiniciado, aplicando as novas configurações.
Agora, vem à etapa mais esperada: a execução desse playbook por meio de um comando.
Antes de prosseguir, certifique-se de que a máquina na qual você pretende executar o playbook possui acesso à VPS. Caso o acesso seja feito por meio de senha, é recomendável adicionar sua chave SSH.
ansible-playbook playbook.yml -i hosts -u root -e "new_username=ricardotenv"
Ao executar este comando, utilizamos o arquivo hosts como parâmetro de -i. Como há apenas um grupo no inventário, não é necessário especificar o nome do grupo. Além disso, fornecemos o nome de usuário com -u, que o Ansible usará para configurar a máquina. Como se trata de uma máquina nova, o usuário é root. Por fim, como mencionado anteriormente, especificamos o nome de usuário que desejamos criar, no meu caso, o meu próprio.




