
Una pregunta para principiantes, pero revisé muchas preguntas en este sitio y no encontré una respuesta simple y directa:
Estoy configurando un servidor Linux con Ubuntu para almacenar una base de datos MySQL.
Es importante que este servidor sea lo más seguro posible; hasta donde yo sé, mis principales preocupaciones deberían ser los ataques DoS/DDoS entrantes y el acceso no autorizado al servidor.
El servidor de la base de datos solo recibe datos entrantes de una IP específica (101.432.XX.XX), en el puerto 3000. Solo quiero que este servidor pueda recibir solicitudes entrantes de esta IP, así como evitar que el servidor realice solicitudes salientes. .
Me gustaría saber:
¿Cuál es la mejor manera de evitar que el servidor de mi base de datos realice solicitudes salientes y reciba solicitudes entrantes únicamente desde 101.432.XX.XX? Cerraría todos los puertos ex. 3000 será útil para lograr esto?
¿Existen otras adiciones al entorno Linux que puedan aumentar la seguridad?
He tomado medidas muy básicas para proteger mi portal phpmyadmin (vinculado a la base de datos MySQL), como restringir el acceso únicamente a mi dirección IP personal.
Para acceder al servidor de la base de datos se requiere la clave SSH (que a su vez está protegida con contraseña).
Respuesta1
Para limitar las conexiones a su IP 101.432.xx, comenzaría con iptables
. Una configuración básica de firewall para el puerto 3306 (el puerto MySQL predeterminado) podría verse así:
# 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
Si le preocupa limitar el tráfico de salida (salida), entonces debería utilizar una regla en la cadena de SALIDA; Sin embargo, se vuelve complicado. El filtrado de salida implica una regla para cada servicio que su servidor necesita utilizar para comunicarse con el mundo exterior. DNS
, NTP
, HTTP/HTTPS
(para actualizaciones), SMTP
para correo electrónico de administrador, tráfico de syslog, etc., etc. Lo bueno del filtrado de salida es que una vez que se ha establecido el tráfico de salida "normal", alertar sobre las anomalías se convierte en una ganancia fácil. Un ejemplo sencillo para empezar:
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
Es posible que desee desactivar 80,443
hasta que realmente realice actualizaciones en el servidor. De lo contrario, el software malicioso simplemente saldrá por uno de esos puertos y usted no lo sabrá. Usar direcciones IP de destino "permitidas" para la salida es realmente la mejor manera de hacerlo (como en la --dport 25
línea anterior).
En general, el fortalecimiento del servidor es un proceso mucho más complicado. Ha tenido un buen comienzo pensando en cómo limitar las conexiones solo a lo necesario.
Considere también lo siguiente:
- eliminar todo el software adicional que no sea necesario para el funcionamiento del servidor
- limitar los servicios en ejecución (
netstat -topnavelu
para investigar) - manténgase actualizado con todos los parches actuales
- monitorear anomalías (
iptables -A INPUT -j LOG
, fail2ban, etc.) - soltar
ipv6
si no es necesario (ipv6.disable=1
en el argumento de arranque del kernel) - usar
PubKeyAuthentication yes
yPasswordAuthentication no
en sshd_config - limitar los inicios de sesión a través de
pam
in/etc/security/access.conf
- cifrar todo el tráfico de red de una forma u otra**
- almacenar registros del sistema en un servidor syslog remoto**
- escanear periódicamente el sistema en busca de malware/permisos incorrectos/archivos SUID, etc. (como en /var/www)
Existen muchas guías buenas, pero puede resultar abrumador para alguien nuevo en todo esto. Estos dos parecen cubrir bien las 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 ejecutar su tráfico mysqltúnel.
Respuesta2
Suponiendo que está detrás de una NAT, en su configuración de Mysql puede cambiar su dirección de enlace.
#Replace X's with actual IP address
bind-address=<internal-ip>
port=3000
Esto obligará a MySql a escuchar solo en esa única dirección y puerto.
Luego agregaría una regla NAT de destino para traducir entre 101.432.XX.XX:3000 a internal-ip.
Finalmente agregue una política de origen en su firewall para descartar todos los paquetes provenientes de la IP interna. Tengo una configuración similar con un servidor que superviso.
Aquí hay algunos enlaces a otros recursos para reforzar servidores Ubuntu.
http://bodhizazen.net/Tutorials/SSH_security- Endurecimiento SSH https://www.digitalocean.com/community/tutorials/how-to-secure-mysql-and-mariadb-databases-in-a-linux-vps- Endurecimiento de MySQL Espero que esto ayude