Port 22 ssh как закрыть
Перейти к содержимому

Port 22 ssh как закрыть

  • автор:

Как SSH появился на 22 порту

SSH по умолчанию работает на порту 22. Это не совпадение. Вот история, как ему достался этот порт.

Когда я (Тату Илонен) впервые опубликовал эту историю в апреле 2017 года, она стала вирусной: её прочитали около 120 000 читателей за три дня.

История получения порта 22 для SSH

Я написал первую версию SSH (Secure Shell) весной 1995 года. В то время широко использовались Telnet и FTP.

Но я всё равно разработал SSH для замены и telnet (порт 23) и ftp (порт 21). Порт 22 был свободен и удобно располагался между портами для telnet и ftp. Я подумал, что такой номер порта может стать одной из тех маленьких деталей, которые придадут некоторую ауру доверия SSH. Но как его получить? Я никогда не распределял порты, но я знал тех, кто этим занимается.

В то время процесс выделения портов был довольно простым. Интернет был меньше, и мы находились на самых ранних стадиях интернет-бума. Номера портов выделяла организация IANA (Internet Assigned Numbers Authority). В то время это означало уважаемых первопроходцев интернета Джона Постела и Джойс К. Рейнольдс. Среди всего прочего, Джон являлся редактором таких незначительных протоколов, как IP (RFC 791), ICMP (RFC 792) и TCP (RFC 793). Возможно, кто-то из вас слышал о них.

Меня откровенно пугал Джон как автор всех основных RFC для Интернета!

Так или иначе, но перед анонсом ssh-1.0 в июле 1995 года я отправил в IANA такое электронное письмо:

From ylo Mon Jul 10 11:45:48 +0300 1995
From: Tatu Ylonen <ylo@cs.hut.fi>
To: Internet Assigned Numbers Authority <iana@isi.edu>
Subject: request for port number
Organization: Helsinki University of Technology, Finland

Я написал программу для безопасного входа с одной машины на другую по небезопасной сети. Это значительное улучшение безопасности по сравнению с существующими протоколами telnet и rlogin и их реализациями. В частности, она предотвращает спуфинг IP, DNS и маршрутизации. Мой план состоит в том, чтобы свободно распространять программу в интернете и обеспечить как можно более широкое её использование.

Я хотел бы получить зарегистрированный привилегированный номер порта для программы. Желательно в диапазоне 1-255, чтобы его можно было использовать в поле WKS на нейм-серверах.

Ниже прикладываю проект RFC для протокола. Программное обеспечение локально используется несколько месяцев и готово для публикации, за исключением номера порта. Если можно оперативно присвоить номер порта, я хотел бы выложить программу уже на этой неделе. В настоящее время в бета-тестировании я использую порт 22. Было бы отлично использовать этот номер (в настоящее время в списках он обозначен как «неприсвоенный»).

Название сервиса для программного обеспечения — «ssh» (Secure Shell).

Тату Илонен <ylo@cs.hut.fi>

… затем следуют спецификации протокола ssh-1.0

На следующий день в почтовом ящике лежало письмо от Джойс:

Date: Mon, 10 Jul 1995 15:35:33 -0700
From: jkrey@ISI.EDU
To: ylo@cs.hut.fi
Subject: Re: request for port number
Cc: iana@ISI.EDU

Мы присвоили порт 22 для SSH, указав вас контактным лицом.

У нас получилось! Теперь у SSH порт 22.

12 июля 1995 года в 2:32 утра я анонсировал окончательную бета-версию для своих бета-тестеров в Хельсинкском технологическом университете. В 17:23 выслал тестерам пакеты ssh-1.0.0, а в 17:51 отправил объявление о SSH (Secure Shell) в список рассылки cypherpunks@toad.com . Я также продублировал анонс в несколько новостных групп, списков рассылки и непосредственно отдельным людям, которые обсуждали смежные темы в интернете.

Изменение порта SSH на сервере

По умолчанию сервер SSH по-прежнему работает на порту 22. Однако бывает иначе. Одна из причин — тестирование. Другая — запуск нескольких конфигураций на одном хосте. Редко бывает, что сервер работает без рутовых привилегий, в этом случае он должен размещаться на непривилегированном порту (т. е. с номером 1024 или больше).

Номер порта можно настроить, изменив директиву Port 22 в /etc/ssh/sshd_config. Он также указывается параметром -p <port> в sshd. Клиент SSH и программы sftp тоже поддерживают параметр -p <port> .

Указание порта SSH в командной строке

Параметр -p <port> можно использовать для указания номера порта при подключении с помощью команды ssh в Linux. В SFTP и scp используется параметр -P <port> (примечание: заглавная P). Указание из командной строки переопределяет любое значение в файлах конфигурации.

