Не открывайте порты в мир — вас поломают (риски) / Хабр
Снова и снова, после проведения аудита, на мои рекомендации спрятать порты за white-list’ом встречаюсь со стеной непонимания. Даже очень крутые админы/DevOps’ы спрашивают: “Зачем?!?”
Предлагаю рассмотреть риски в порядке убывания вероятности наступления и ущерба.
- Ошибка конфигурации
- DDoS по IP
- Брутфорс
- Уязвимости сервисов
- Уязвимости стека ядра
- Усиление DDoS атак
Ошибка конфигурации
Наиболее типичная и опасная ситуация. Как это бывает. Разработчику надо быстро проверить гипотезу, он поднимает временный сервер с mysql/redis/mongodb/elastic. Пароль, конечно, сложный, он везде его использует. Открывает сервис в мир — ему удобно со своего ПК гуём коннектиться без этих ваших VPN. А синтаксис iptables вспоминать лень, все равно сервер временный. Еще пару дней разработки — получилось отлично, можно показывать заказчику. Заказчику нравится, переделывать некогда, запускаем в ПРОД!
Пример намеренно утрированный с целью пройтись по всем граблям:
- Ничего нет более постоянного, чем временное — не люблю эту фразу, но по субъективным ощущениям, 20-40% таких временных серверов остаются надолго.
- Сложный универсальный пароль, который используется во многих сервисах — зло. Потому что, один из сервисов, где использовался этот пароль, мог быть взломан. Так или иначе базы взломанных сервисов стекаются в одну, которая используется для [брутфорса]*.
Стоит добавить, что redis, mongodb и elastic после установки вообще доступны без аутентификации, и часто пополняют коллекцию открытых баз. - Может показаться, что за пару дней никто не насканит ваш 3306 порт. Это заблуждение! Masscan — отличный сканер, и может сканировать со скоростью 10М портов в секунду. А в интернете всего 4 миллиарда IPv4. Соответственно, все 3306-ые порты в интернете находятся за 7 минут. Карл!!! Семь минут!
“Да кому это надо?” — возразите вы.Вот и я удивляюсь, глядя в статистику дропнутых пакетов. Откуда за сутки 40 тысяч попыток скана с 3-х тысяч уникальных IP? Сейчас сканят все кому не лень, от мамкиных хакеров до правительств. Проверить очень просто — возьмите любую VPS’ку за $3-5 у любого** лоукостера, включите логирование дропнутых пакетов и загляните в лог через сутки.
Включение логирования
В /etc/iptables/rules.v4 добавьте в конец:
-A INPUT -j LOG –log-prefix “[FW — ALL] ” –log-level 4
А в /etc/rsyslog.d/10-iptables.conf
:msg,contains,”[FW — ” /var/log/iptables.log
& stop
DDoS по IP
Если злоумышленник знает ваш IP, он может на несколько часов или суток заддосить ваш сервер. Далеко не у всех лоукост-хостингов есть защита от DDoS и ваш сервер просто отключат от сети. Если вы спрятали сервер за CDN, не забудьте сменить IP, иначе хакер его нагуглит и будет DDoS’ить ваш сервер в обход CDN (очень популярная ошибка).
Уязвимости сервисов
Во всем популярном ПО рано или поздно находят ошибки, даже в самых оттестированных и самых критичных.
Так же стоит упомянуть, что все известные уязвимости, когда-то были неизвестными. Вот представьте хакера, который нашел такую уязвимость, и просканировал весь интернет за 7 минут на ее наличие… Вот и новая вирусная эпидемия ) Надо обновляться, но это может навредить проду, скажете вы. И будете правы, если пакеты ставятся не из официальных репозиториев ОС. Из опыта, обновления из официального репозитория крайне редко ломают прод.
Брутфорс
Как описал выше, есть база с полу миллиардом паролей, которые удобно набирать с клавиатуры. Другими словами, если вы не сгенерировали пароль, а набрали на клавиатуре рядом расположенные символы, будьте уверены* — вас сбрутят.
Уязвимости стека ядра.

