
Вопрос новичка, но я просмотрел много вопросов на этом сайте и не нашел простого и прямого ответа:
Я настраиваю сервер Linux под управлением Ubuntu для хранения базы данных MySQL.
Важно, чтобы этот сервер был максимально защищен, поскольку, насколько мне известно, больше всего меня должны беспокоить входящие DoS/DDoS-атаки и несанкционированный доступ к самому серверу.
Сервер базы данных получает входящие данные только с одного определенного IP-адреса (101.432.XX.XX) на порт 3000. Я хочу, чтобы этот сервер мог принимать входящие запросы только с этого IP-адреса, а также запретить серверу выполнять какие-либо исходящие запросы.
Я хотел бы знать:
Каков наилучший способ запретить моему серверу базы данных делать исходящие запросы и получать входящие запросы только с 101.432.XX.XX? Поможет ли закрытие всех портов, например 3000, в достижении этого?
Есть ли еще какие-либо дополнения к среде Linux, которые могут повысить безопасность?
Я предпринял самые элементарные шаги для защиты своего портала phpMyAdmin (связанного с базой данных MySQL), например, ограничил доступ только своим личным IP-адресом.
Для доступа к серверу базы данных требуется ключ SSH (который сам по себе защищен паролем).
решение1
Чтобы ограничить соединения с вашим IP-адресом 101.432.xx, вам следует начать с iptables
. Базовая настройка брандмауэра для порта 3306 (порт mysql по умолчанию) может выглядеть примерно так:
# 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
Если вы обеспокоены ограничением исходящего (выходного) трафика, то вы должны использовать правило в цепочке OUTPUT; однако это становится сложным. Фильтрация исходящего трафика включает правило для каждой службы, которую ваш сервер должен использовать для связи с внешним миром. , DNS
, NTP
( HTTP/HTTPS
для обновлений), SMTP
для административной электронной почты, трафика syslog и т. д. и т. п. Прелесть фильтрации исходящего трафика в том, что как только вы установили «нормальный» исходящий трафик, оповещение об аномалиях становится легкой победой. Простой пример для начала:
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
Вы можете захотеть отключить, 80,443
пока вы действительно не выполните обновления на сервере. В противном случае вредоносное ПО просто выйдет через один из этих портов, и вы не узнаете об этом. Использование «разрешенных» IP-адресов назначения для выхода — действительно лучший способ сделать это (как в строке --dport 25
выше).
В целом, укрепление сервера — гораздо более сложный процесс. Вы уже на верном пути, думая о том, как ограничить соединения только тем, что необходимо.
Также примите во внимание следующее:
- удалить все дополнительное программное обеспечение, не необходимое для работы сервера
- ограничить запущенные службы (
netstat -topnavelu
для исследования) - будьте в курсе всех текущих патчей
- мониторинг аномалий (
iptables -A INPUT -j LOG
, fail2ban и т.д.) - удалить
ipv6
, если не требуется (ipv6.disable=1
в аргументе загрузки ядра) - используйте
PubKeyAuthentication yes
иPasswordAuthentication no
в sshd_config - ограничить входы через
pam
в/etc/security/access.conf
- шифровать весь сетевой трафик тем или иным способом**
- хранить системные журналы на удаленном сервере syslog**
- регулярно сканировать систему на наличие вредоносных программ/плохих разрешений/SUID-файлов и т. д. (например, в /var/www)
Есть много хороших руководств, но для новичков это может оказаться непосильной задачей. Эти два руководства, похоже, хорошо охватывают основы:
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/
** примечание: рассмотрите возможность пропускания трафика MySQL черезСтаннел.
решение2
Если вы находитесь за NAT, в конфигурации Mysql вы можете изменить свой адрес привязки.
#Replace X's with actual IP address
bind-address=<internal-ip>
port=3000
Это заставит MySql прослушивать только этот адрес и порт.
Затем я бы добавил правило NAT назначения для преобразования адреса 101.432.XX.XX:3000 во внутренний IP.
Наконец, добавьте политику источника в вашем брандмауэре, чтобы отбрасывать все пакеты, приходящие с внутреннего IP. У меня похожая настройка с сервером, который я вижу.
Вот несколько ссылок на другие ресурсы по укреплению безопасности серверов Ubuntu.
http://bodhizazen.net/Tutorials/SSH_security- Укрепление SSH https://www.digitalocean.com/community/tutorials/how-to-secure-mysql-and-mariadb-databases-in-a-linux-vps- Усиление защиты MySQL Надеюсь, это поможет