Настройка доступа SSH через файрволы

SSH является одним из немногих протоколов, которому часто разрешено работать через файрволы на исходящий доступ, особенно в небольших и технических компаниях. Входящий SSH обычно разрешён к одному или нескольким серверам.

Исходящий SSH

Настройка исходящего SSH в файрволе очень проста. Если есть ограничения на исходящий трафик вообще, просто создайте правило, разрешающее исходящие соединения по порту TCP 22. Вот и всё. Если требуется ограничить адреса назначения, можно создать соответствующее правило, разрешив доступ только к серверам вашей организации в облаке или к jump-серверу, который защищает доступ к облаку.

Обратное туннелирование — это риск

Однако неограниченный исходящий SSH может быть рискованным. Протокол SSH поддерживает туннелирование. Основная идея в том, что сервер SSH на внешнем сервере прослушивает подключения отовсюду, переправляет их в организацию и устанавливает соединение с каким-то внутренним сервером.

В некоторых случаях это удобно. Разработчики и системные администраторы часто используют туннелирование, чтобы получить удалённый доступ из дома или с ноутбука во время путешествий.

Но обычно туннелирование нарушает политику безопасности и отнимает контроль у администраторов файрвола и команды ИБ. Например, оно может нарушать правила PCI, HIPAA или NIST SP 800-53. Его могут использовать хакеры и спецслужбы, чтобы оставить бэкдоры в локальной сети.

Программа CryptoAuditor контролирует туннелирование в файрволе или в точке входа в группу облачных серверов. Она работает в связке с Universal SSH Key Manager для получения доступа к ключам хоста, используя их для расшифровки сеансов SSH в брандмауэре и блокировки несанкционированного форвардинга.

Входящий SSH

Для входящего доступа есть несколько вариантов:

  • Настройте файрвол для пересылки всех подключений к порту 22 на определённый IP-адрес во внутренней сети или DMZ. Запустите по этому IP-адресу CryptoAuditor или jump-сервер, чтобы контролировать и проверять дальнейший доступ в организацию.
  • Используйте разные порты на файрволе для доступа к разным серверам.
  • Разрешайте доступ по SSH только после входа в систему с помощью VPN, обычно по протоколу IPsec.

Включение SSH через iptables

Iptables — это файрвол хоста, встроенный в ядро Linux. Обычно он настроен для защиты сервера, предотвращая доступ ко всем портам, которые не были явно открыты.

Если на сервере включен iptables, следующие команды могут разрешить входящий доступа SSH. Их следует запускать из-под рута.

iptables -A INPUT -p tcp —dport 22 -m conntrack —ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp —sport 22 -m conntrack —ctstate ESTABLISHED -j ACCEPT

Если хотите сохранить правила навсегда, то в некоторых системах это можно сделать командой:

Как закрыть порт iptables

Серверы и компьютеры, подключенные к интернету подвержены атакам и сканированию различных скриптов, программ и злоумышленников. А поскольку известно, что во всех системах могут быть уязвимости, то лучше, чтобы извне было видно минимум портов.

Некоторые порты должны быть видны постоянно, например, порт веб-сервера, другие используются только системными администраторами, а еще одни, вообще, должны быть доступны только локально. Несмотря на то что все сервисы имеют методы авторизации, и не позволят подключиться кому попало, они могут быть уязвимы, поэтому все лишнее лучше закрыть. В этой статье мы рассмотрим как закрыть порт iptables. Мы закроем нужные порты полностью, а также сделаем некоторые из них доступными на время, после попытки подключения к определенному порту.

Как закрыть порт Iptables

В этой статье я не стану подробно рассматривать все возможности Iptables, виды цепочек и как работает эта служба. Все это мы рассмотрели в статье настройка Iptables для начинающих. Вместо этого, перейдем ближе к делу. Чтобы заблокировать порт нам сначала нужно понять какие порты открыты в Linux и за что они отвечают. Чтобы посмотреть какие порты слушаются локально, можно использовать утилиту netstat:

sudo netstat -ntulp

Для анализа портов, доступных извне используется программа nmap:

Как видите, извне у нас, кроме стандартных портов веб-сервера, доступны mysql, ftp, dns и другие сервисы. Некоторые из них не должны быть доступны публично. Это не критично, но и нежелательно. Мы можем очень просто закрыть такие порты с помощью iptables. Общий синтаксис команды для блокировки порта будет выглядеть вот так:

$ iptables -A INPUT -p tcp —dport номер_порта -j DROP

Например, если мы хотим заблокировать порт iptables mysql, то необходимо выполнить:

sudo iptables -A INPUT -p tcp —dport 3306 -j DROP

Можно закрыть порт для определенного интерфейса, например, eth1:

