Skip to content

Instantly share code, notes, and snippets.

@lucasuyezu
Last active November 9, 2019 18:39
Show Gist options
  • Save lucasuyezu/8306429 to your computer and use it in GitHub Desktop.
Save lucasuyezu/8306429 to your computer and use it in GitHub Desktop.
Pinceladas da Web - Draft

Setup de uma máquina Linux

Por que?

Você está com um projeto novo ou existente e acabou de comprar uma máquina. Nela irá o seu banco de dados ou o seu servidor web e com certeza você possui código fonte e dados sigilosos e importantes para o seu negócio nesta máquina. É muito importante proteger esses dados. Embora seja caro contratar um especialista em segurança para cuidar da sua máquina, existem coisas que você pode fazer que vão aumentar drasticamente a segurança dos seus dados.

Eu preciso de conhecimentos avançados?

Não. Se você já faz o básico (entrar numa máquina, instalar servidor e banco de dados) você já sabe o suficiente para seguir este tutorial. Serve para devs front-end, designers, freelas e todo mundo.

SSH

Se você acessa máquinas remotas já usa SSH, através do PuTTY, WinSCP ou outro equivalente. Usuários de Mac ou Linux podem acessar a máquina direto pelo terminal.

ssh root@seu_ip

Pronto, você já está dentro da sua máquina. Agora você precisa fazer as seguintes coisas para evitar ser atacado com facilidade:

  • Trocar a senha de root;
  • Criar o(s) seu(s) usuário(s);
  • Colocar o(s) seu(s) usuário(s) como sudoers e;
  • Trocar a porta de conexão ssh;

Vamos cobrir cada passo.

Troca de senha de root

Quando você instala uma máquina, ela vem com uma senha padrão, ou uma senha que você definiu no momento da instalação. É ALTAMENTE RECOMENDÁVEL que a senha do root tenha letras minúsculas, maiúsculas, números e símbolos. Caso a sua máquina veio sem senha ou com uma senha que você não definiu, troque-a assim:

passwd

Criar o(s) seu(s) usuário(s)

O usuário root é muito poderoso, e só deve ser usado em último caso. O ideal é você ter os seus usuários com permissões definidas, assim se um atacante invadir a sua máquina com o seu usuário, ele não conseguirá fazer tudo que o root pode fazer.

Crie seus usuários assim:

/usr/sbin/adduser seu_usuario

Colocar o(s) seu(s) usuário(s) como sudoers

Sudoers são usuários que podem usar o comando sudo e fazer coisas que um usuário comum não pode, mas sem ter que acessar como root. Para adicionar o seu usuário novo na lista de sudoers, faça:

/usr/sbin/usermod -a -G wheel seu_usuario

Testando as mudanças até agora

É uma boa testar agora o que já foi feito para não termos problemas mais para a frente.

SEM FECHAR A SESSÃO ATUAL, conecte ao servidor usando o usuário e senha que você acabou de criar:

ssh seu_usuario@seu_ip

Se você conseguir se conectar está tudo bem e podemos continuar. Em caso de erro, revise bem o tutorial até agora.

Trocar a porta de conexão ssh

Esse é um passo muito importante, pois todas as ferramentas e técnicas de invasão assumem que as pessoas são preguiçosas e não mexem em nada. Elas assumem que o ssh vai estar ligado na porta padrão, que vai poder se conectar com o usuário root e tudo mais. Trocando esses padrões já ganhamos um nível de segurança imenso.

Entre no arquivo de configuração:

nano /etc/ssh/sshd_config

Lá dentro existem várias coisas, você não precisa entender tudo o que se passa lá, o importante são as linhas abaixo:

Port XXXX
Protocol 2
PermitRootLogin no
UseDNS no
AllowUsers seu_usuario

Se elas já existirem, troque pelo conteúdo acima. Se não, adicione ao final do arquivo. Troque XXXX pela porta de sua preferência, algo como 3456 ou 1890. O importante é você lembrar qual é a porta e não liberar essa informação para terceiros. E na linha do AllowUsers você lista os usuários que podem acessar a sua máquina, aumentando ainda mais as checagens.

Repare no PermitRootLogin. Ele está como no por que a idéia é você se conectar com o seu usuário do dia a dia, e se necessário fazer sudo e mudar para root DEPOIS de conectado.

Salve o arquivo, e reinicie o serviço de ssh:

/etc/init.d/ssh reload

Testando

Com isso você não vai mais conseguir entrar na máquina sem saber em qual porta o acesso está liberado.

SEM FECHAR A SESSÃO ATUAL, conecte usando as novas configurações:

ssh -p XXXX seu_usuario@seu_ip

Se você conseguir se conectar está tudo bem e podemos continuar. Em caso de erro, revise bem o tutorial até agora.

Firewall

Já fizemos bastante coisas e a máquina já não está mais tão vulnerável a ataques assim, mas temos que configurar o firewall, que é esencial.

Rode o comando abaixo:

/sbin/iptables -L

O output padrão é algo assim:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Se o output for algo parecido com isso acima, você está com um sério problema. A sua máquina está totalmente desprotegida e um hacker determinado só não invade a sua máquina por que não quer.

Vamos arrumar isso!

Editando um arquivo de regras

nano /etc/iptables.up.rules

Neste arquivo nós vamos colocar o conteúdo abaixo:

*filter


#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT


#  Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


#  Allows all outbound traffic
#  You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT


# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT


#  Allows SSH connections
#
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
#
-A INPUT -p tcp -m state --state NEW --dport XXXX -j ACCEPT


# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT


# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7


# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

Essas regras trabalham com o conceito de whitelisting: Permite o que a gente precisa e nega todo o resto.

O importante na hora de editar esse arquivo é liberar as portas que você vai usar de fora. Por exemplo: Se você colocar um banco de dados mysql e precisa acessá-lo via MysqlClient, duplique a linha abaixo:

-A INPUT -p tcp --dport 80 -j ACCEPT

Trocando 80 pelo ip de acesso do seu banco. Troque também XXXX pela porta que você escolheu para fazer ssh, afinal se ela estiver bloqueada você não conseguirá acessar a própria máquina.

Configurando a máquina para carregar o seu arquivo de regras no boot

Essas regras vão funcionar até a hora que a sua máquina for desligada. Para carregar as regras toda vez que a máquina ligar, crie o seguinte arquivo:

nano /etc/network/if-pre-up.d/iptables

Com esse conteúdo:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

Salve o arquivo, e transforme-o num executável com o seguinte comando:

chmod +x /etc/network/if-pre-up.d/iptables

Testando

Podemos dar reload nas regras de firewall com o seguinte comando:

/sbin/iptables-restore < /etc/iptables.up.rules
/sbin/iptables -L

Agora o output vai ser bem diferente e você estará protegido!

DISCLAIMER

Esse tutorial pretende te proteger de hackers principiantes, trolls e pessoas má intencionadas mas com pouco conhecimento em segurança.

Se alguém estiver realmente interessado em obter seus dados ele pode contratar uma empresa de segurança para invadir a sua máquina usando técnicas que podem nem ser conhecidas pelo mercado, quanto menos corrijidas.

Isso sem falar que em tempos de NSA, o governo pode simplesmente invadir fisicamente o seu data center e levar uma cópia de tudo.

Por isso vale o bom senso, e manter sempre as versões dos seus softwares atualizadas (Linux, Apache, MySQL, Framework Web). Se você não estiver usando as últimas versões desses softwares, fazer tudo que está nesse artigo não adiantará de muita coisa.

Referências

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment