
Uma pergunta para iniciantes, mas examinei muitas perguntas neste site e não encontrei uma resposta simples e direta:
Estou configurando um servidor Linux rodando Ubuntu para armazenar um banco de dados MySQL.
É importante que este servidor seja o mais seguro possível, até onde sei, minhas principais preocupações devem ser ataques DoS/DDoS recebidos e acesso não autorizado ao próprio servidor.
O servidor de banco de dados recebe apenas dados de entrada de um IP específico (101.432.XX.XX), na porta 3000. Quero apenas que este servidor seja capaz de receber solicitações de entrada deste IP, bem como evitar que o servidor faça solicitações de saída .
Eu gostaria de saber:
Qual é a melhor maneira de evitar que meu servidor de banco de dados faça solicitações de saída e receba solicitações de entrada somente de 101.432.XX.XX? Fecharia todas as portas ex. 3000 será útil para conseguir isso?
Existem outras adições ao ambiente Linux que podem aumentar a segurança?
Tomei medidas muito básicas para proteger meu portal phpmyadmin (vinculado ao banco de dados MySQL), como restringir o acesso apenas ao meu endereço IP pessoal.
Para acessar o servidor de banco de dados é necessária a chave SSH (que é protegida por senha).
Responder1
Para limitar as conexões ao seu IP 101.432.xx, você começaria com iptables
. Uma configuração básica de firewall para a porta 3306 (a porta padrão do MySQL) poderia ser algo assim:
# allow any localhost interface traffic
iptables -A INPUT -i lo -j ACCEPT
# allow any related traffic to existing connections
iptables -A INPUT -m state --state related,established -j ACCEPT
# only allow certain host to mysql
iptables -A INPUT -p tcp --dport 3306 -s 101.232.155.155 -j ACCEPT
# drop all traffic by default
iptables -P INPUT DROP
# oh, add your ssh source address to allow remote connections
iptables -I INPUT 3 -p tcp --dport 22 -s 203.203.203.203 -j ACCEPT
Se você estiver preocupado em limitar o tráfego de saída (saída), use uma regra na cadeia OUTPUT; no entanto, fica complicado. A filtragem de saída envolve uma regra para cada serviço que seu servidor precisa usar para se comunicar com o mundo exterior. DNS
, NTP
, HTTP/HTTPS
(para atualizações), SMTP
para e-mail de administrador, tráfego de syslog, etc, etc. A beleza da filtragem de saída é que, uma vez estabelecido o tráfego de saída "normal", alertar sobre as anomalias se torna uma vitória fácil. Um exemplo simples para começar:
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state related,established -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -p tcp -d 111.222.33.44 --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -P OUTPUT DROP
Você pode querer desabilitar 80,443
até que você realmente execute atualizações no servidor. Caso contrário, o software malicioso simplesmente sairá por uma dessas portas e você não saberia. Usar endereços IP de destino 'permitidos' para saída é realmente a melhor maneira de fazer isso (como na --dport 25
linha acima).
Em geral, o fortalecimento do servidor é um processo muito mais complicado. Você começou bem a pensar em como limitar as conexões apenas ao que é necessário.
Considere também o seguinte:
- remova todos os softwares extras não necessários para a operação do servidor
- limitar serviços em execução (
netstat -topnavelu
para investigar) - fique atualizado com todos os patches atuais
- monitorar anomalias (
iptables -A INPUT -j LOG
, fail2ban, etc) - descarte
ipv6
se não for necessário (ipv6.disable=1
no argumento de inicialização do kernel) - use
PubKeyAuthentication yes
ePasswordAuthentication no
em sshd_config - limitar logins via
pam
in/etc/security/access.conf
- criptografar todo o tráfego da rede de uma forma ou de outra**
- armazenar logs do sistema no servidor syslog remoto**
- verifica regularmente o sistema em busca de malware/permissões incorretas/arquivos SUID, etc. (como em /var/www)
Existem muitos guias bons por aí, mas pode ser opressor para alguém novo em tudo isso. Esses dois parecem cobrir bem as bases:
https://www.digitalocean.com/community/tutorials/an-introduction-to-securing-your-linux-vps
https://www.rootusers.com/23-hardening-tips-to-secure-your-linux-server/
** nota: considere executar seu tráfego mysqlStúnel.
Responder2
Supondo que você esteja atrás de um NAT, na configuração do Mysql você pode alterar seu endereço de ligação.
#Replace X's with actual IP address
bind-address=<internal-ip>
port=3000
Isso vinculará o MySql para escutar apenas naquele único endereço e porta
Então eu adicionaria uma regra NAT de destino para traduzir entre 101.432.XX.XX:3000 para IP interno.
Por fim, adicione uma política de origem em seu firewall para descartar todos os pacotes provenientes do IP interno. Eu tenho uma configuração semelhante com um servidor que vejo.
Aqui estão alguns links para outros recursos para fortalecer servidores Ubuntu
http://bodhizazen.net/Tutorials/SSH_security- Endurecimento SSH https://www.digitalocean.com/community/tutorials/how-to-secure-mysql-and-mariadb-databases-in-a-linux-vps- MySQL Hardening Espero que ajudem