sudo iptables -A INPUT -i eth1 -p tcp —dport 3306 -j DROP

Или даже для ip и целой подсети. Например, закрыть все подключения к порту 22 SSH кроме IP адреса 1.2.3.4:

sudo iptables -A INPUT -i eth1 -p tcp -s !1.2.3.4 —dport 22 -j DROP

Здесь знак восклицания означает инверсию, то есть применить ко всем кроме этого. Можно убрать этот знак и указать только IP, к которым нужно применить запрет. Мы рассмотрели как закрыть порт iptables в цепочке INPUT, которая отвечает за входящие соединения, это более применимо к серверам. Но что, если нужно закрыть подключение к удаленному порту из этого компьютера или нашей сети? Для этого существует цепочка OUTPUT.

Например, заблокируем попытки отправки почты подключением к любой машине по порту 25:

sudo iptables -A OUTPUT -p tcp —dport 25 -j DROP

Также, как и раньше, вы можете указать исходящий сетевой интерфейс, только теперь он указывается опцией -o:

sudo iptables -A OUTPUT -o eth1 -p tcp —dport 25 -j DROP

После того как вы завершите с настройкой портов нужно сохранить все созданные правила, чтобы они остались активными даже после перезагрузки. Для этого выполните:

Чтобы посмотреть текущие правила для каждой из цепочек выполните:

sudo iptables -L -n -v

Такая команда покажет все правила, а если вы хотите только информацию о заблокированных портах, выполните:

sudo iptables -L -n -v | grep -i DROP

Очистить все правила в случае возникновения проблем можно командой:

sudo iptables -F

Закрыть порты iptables, кроме разрешенных

По умолчанию политика для цепочек INPUT и OUTPUT — разрешать все подключения, а уже с помощью правил мы указываем какие подключения стоит запретить. Но если вы хотите закрыть все порты кроме разрешенных iptables. То нужно поступить по-другому. Мы поменяем политику по умолчанию, так чтобы она запрещала все и разрешим только доступ к нужным портам.

Например, меняем политику для цепочки INPUT:

sudo iptables -P INPUT DROP

Затем разрешаем все входящие соединения от локального интерфейса:

sudo iptables -A INPUT -i lo -j ACCEPT

Затем разрешаем доступ к портам 80 и 22:

sudo iptables -A INPUT -i eth0 -p tcp —dport 80 —match state —state NEW -j ACCEPT $ sudo iptables -A INPUT -i eth0 -p tcp —dport 80 —match state —state NEW -j ACCEPT

Как скрыть порт iptables?

Закрыть порт, это очень хорошо, но что если он нужен нам открытым и желательно, чтобы для других этот же порт был недоступен. Существует такая технология, как Port Knocking, которая позволяет открывать нужный порт только для определенного ip адреса и только после обращения его к нужному порту. Например, нам нужно защитить SSH от перебора паролей и несанкционированного доступа. Для этого все пакеты, которые будут приходить на порт 22, 111 и 112 мы будем перенаправлять в цепочку SSH.

Как вы уже догадались, порт 22 нам непосредственно нужен, на порты 111 и 112 будут включать его и отключать соответственно. Когда пользователь обратится к порту 111 мы укажем системе, что нужно присвоить всем его пакетам имя ssh, при обращении к порту 112 уберем этот флаг. А если пользователь решит зайти на 22 порт, то проверим присвоено ли этому пакету имя SSH, если да, то пропустим, в противном случае — отбросим.

Сначала создаем цепочку SSH:

sudo iptables -N SSH

sudo iptables -A INPUT -p tcp —dport 22 -j SSH $ sudo iptables -A INPUT -p tcp —dport 111 -j SSH $ sudo iptables -A INPUT -p tcp —dport 112 -j SSH

При обращении к порту 111 присваиваем IP адресу имя, сам пакет дальше не пускаем:

sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 111 -m recent —set —name SSH —rsource -j DROP

При обращении к 112 убираем имя у IP:

sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 112 -m recent —remove —name SSH —rsource -j DROP

И нам осталось только проверить имеет ли наш пакет, который пытается обратиться к 22 порту имя SSH и если да, то мы его одобряем:

sudo iptables -A SSH -p tcp -m state —state NEW -m tcp —dport 22 -m recent —rcheck —name SSH —rsource -j ACCEPT

Вот и все. Теперь для того чтобы открыть наш SSH порт будет достаточно попытаться подключиться к порту 111 с помощью telnet. Утилита сообщит, что произошла ошибка во время подключения, поскольку мы отбросили пакет:

telnet ip_адрес 111

Но зато теперь вы можете получить доступ к сервису SSH на порту 22. Чтобы снова закрыть порт выполните:

telnet ip_адрес 112

