Стук портов — это способ защитить сервер, закрыв порты брандмауэра — даже те, которые, как вы знаете, будут использоваться. Эти порты открываются по требованию, если и только если запрос соединения обеспечивает секретный стук.
Стук в порт — «секретный стук»
В 1920-х годах, когда запрет был в полном разгаре, если вы хотели попасть в спикзи, вы должны были знать секретный стук и правильно его нажимать, чтобы попасть внутрь.
Стук в порт — современный эквивалент. Если вы хотите, чтобы люди имели доступ к службам на вашем компьютере, но не хотели открывать брандмауэр в Интернете, вы можете использовать стук портов. Это позволяет вам закрыть порты на вашем брандмауэре, которые разрешают входящие соединения, и автоматически открывать их, когда делается заранее установленная схема попыток соединения. Последовательность попыток соединения действует как секретный стук. Еще один секретный стук закрывает порт.
Стук в порт — это что-то новшество, но важно знать, что это пример безопасности через неизвестность, и эта концепция в корне ошибочна. Секрет того, как получить доступ к системе, безопасен, потому что только те, кто в определенной группе, знают это. Но как только этот секрет раскрыт — либо потому, что он раскрыт, замечен, угадан или сработан, — ваша безопасность становится недействительной. Вам лучше защитить свой сервер другими, более надежными способами, например, требуя входа на основе ключей для SSH-сервера .
Наиболее надежные подходы к кибербезопасности являются многослойными, поэтому, возможно, стук портов должен быть одним из этих уровней. Чем больше слоев, тем лучше, верно? Тем не менее, вы можете утверждать, что стук портов не добавляет много (если вообще что-то) к должным образом укрепленной, безопасной системе.
Кибербезопасность — это обширная и сложная тема, но вы не должны использовать стук портов в качестве единственной формы защиты.
СВЯЗАННЫЕ: Как создать и установить ключи SSH из оболочки Linux
Установка knockd
Чтобы продемонстрировать стук портов, мы собираемся использовать его для управления портом 22, который является портом SSH. Мы будем использовать инструмент под названием knockd . Используйте apt-get
для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.
Введите следующее:
sudo apt-get установить knockd
Возможно, в вашей системе уже установлен брандмауэр iptables , но вам может потребоваться установить пакет iptables-persistent
. Он обрабатывает автоматическую загрузку сохраненных правил iptable
.
Введите следующее, чтобы установить его:
sudo apt-get установить iptables-persistent
Когда появится экран конфигурации IPV4, нажмите клавишу пробела, чтобы принять опцию «Да».
Снова нажмите клавишу пробела на экране конфигурации IPv6, чтобы принять опцию «Да» и двигаться дальше.
Следующая команда указывает iptables
разрешить продолжение установленных и текущих соединений. Теперь мы выполним другую команду, чтобы закрыть порт SSH.
Если кто-то подключается через SSH при выполнении этой команды, мы не хотим, чтобы его отключали:
sudo iptables -A INPUT -m conntrack --ctstate УСТАНОВЛЕНО, СВЯЗАНО -j ПРИНЯТЬ
Эта команда добавляет правило брандмауэра, которое гласит:
- -A : добавить правило в таблицу правил брандмауэра. То есть, добавьте это в основание.
- INPUT : это правило о входящих соединениях.
- -m conntrack : правила брандмауэра действуют на сетевой трафик (пакеты), которые соответствуют критериям в правиле. Параметр
-m
заставляетiptables
использовать дополнительные модули сопоставления пакетов — в этом случае тот, который называетсяconntrack
работает с возможностями отслеживания сетевых подключений ядра. - –Cstate ESTABLISHED, RELATED : указывает тип соединения, к которому будет применяться правило, а именно соединения ESTABLISHED и RELATED. Установленное соединение уже установлено. Связанное соединение — это соединение, созданное в результате действия установленного соединения. Возможно, кто-то, кто подключен, хочет скачать файл; это может произойти через новое соединение, инициированное хостом.
- -j ПРИНЯТЬ : если трафик соответствует правилу, перейти к цели ПРИНЯТЬ в брандмауэре. Другими словами, трафик принимается и разрешается проходить через брандмауэр.
Теперь мы можем выполнить команду, чтобы закрыть порт:
sudo iptables -A INPUT -p tcp --dport 22 -j ОТКАЗАТЬ
Эта команда добавляет правило брандмауэра, которое гласит:
- -A : добавить правило в таблицу правил брандмауэра, т.е. добавить его внизу.
- INPUT : это правило касается входящих соединений.
- -p tcp : это правило применяется к трафику, который использует протокол управления передачей.
- –Dport 22 : Это правило особенно применимо к трафику TCP, который нацелен на порт 22 (порт SSH).
- -j REJECT : если трафик соответствует правилу, перейдите к цели REJECT в брандмауэре. Таким образом, если трафик отклонен, он не разрешен через брандмауэр.
Мы должны запустить демон netfilter-persistent
. Мы можем сделать это с помощью этой команды:
sudo systemctl start netfilter-persistent
Мы хотим, чтобы netfilter-persistent
проходил цикл сохранения и перезагрузки, поэтому он загружает и контролирует правила iptable
.
Введите следующие команды:
sudo netfilter-persistent save
sudo netfilter-persistent reload
Теперь вы установили утилиты, и порт SSH закрыт (надеюсь, без прерывания чьего-либо соединения). Теперь пришло время настроить секретный стук.
Конфигурирование knockd
Для настройки knockd
вы редактируете два файла. Первый — это следующий knockd
конфигурации knockd
:
sudo gedit /etc/knockd.conf
Редактор gedit
открывается с knockd
файлом конфигурации knockd
.
Мы отредактируем этот файл в соответствии с нашими потребностями. Интересующие нас разделы: «openSSH» и «closeSSH». В каждом разделе находятся следующие четыре записи:
- последовательность : последовательность портов, к которой кто-то должен получить доступ, чтобы открыть или закрыть порт 22. Порты по умолчанию: 7000, 8000 и 9000, чтобы открыть его, и 9000, 8000 и 7000, чтобы закрыть его. Вы можете изменить их или добавить больше портов в список. Для наших целей мы будем придерживаться значений по умолчанию.
- seq_timeout : период времени, в течение которого кто-то должен получить доступ к портам, чтобы инициировать его открытие или закрытие.
- команда : команда, отправленная брандмауэру
iptables
приiptables
действия открытия или закрытия. Эти команды либо добавляют правило в брандмауэр (чтобы открыть порт), либо убирают его (чтобы закрыть порт). - tcpflags : тип пакета, который каждый порт должен получить в секретной последовательности. Пакет SYN (синхронизация) является первым в запросе соединения TCP , который называется трехсторонним рукопожатием .
Раздел «openSSH» можно прочесть как «запрос TCP-соединения должен быть сделан на порты 7000, 8000 и 9000 — в таком порядке и в течение 5 секунд — чтобы команда открыла порт 22 для отправки на брандмауэр».
Раздел «closeSSH» можно прочесть как «запрос на соединение TCP должен быть сделан для портов 9000, 8000 и 7000 — в этом порядке и в течение 5 секунд — чтобы команда закрыть порт 22 была отправлена брандмауэру».
Правила брандмауэра
Записи «команды» в разделах openSSH и closeSSH остаются неизменными, за исключением одного параметра. Вот как они состоят:
- -A : добавить правило в конец списка правил брандмауэра (для команды openSSH).
- -D : удалить команду из списка правил брандмауэра (для команды closeSSH).
- INPUT : это правило касается входящего сетевого трафика.
- -s% IP% : IP-адрес устройства, запрашивающего соединение.
- -p : сетевой протокол; в данном случае это TCP.
- –Dport : порт назначения; в нашем примере это порт 22.
- -j ПРИНЯТЬ : перейти к цели принятия в брандмауэре. Другими словами, пусть пакет пропустит остальные правила, не воздействуя на него.
Редактирование файла конфигурации knockd
Изменения, которые мы внесем в файл, выделены красным цветом ниже:
Мы расширяем «seq_timeout» до 15 секунд. Это щедро, но если кто-то запускает запросы на подключение вручную, ему может понадобиться много времени.
В разделе «openSSH» мы меняем опцию -A
(добавление) в команде на -I
(вставка). Эта команда вставляет новое правило брандмауэра в начало списка правил брандмауэра. Если вы оставите параметр -A
, он добавит список правил брандмауэра и поместит его внизу .
Входящий трафик проверяется по каждому правилу брандмауэра в списке сверху вниз. У нас уже есть правило, которое закрывает порт 22. Таким образом, если входящий трафик проверяется по этому правилу до того, как он увидит правило, разрешающее трафик, в соединении будет отказано; если он сначала видит это новое правило, соединение разрешается.
Команда close удаляет правило, добавленное openSSH, из правил брандмауэра. Трафик SSH снова обрабатывается ранее существовавшим правилом «порт 22 закрыт».
После внесения этих изменений сохраните файл конфигурации.
СВЯЗАННЫЕ: Как графически редактировать текстовые файлы в Linux с помощью gedit
Редактирование файла управления knockd
Управляющий файл knockd
в целом проще. Прежде чем мы погрузимся и отредактируем это, нам нужно знать внутреннее имя нашего сетевого подключения; чтобы найти его, введите эту команду:
IP-адрес
Соединение, которое эта машина использует для исследования этой статьи, называется enp0s3
. Запишите имя вашей связи.
Следующая команда редактирует управляющий файл knockd
:
sudo gedit / etc / default / knockd
Вот файл knockd
в gedit
.
Несколько правок, которые нам нужно сделать, выделены красным:
Мы изменили запись «START_KNOCKD =» с 0 на 1.
Мы также удалили хеш-код с начала записи «KNOCKD_OPTS =» и заменили «eth1» именем нашего сетевого подключения enp0s3
. Конечно, если ваше сетевое соединение является eth1
, вы не измените его.
Доказательство в пудинге
Пришло время посмотреть, работает ли это. Мы knockd
демон knockd
с помощью этой команды:
sudo systemctrl начало knockd
Теперь мы прыгнем на другую машину и попробуем подключиться. Мы также установили инструмент knockd
на этот компьютер не потому, что хотим настроить детонацию портов, а потому, что пакет knockd
предоставляет еще один инструмент под названием knock
. Мы будем использовать эту машину для стрельбы в нашей секретной последовательности и постучать за нас.
Используйте следующую команду, чтобы отправить вашу секретную последовательность запросов на подключение к портам хост-компьютера, который выбивает порт с IP-адресом 192.168.4.24:
стук 192.168.4.24 7000 8000 9000 -d 500
Это говорит knock
чтобы нацелить компьютер на IP-адрес 192.168.4.24 и запустить запрос на подключение к портам 7000, 8000 и 9000, в свою очередь, с -d
(задержка) между ними составляет 500 миллисекунд.
Затем пользователь с именем «dave» отправляет запрос SSH на 192.168.4.24:
ssh dave @ 192.168.4.24
Его соединение принято, он вводит свой пароль, и начинается его удаленный сеанс. Его командная dave@nostromo
меняется с dave@nostromo
на dave@
. Чтобы выйти из удаленного компьютера, он набирает:
выход
Его командная строка возвращается на локальный компьютер. Он использует knock
еще раз, и на этот раз он выбирает порты в обратном порядке, чтобы закрыть порт SSH на удаленном компьютере.
стук 192.168.4.24 9000 8000 7000 -d 500
Следует признать, что это не был особенно плодотворный удаленный сеанс, но он демонстрирует открытие и закрытие порта посредством стука портов и помещается на одном скриншоте.
Итак, как это выглядело с другой стороны? Системный администратор на узле, блокирующем порт, использует следующую команду для просмотра новых записей, поступающих в системный журнал:
tail -f / var / log / syslog
- Вы видите три записи openSSH. Они поднимаются, поскольку каждый порт предназначен для утилиты удаленного стука.
- Когда все три стадии последовательности запуска выполнены, запись « ОТКРЫТЬ СЕЗАМ » регистрируется
- Команда для
iptables
правила в список правилiptables
отправляется. Он разрешает доступ через SSH через порт 22 с определенного IP-адреса ПК, который дал правильный секретный стук (192.168.4.23). - Пользователь «Дэйв» подключается только на несколько секунд, а затем отключается.
- Вы видите три записи closeSSH. Они поднимаются, поскольку каждый порт предназначен для утилиты удаленного детонации — он сообщает хосту детонации портов закрыть порт 22.
- После запуска всех трех этапов мы снова получаем сообщение «ОТКРЫТЬ СЕЗАМ». Команда отправляется на брандмауэр для удаления правила. (Почему не «ЗАКРЫТЬ СЕЗАМ», когда он закрывает порт? Кто знает?)
Теперь единственное правило в списке правил iptables
порта 22 — это правило, которое мы ввели в начале, чтобы закрыть этот порт. Итак, порт 22 теперь снова закрыт.
Стукни по голове
Это хитрость в порте. Относитесь к этому как к развлечению и не делайте этого в реальном мире. Или, если нужно, не полагайтесь на это как на единственную форму безопасности.