Бывает**** и такое, что даже не важно какой именно сервис открывает порт, когда уязвим сам сетевой стек ядра. То есть абсолютно любой tcp/udp-сокет на системе двухлетней давности подвержен уязвимости приводящий к DDoS.
Усиление DDoS-атак
Напрямую ущерба не принесет, но может забить ваш канал, поднять нагрузку на систему, ваш IP попадет в какой-нибудь black-list*****, а вам прилетит абуза от хостера.
Неужели вам нужны все эти риски? Добавьте ваш домашний и рабочий IP в white-list. Даже если он динамический — залогиньтесь через админку хостера, через веб-консоль, и просто добавьте еще один.
Я 15 лет занимаюсь построением и защитой IT-инфраструктуры. Выработал правило, которое всем настоятельно рекомендую — ни один порт не должен торчать в мир без white-list’a.
Например, наиболее защищенный web-сервер*** — это тот, у которого открыты 80 и 443 только для CDN/WAF. А сервисные порты (ssh, netdata, bacula, phpmyadmin) должны быть как минимум за white-list’ом, а еще лучше за VPN. Иначе вы рискуете быть скомпрометированным.
У меня все. Держите свои порты закрытыми!
- (1) UPD1: Здесь можно проверить свой крутой универсальный пароль (не делайте этого не заменив этот пароль на рандомные во всех сервисах
- (2) К чести Amazon — на LightSail минимум сканов. Видимо, как-то фильтруют.
- (3) Еще более защищенный web-сервер это тот, что за выделенным firewall’ом, своим WAF, но речь о публичных VPS/Dedicated.
- (4) Segmentsmak.
- (5) Firehol.
Как открывать порты в системе Linux
1 февраля, 2023 12:32 пп 2 508 views | Комментариев нетGeneral, Linux | Amber | Комментировать запись
Порт — это конечная точка соединения. В операционной системе порт открывается или закрывается для передачи пакетов данных определенных процессов или сетевых служб.
Обычно порты определяют конкретную присвоенную им сетевую службу. Это можно изменить вручную, настроив службу на использование другого порта, но в целом можно оставить значения по умолчанию.
Первые 1024 порта (номера портов от 0 до 1023) называются общеизвестными или системными и зарезервированы для часто используемых служб. К ним относятся SSH (порт 22), HTTP (порт 80), HTTPS (порт 443) и тому подобное.
Номера портов выше 1024 называются эфемерными портами.
- Порты с номерами от 1024 до 49151 называются зарегистрированными/пользовательскими.
- Номера портов с 49152 по 65535 называются динамическими/частными портами.
В этом мануале мы откроем эфемерный порт в Linux, поскольку общие службы используют известные порты.
Требования
Для выполнения туториала нужно уметь пользоваться терминалом.
Читайте также: Основы работы с терминалом Linux
Проверка открытых портов
Прежде чем открыть порт в Linux, нужно проверить список всех открытых портов и выбрать эфемерный порт, которого нет в этом списке.
С помощью команды netstat можно получить список всех открытых портов, включая TCP и UDP — это распространенные протоколы для передачи пакетов на сетевом уровне.
netstat -lntu
Учитывая используемые флаги, команда выводит следующее:
- все прослушиваемые сокеты (-l)
- номер порта (-n)
- TCP-порты (-t)
- UDP-порты (-u)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp6 0 0 ::1:5432 :::* LISTEN tcp6 0 0 ::1:6379 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
Примечание. Если в вашем дистрибутиве нет netstat, то с помощью команды ss можно вывести список открытых портов путем проверки сокетов прослушивания.
Убедитесь, что команда ss выводит согласованные выходные данные:
ss -lntu
Получим следующий вывод:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:* tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:* tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp LISTEN 0 128 [::1]:5432 0.0.0.0:* tcp LISTEN 0 128 [::1]:6379 0.0.0.0:* tcp LISTEN 0 128 [::]:22 0.0.0.0:*
Эта команда выводит практически те же открытые порты, что и netstat.
Открытие порта для TCP-соединений
Теперь откроем закрытый порт и настроим его на прослушивание TCP-соединений.
В этом туториале мы откроем порт 4000. Но при желании вы можете выбрать другой закрытый порт. Только убедитесь, что его номер больше 1023.
С помощью команды netstat убедитесь, что порт 4000 не используется:
netstat -na | grep :4000
То же самое можно сделать с помощью команды ss:
ss -na | grep :4000
Вывод должен быть пустым, таким образом подтверждается, что порт сейчас не используется, чтобы была возможность вручную добавить правила порта в системный брандмауэр iptables.
Ubuntu и системы на базе ufw
ufw — клиент командной строки для брандмауэра UncomplicatedFirewall.
Команда будет выглядеть следующим образом:
sudo ufw allow 4000
CentOS и системы на базе firewalld
firewall-cmd — клиент командной строки для брандмауэра firewalld.
Команды будут выглядеть так:
firewall-cmd --add-port=4000/tcp
Читайте также: Настройка брандмауэра firewalld on CentOS 8
Для других дистрибутивов Linux
Изменить системные правила фильтрации пакетов IPv4 можно с помощью iptables.
iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
Читайте также: Архитектура Iptables и Netfilter
Тестирование порта
После успешного открытия TCP-порта нужно его протестировать.
При отправке вывода ls любому подключенному клиенту, сначала запустите netcat (nc) и прослушивайте (-l) порт (-p) 4000:
ls | nc -l -p 4000
Теперь клиент получит вывод ls после того, как он откроет TCP-соединение на порту 4000. ]’.
while.sh
Вывод ls (в данном примере while.sh) отправлен клиенту, что указывает на успешное TCP-соединение.
С помощью nmap проверьте, открыт ли порт (-p):
nmap localhost -p 4000
Эта команда проверит открытый порт:
Starting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC Nmap scan report for localhost (127.0.0.1) Host is up (0.00010s latency). Other addresses for localhost (not scanned): ::1 PORT STATE SERVICE 4000/tcp open remoteanything Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
Как видите, вы успешно открыли новый порт в Linux.
Примечание: nmap выводит список только открытых портов, на которых в данный момент есть прослушивающее приложение. Если вы не используете приложение для прослушивания (например netcat), то порт 4000 будет отображаться как закрытый, поскольку в настоящее время на этом порту нет ни одного прослушивающего приложения. Аналогично не будет работать и telnet, поскольку этой команде также нужно прослушивающее приложение. Именно по этой причине nc такой полезный инструмент. Он имитирует такие среды с помощью простой команды.
Но порт открыт временно, так как изменения будут сбрасываться при каждой перезагрузке системы.
Сохранение правил брандмауэра
Способ, который мы рассмотрели в этом мануале только временно обновляет правила брандмауэра, пока система не выключится или не перезагрузится. Поэтому для повторного открытия того же порта после перезагрузки необходимо повторить эти шаги. Однако правила брандмауэра можно сохранить навсегда.
Для брандмауэра ufw
Правила ufw не сбрасываются при перезагрузке. Это происходит потому, что он интегрирован в процесс загрузки, и ядро применяет соответствующие конфигурационные файлы и сохраняет правила брандмауэра ufw.
Для firewalld
Необходимо применить флаг –permanent, чтобы правила были действительны после перезагрузки системы.
Для iptables
Чтобы сохранить правила конфигурации, рекомендуется использовать iptables-persistent.
Подводим итоги
В этом туториале мы разобрали, как открыть новый порт в Linux и настроить его для входящих соединений, а также поработали с netstat, ss, telnet, nc и nmap.
Читайте также: Использование Top, Netstat, Du и других инструментов для отслеживания ресурсов сервера
Включить порты 80 (HTTP) и 443 (HTTPS)
РУКОВОДСТВА ПО ПРОДУКЦИИ
Руководство PaperCut NG и PaperCut MF
ПРЕДСТАВЛЕННЫЕ ПРОДУКТЫ
По умолчанию PaperCut NG/MF прослушивает порты 9191 и 9192 для обмена данными по протоколам HTTP и HTTPS соответственно. Эти порты были выбраны, поскольку они обычно не используются другими приложениями. Поскольку PaperCut NG/MF — это веб-приложение, вам может понадобиться, чтобы интерфейс был доступен через стандартные порты HTTP и HTTPS (80 и 443 соответственно). Одной из причин этого является упрощение URL-адресов, передаваемых в устной форме (поскольку пользователю не нужно указывать номер порта).
Процедура настройки отличается для каждой операционной системы. Инструкции см. ниже. Важно: Прежде чем начать, убедитесь, что на сервере, на котором размещается PaperCut NG/MF, не установлены никакие другие приложения (например, IIS или Apache), которые используют порты 80 или 443.
ВАЖНО
В следующих указаниях подробно описано, как включить порт 80 в дополнение к порту 9191. Рекомендуется включить дополнительный порт вместо изменения существующего порта. Порт 9191 также используется для связи сервер-сервер и клиент-сервер, поэтому важно, чтобы этот порт оставался доступным.Также убедитесь, что вы включили порты 80 и 443 брандмауэра, если пользователи получают доступ к PaperCut NG/MF через устройства брандмауэра.
Окна
Откройте файл:
[путь к приложению]\server\server.properties
Включите порт 80 (и 443), изменив соответствующие настройки с
N
наY
.Они должны выглядеть так:
server.enable-http-on-port-80=Y
server.enable-https-on-port-443=Y
Измените порт сервера у всех провайдеров, установленных в вашей сети. Порт сервера задается в файле
print-provider.conf
в каталоге провайдера.Измените порт сервера в файле конфигурации User Client:
[путь-приложения]\клиент\config.properties
.ВАЖНО
Если клиент установлен локально на рабочих станциях, измените файл конфигурации на каждой рабочей станции. В системах Linux/Unix сервер работает под привилегией учетной записи без полномочий root. Некоторые системы запрещают пользователям без полномочий root привязываться к портам ниже 1024. Альтернативным вариантом является использование перенаправления портов TCP на уровне ядра (например, iptables).
Перезапустите сервер приложений. (См. Остановка и запуск сервера приложений).
Протестируйте и убедитесь, что веб-интерфейс работает.
например
http://[myserver]/admin
Линукс
В системах Linux только привилегированные программы, работающие под root
, могут использовать порты ниже 1024. В соответствии с рекомендациями по безопасности PaperCut запускается от имени непривилегированного пользователя. Чтобы включить порты 80 и 443, используйте iptables
(или ipchains в старых системах) для переадресации портов с 80 на 9.191. Примером могут служить следующие команды. Обратитесь к документации вашего дистрибутива, чтобы узнать, как сохранить правила iptables
между перезагрузками системы:
/sbin/iptables -t nat -I PREROUTING --src 0/0 --dst
-p tcp --dport 80 -j REDIRECT --to-ports 9191
/sbin/ iptables -t nat -I PREROUTING --src 0/0 --dst
-p tcp --dport 443 -j REDIRECT --to-ports 9192
(Эти команды обычно помещаются в сценарий rc init
или сценарий конфигурации запуска iptables, предоставленный вашим дистрибутивом. )
Когда вы закончите, перезапустите сервер приложений. (См. Остановка и запуск сервера приложений).
Mac
Подход к системам Mac аналогичен Linux. С выпуском Mac OS X 10.11 (El Capitan) и включением защиты целостности системы (SIP) модификации /System/ отключены по умолчанию, и отключение этой функции не рекомендуется. Следующая информация работает для Mac OS X 10.10. Для Mac OS X 10.10 и более поздних версий поддержка брандмауэра IPFW была удалена в пользу PF.
Mac OS X 10.10
Начиная с Mac OS X 10.10, для изменения брандмауэра Mac необходимо использовать команду pfctl
.
Создайте файл привязки:
sudo vi /etc/pf.anchors/com.papercut
Измените файл
/etc/pf.anchors/com.papercut
, добавив следующие строки:rdr пройти по протоколу lo0 inet tcp с любого на собственный порт 80 -> порт 127.0.0.1 9191
rdr передать по протоколу tcp en0 inet с любого на любой порт 80 -> 127.
0.0.1 порт 9191
rdr пройти по en1 inet proto tcp с любого на любой порт 80 -> 127.0.0.1 порт 9191
Проверить файл привязки:
sudo pfctl -vnf /etc/pf.anchors/com.papercut
Добавьте файл привязки в файл pf.conf:
sudo vi /etc/pf.conf
Затем добавьте следующие строки под каждым соответствующим разделом — например, строка rdr-anchor под текущей строкой rdr-anchor и якорь загрузки под текущим оператором load-anchor:
rdr-anchor "port80"
загрузить якорь "port80" из "/etc/pf.anchors/com.papercut"
Автоматически загружать файл pf.conf при запуске путем редактирования текущего демона для pf:
sudo vi /System/Library/LaunchDaemons/com.apple.pfctl.plist
Затем в разделе с подробным описанием аргументов программы
ProgramArguments pfctl
-e
-f
/etc/pf. conf
Затем сохраните файл, выйдите и перезапустите сервер для проверки.
Чтобы протестировать этот метод вручную (перезагрузка не требуется), вы можете использовать команду pfctl:
sudo pfctl -ef /etc/pf.conf
Это загружает и включает
pf.conf
, который затем вызывает файл привязкиcom.papercut
.Перезапустите сервер приложений. (См. Остановка и запуск сервера приложений).
Mac OS X 10.9 и более ранние версии
В Mac OS X 10.9 и более ранних версиях необходимо использовать команду ipfw
для изменения брандмауэра Mac:
sudo /sbin/ipfw добавить 102 fwd 127.0.0.1,9191 tcp с любого на любой 80 в
См. ipfw
справочная страница со всеми страшными подробностями!
Последнее обновление:
Сеть. Есть ли смысл сегодня разрешать только порты 80 и 443?
Задавать вопрос
спросил
Изменено 6 лет, 3 месяца назад
Просмотрено 39 тысяч раз
Для организаций, заботящихся о безопасности, стало стандартом блокировать все, кроме 80 и 443. В результате все больше и больше приложений (кроме веб-браузеров) также учатся использовать эти порты для своих нужд.
Естественные вредоносные программы тоже делают это, а это означает, что для обеспечения реальной безопасности брандмауэры должны фактически проверять поток данных и блокировать на основе данных приложений, а не только портов…
Это, по-видимому, указывает на то, что блокировка на основе портов была недальновидным подходом с самого начала, вроде проверки ввода исключительно на клиенте. ..
В таком случае, не следует ли нам прекратить сплошную блокировку нестандартных портов и перейти к более тонким зернистая фильтрация в первую очередь…? Или есть другие причины для сохранения подхода с использованием белого списка портов?
- сеть
- межсетевые экраны
- порты
Блокировка всех портов, кроме 80 и 443, может быть частью хорошей стратегии глубокоэшелонированной защиты. Если это ваша единственная стратегия, то вы правы, она будет ошибочной.
Потенциальным примером многоуровневого подхода может быть
- Блокировка всех портов на внешнем брандмауэре минус 80/443
- Наличие встроенной системы предотвращения вторжений (или части брандмауэра) для анализа пакетов
- Дезинфекция ввода веб-приложения с помощью брандмауэра веб-приложения
- Дезинфекция ввода базы данных с помощью брандмауэра базы данных
- Записывать все и передавать в систему управления журналами (с оповещениями)
- Резервное копирование всего (какой бы ни была ваша стратегия доступности)
- Защитите каждую ОС в соответствии с выбранными вами базовыми показателями/контрольными показателями (например, Org SOP, CIS/DISA STIGS и т.
д.)
Это всего лишь один очень простой пример. Хорошая стратегия глубокоэшелонированной защиты включает в себя множество уровней, которые вместе создают безопасную систему.
10Вы абсолютно правы. В порте 80 или порте 443 нет ничего волшебного. Нет ничего изначально безопасного в том или ином порте или даже в том или ином протоколе. Если вы заблокируете все, кроме HTTP, все просто начнут использовать HTTP. Злоумышленники могут и всегда движутся быстрее, чем все остальные. Они не ограничиваются поддержанием старой инфраструктуры.
По сути, протоколы и порты не являются безопасными или небезопасными. Их блокировка — это еще одна форма театра безопасности.
1 Белый список обычно предпочтительнее черного списка. Если вы открываете только те порты, которые вам действительно нужны, и максимально ограничиваете эти порты, то вы уменьшаете зону атаки и ограничиваете трафик, который вам нужно отслеживать.
Да, 80 и 443 по-прежнему могут использоваться для вредоносного трафика. Но вы также поднимаете планку для атак (по крайней мере, немного), заставляя их проходить через гораздо меньшее окно, за которым вам легче следить.
8Номера портов не имеют значения. Приложения, которые прослушивают или подключаются к любому порту, имеют значение. Используйте сеть, чтобы ограничить векторы атак приложений.
Некоторые предложения:
- Узлы приложений должны быть доступны в нескольких сетях с разными целями и профилями трафика: сеть приложений и сеть управления.
- Избегайте приложений на портах < 1024, т.е. используйте 8080 или другой случайный порт. NAT для портов приложений на границах сети приложений (на LB).
- Используйте iptables, чтобы разрешить трафик приложений (80, 443) только с определенных IP-адресов балансировщика нагрузки (если вы не используете прямой маршрут LB) или к внутренним службам (ваша БД).