Даже при открытии, этот порт доступен только вашему ip адресу и больше никому другому. Но нужно заметить, что это не панацея. Кто-либо может случайно запросить порт, который предназначен для активации, и таким образом, открыть себе доступ к службе SSH. Так что надежные пароли и ключи шифрования это не отменяет.

Выводы

В этой статье мы рассмотрели как закрыть порт iptables, а также как его скрыть с возможностью подключения, когда это будет необходимо. Надеюсь, эта информация была для вас полезной.

unixforum.org

Я хотел бы узнать как мне закрыть 22 порт Чтоб через команду ssh нельзя было зайти на мой комп .

Ещё один вопрос я чё-то не понял как указать дистр, которым я пользуюсь, напишите как его указать.

P.S. Мой пароль от компа знают, а пороьл сменить не смогу потомучто я не root, ну обычный пользователь и пароль рута я не знаю

Re: Как закрыть 22 порт

Сообщение nrg » 13.01.2008 10:29

service sshd stop — для остановки ssh сервера до перезагрузки
passwd — для сменя пароля текущего пользователя (даже не рута)
А в общем случае, нужно удалить демона sshd из уровней автозапуска (обычно 3,5), но это уже отличается от дистрибутива к дистрибутиву.

Дистр — это Debian, OpenSuSe, Fedora и проч, обычно пишется при загрузке машинки

Re: Как закрыть 22 порт

Я хотел бы узнать как мне закрыть 21 порт Чтоб через команду ssh нельзя было зайти на мой комп .

Ещё один вопрос я чё-то не понял как указать дистр, которым я пользуюсь, напишите как его указать.

Защита 22го порта сервера — ssh

Многие недооценивают опасность от автоматического подбора паролей на 22м порту — это, который ssh.

Я тоже раньше не заморачивался по этому поводу, пока, несколько лет назад, у меня не увели сервер с 12символьным цифробуквенным паролем в разных регистрах.

Ну то есть, вчера я мог на него зайти, а сегодня — уже не пускает! И чем он там занимается, под руководством новых хозяев, в каком ботнете учавствует — мне не ведомо. Хорошо, что к этому серверу у меня был физический доступ, и я смог сбросить пароль через LiveCD.

Заодно посмотрел в /var/log/auth.log и ужаснулся: десятки тысяч попыток логина с разных китайских айпишников, под разными именами, типа root, user, ftp, www-data и пр.

Собственно, с тех пор я и выработал свои правила защиты 22го порта.

Запрет входа для root

Необходимо запрещать вход для юзеров, чьи имена известны любому боту. Это root, ftp, www-data и подобные. После установки Ubuntu на сервер, обычно есть только root.

Поэтому нужно создать нового юзера, если увас его еще нет

добавить его в группу sudo

и запретить вход root, путём редактировани /etc/ssh/sshd_config

Боту уже стало сложнее, ему нужно угадать и имя и пароль. Однако, если он может делать тысячи попыток в секунду, рано или поздно его ждёт успех.

Защита через iptables

Многие совутуют менять стандартный порт 22 на любой другой, но мне это решение не нравится по двум причинам:
— Это неудобно. В каждом приложении нужно настраиввать отдельно порт для коннекта.
— Не даёт ничего. Любое сканирование портов сразу покажет, на каком порту живёт ssh, а дальше бот будет ломиться уже в него.

Значит, нужно защитить стандартный порт 22 через iptables. Есть много решений, типа fail2ban, но мне нравится самое простое — запоминать тех, кто слишком часто отваливается и не пускать их больше в течении n секунд.

Вот как это задать:

Это нужно сохранить в скрипт /root/iptables и добавить вызов скрипта в /etc/rc.local, чтобы он стартовал при загрузке сервера.

Время блокировки можно подбирать самостоятельно. Дело в том, что 30 секунд — это довольно много, и разные приложения, типа редакторов или ftp-клиентов не всегда могут разобатать с этим правилом, если подключаются слишком часто.

Тогда можно заменить 30 секунд на 10 или даже 5. Но чем больше блокировка — тем меньше шансов у бота.

Проверка эффективности

Неудачные попытки подбора паролей очень просто смотреть в /var/log/auth.log таким скриптом:

Вот результаты на сервере, с блокировкой в одну секунду:
Несколько тысяч подборов паролей в сутки!

А вот мой сервер, блокировка 30 секунд:
Нормальный бот с такой с такой скоростью работать не сможет, конечно.

Вот и всё. 2 простейших правила, и ваш сервер становится гораздо более защищён от подбора пароля по ssh.
Дело 5 минут, не ленитесь настроить прямо сейчас!

Также предлагаю публиковать в комментариях количество неудачных авторизаций у вас на сервере — очень интересно сравнить.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *