Вы можете использовать встроенный OpenSSH сервер в Windows для проброса портов через SSH-туннель (SSH туннелирования). Перенаправление портов в SSH позволяет туннелировать (пробрасывать) порты приложений с локального компьютера на удаленный сервер и наоборот. Проброс портов через SSH туннель широко используется в среде Linux/Unix, а теперь вы можете воспользоваться этим возможностями и в Windows. В этом примере мы покажем, как пробросить RDP подключение через OpenSSH на хосте Windows Server.
Для чего нужны SSH-туннели?
SSH-туннель обеспечивает защищенное шифрованный TCP соединение локальных хостом и удалённым сервером SSH. SSH Port Forwarding позволяет туннелировать поверх SSH подключение к локальному порту на локальном компьютере к любому TCP порту на удаленном сервере (или наоборот)
Порт форвардинг в SSH-туннелях применяются для:
- Обхода межсетевых экранов;
- Открытия бэкдоров в частные сети;
- Организации простых VPN/прокси сценариев для безопасного удаленного подключения;
- Защиты трафика устаревших приложений (протоколов), которые передают данные в открытом тексте (без шифрования).
Вы можете перенаправить в SSH туннель только TCP трафик/порт (UDP и ICMP протоколы не поддерживаются).
Проброс портов через SSH туннель можно использовать в сценариях, когда нужно подключиться к удаленному компьютеру, который защищен межсетевым экраном. Например, у вас имеется сервер c Windows, на котором наружу открыт только SSH порт (TCP 22). Все остальные порты блокируются аппаратным межсетевым экраном или Windows Defender Firewall Windows. Ваша задача подключиться к рабочему столу этого Windows сервера с помощью клиента RDP. Казалось бы, невозможная задача, т.к. порт RDP 3389 блокируется брандмауэром. Однако вы можете получить доступ к любому открытому порты на удаленном хосте через SSH-тунель.
Чаще всего используются следующие сценарии проброса через SSH:
- Local TCP forwarding — проброс локального порта на удаленный сервер;
- Remote TCP forwarding — проброс удаленного порта на локальный компьютер;
- Двойной SSH туннель – позволяет соединить между собой через SSH сервер компьютеры без выделенных белых IP адресов или находящиеся за NAT (если не подходит решение с OpenVPN)
Защищенный доступ к RDP через SSH туннель (local TCP forwarding)
В этом режиме вы создаете на своем компьютере локальный TCP порт, подключения к которому перенаправляются через SSH туннель на указанный порт удаленного сервера. В этом примере мы создадим локальный порт 8888, при подключении к которому выполняется перенаправление на RDP порт 3389 на удаленном компьютере. Общая схема подключения выглядит так:
Для проброса портов нам потребуется SSH клиент. Можно использовать сторонний клиент (например, Putty), но я буду использовать встроенный SSH клиент в Windows. Чтобы установить клиенте OpenSSH, выполните в консоли PowerShell команду:
Чтобы создать SSH туннель с удаленным компьютером 192.168.1.90, выполните команду:
Чтобы SSH туннель работал в фоновом режиме, нужно добавит параметр –f.
Теперь, чтобы подключится к удаленному компьютеру по RDP через SSH туннель, вам запустить RDP-клиент (mstsc.exe) и подключиться на локальный порт 8888 своего компьютера:
Выполните аутентификацию на удаленном компьютере и можете спокойно работать в RDP-сессии. С помощью команды Get-NetTCPConnection или утилиты TCPView вы можете убедиться, что RDP подключение установлено локально (RDP подключение инициировано запущенным локально SSH сервером):
При этом порт TCP/3389 на сервере не доступен с удаленного компьютера. Вы можете проверить доступность порта с помощью командлета Test-NetConnection:
Test-NetConnection 192.168.1.90 -port 3389
TcpTestSucceeded : False
Обратите внимание, что если вы перенаправляете таким образом незашифрованный трафик приложения, то по сети он передается в зашифрованном виде. Трафик шифруется на одном конце SSH соединения и расшифровывается на другом.
Другие компьютеры в вашей локальной сети смогут одновременно подключиться к удаленному RDP серверу Windows, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP). Для этого, они должны подключиться RDP клиентом к порту 8888 на компьютере, на котором создан SSH туннель:
mstsc.exe /v 10.10.1.220:8888
Защита RDP подключения с помощью SSH туннеля может быть хорошей альтернативой VPN для доступа к публичным Windows хостам в Интернете. В этом случае вам не нужно открывать прямой доступ к порту RDP/3389 из Интернета к хосту Windows. Достаточно открыть только порт SSH/22, что защитит вас от атак подбора пароля по RDP и эксплуатации 0-day RDP уязвимостей.
Для автоматического ввода пароля для подключения к SSH можно использовать утилиту sshpass. Ее можно запустить через подсистему WSL2 для Windows.
Установите sshpass в Ubuntu WSL:
$ sudo apt-get -y install ssphass
Запустите клиент Remote Desktop Connection (mstsc.exe) и сохраните в Windows RDP файл с настройками подключения:
Computer : localhost:8888 User name : remoteusername
Для автоматического подключения к удаленном RDP хосту с сохранённым паролем SSH, используйте такой bat файл:
Или (предпочтительно) настройте SSH аутентификацию по ключам.
SSH туннель в Windows с помощью Putty
Рассмотрим, как настроить SSH туннель в Windows с помощью популярного SSH клиента Putty.
- Запустите PuTTY и перейдите в раздел Connection -> SSH -> Tunnels;
- В поле Source port укажите локального порта (в нашем примере это 8888);
- Укажите IP адрес сервера SSH и порт на удаленном хосте, на который нужно выполнить переадресацию:
192.168.31.90:3389
- Выберите Local в качестве Destination и нажмите Add;
- Чтобы не открывать shell удаленного хоста при подключении через туннель, включите опцию Don’t start a shell or command at all в разделе SSH;
- Вернитесь на вкладку Session, укажите имя или IP адрес удаленного SSH хоста и порт подключения (по умолчанию порт 22). Чтобы сохранить настройки подключения, укажите имя сессии в поле Saved Session и нажмите Save;
- Теперь вы можете запустить сохраненный SSH туннель в Putty прямо и панели задач Windows.
Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Есть еще один вариант применения SSH туннеля – remote TCP forwarding. Через SSH туннель вы можете открыть доступ удаленному серверу к локальному порту на вашем компьютере или порту на другом компьютере в вашей локальной сети. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему Интранет сайту (не опубликованному в Интернете). Для создания обратного туннеля, используйте такую команду:
Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес
http://localhost:8080
.
С помощью SSH туннелей вы можете строить целые цепочки для форвардинга портов. Включить или отключить SSH туннелирование можно в конфигурационном файле OpenSSH (sshd_config) с помощью директив:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no
Данные опции неприменимы для текущей версии OpenSSH в Windows.
Как подключиться? #
Чтобы подключиться к серверу с ОС Linux, Вам потребуется SSH и sFTP-клиенты.
Ссылки на самые популярные клиенты для Windows!
Termius — альтернативный SSH-клиент.
WinSCP — альтернативный FTP-клиент.
В данном случае мы рекомендуем использовать именно WinSCP для подключения по SFTP, однако как наиболее подходящий вариант для новичков, ниже мы разберем подключение через FileZilla.
Данные для подключения можно посмотреть в сообщении на эл. почте или выбрать услугу в личном кабинете и кликнуть на неё, открыв страницу услуги.
Для подключения по SFTP и SSH используются идентичные данные.
Порядок действий для подключения к VDS/VPS Linux по SSH
Далее введите порт. По умолчанию это — 22
Нажмите на кнопку для подключения — Open.
Далее необходимо указать имя пользователя (по умолчанию это — root).
Затем вводим пароль.
Пароль в PuTTY вводится невидимыми символами!
Чтобы вставить текст в PuTTY, необходимо нажать ПКМ (правая кнопка мыши) для Windows.
Как подключиться по sFTP?
Вам необходимо ввести следующие данные, которые были предоставлены после активации сервера:
Стандартный порт для sFTP-подключений — 22.
Следом нажимаем кнопку «Быстрое соединение».
Готово! Мы подключились к серверу и оказались в главной директории /root.
Теоретические основы с иллюстрациями и практика на GitHub.
Иллюстрация: Катя Павловская для Skillbox Media
Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.
После регистрации на вы получаете профиль с настроенным HTTPS-соединением. Это протокол для безопасной загрузки и скачивания данных из удалённого репозитория. Однако не все компании предпочитают HTTPS и по разным причинам просят своих разработчиков выбирать альтернативу — протокол SSH.
В статье мы познакомимся с SSH-соединением и научимся перенастраивать под него профиль на GitHub. Перед практикой будет теоретический блок, объясняющий принципы работы технологии. Вы узнаете, как данные переходят с устройств на и почему это безопасно.
Если вы только начинаете использовать GIt, рекомендуем перед настройкой SSH-соединения почитать про GitHub.
CTO Flocktory, программный директор профессии «DevOps-инженер» в Skillbox, директор программного комитета DevOpsConf.
До внедрения SSH для удалённого подключения был популярен протокол Telnet, известный как Teletype Network. Он позволял запускать терминальные команды, передавать файлы, обновлять данные — то есть решал множество задач системного администрирования. Однако Telnet был уязвим к атакам, поскольку открыто передавал данные и не защищал трафик от перехвата. Причина: протокол появился в 1969 году, когда инженеры разворачивали интернет. Тогда масштабирование было приоритетнее безопасности.
Покажем уязвимость открытой передачи данных на примерах. Пользователь отправляет незашифрованный файл через Telnet. Если злоумышленник отслеживает , то сможет получить доступ к содержимому файла.
Пользователь может зашифровать файл перед отправкой через Telnet. Однако если отправитель и получатель не встретятся лично, то придётся высылать по сети. Так злоумышленник получит файл и ключ к нему.
Иллюстрация: Оля Ежак для Skillbox Media
На смену Telnet пришёл SSH. SSH (Secure Shell — защищённая оболочка) — это протокол для удалённого обмена данными между устройствами. Он основан на взаимодействии приватного и публичного ключей, которые защищают трафик алгоритмом асимметричного шифрования.
Представьте, что первому пользователю нужно получить файл от второго пользователя. Он берёт ключ и открытый замок, а затем действует так: ключ оставляет себе, а открытый замок передаёт по сети. Замок доходит до адресата и достаётся злоумышленнику. Файл с данными пока не передан.
Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь закрывает файл на замок и высылает его обратно. Закрытый замок попадает к первому пользователю и к злоумышленнику. Первый пользователь открывает замок своим ключом и достаёт файл. У злоумышленника есть открытый и закрытый замок, но без ключа он не сможет извлечь файл. Так стороны могут безопасно обмениваться данными.
Иллюстрация: Оля Ежак для Skillbox Media
В концепции SSH открытый замок представляет публичный ключ, или public key. Ключ от замка — приватный ключ, или private key. С помощью публичного ключа мы шифруем данные, а с помощью приватного — расшифровываем. Без приватного ключа даже владелец данных не получит к ним доступа. Приватный ключ важно беречь.
Иллюстрация: Оля Ежак для Skillbox Media
Если не упрощать объяснение, то реализация SSH-протокола происходит в несколько этапов. Это механизм, включающий в себя установку защищённого соединения, аутентификацию и обмен данными между клиентом и сервером.
- Клиент отправляет серверу ID своего публичного ключа. Таким образом он заявляет, что обладает соответствующим приватным ключом.
- Сервер шифрует публичным ключом случайное сообщение и отправляет клиенту. Клиент должен это сообщение расшифровать и отправить в ответ.
- Для проверки аутентификации клиент должен расшифровать сообщение и передать его в зашифрованном виде обратно на сервер. Так он докажет, что действительно обладает приватным ключом. Иначе запрос будет отклонён.
- Клиент и сервер договариваются об общем секретном ключе. Безопасное согласование такого ключа обеспечивает криптопротокол Диффи — Хеллмана.
- Стороны выбирают метод шифрования трафика. Сейчас часто используют AES-256, AES-192 и AES-128 — выбор зависит от согласия сторон и настроек безопасности сервера. Однако алгоритмы безопасности периодически обновляются, поэтому важно ориентироваться на современный стандарт.
После успешного прохождения аутентификации клиент и сервер могут безопасно обмениваться данными по зашифрованному каналу.
Изображение: Майя Мальгина для Skillbox Media
По умолчанию SSH использует алгоритм RSA. Это математическая модель для реализации шифрования данных с помощью одного ключа и их расшифровки с помощью другого. Преобразование строится по принципу работы обратной функции: функция зашифровывает данные, а обратная функция их расшифровывает.
Для лучшего понимания работы обратной функции рассмотрим пример с комплементарным подбором цветов на круге Иттена. В цветовом круге у каждого цвета есть дополнительный цвет. Дополнительный цвет находится на противоположной стороне круга и отделён от основного цвета белой зоной. Примеры: красный и зелёный, жёлтый и фиолетовый, оранжевый и голубой.
Иллюстрация: Skillbox Media
Пользователи решили обменяться цветами. Первый участник выбирает цвет и определяет его дополнительный цвет. Дополнительный цвет попадает к адресату и злоумышленнику. Об основном цвете злоумышленник не знает.
Иллюстрация: Оля Ежак для Skillbox Media
Второй пользователь смешивает дополнительный цвет со своим — тем, что он хотел выслать в ответ. Получается новый цвет — результирующий. Результирующий цвет доходит до адресата и достаётся злоумышленнику.
Иллюстрация: Оля Ежак для Skillbox Media
Первый пользователь смешивает результирующий цвет со своим исходным. Получается цвет, который передал второй пользователь. У злоумышленника есть дополнительный цвет от первого пользователя и результирующий от второго. Если он смешает свои цвета, то не узнает загаданный цвет.
Иллюстрация: Оля Ежак для Skillbox Media
В алгоритмах шифрования происходят похожие процессы, но вместо цветов используются данные. Приватный ключ не хранится на сервере, а публичный ключ можно пересылать по сети. Если злоумышленник перехватит публичный ключ, то не сможет им воспользоваться. Остаётся как-то случайно подобрать приватный SSH-ключ. Однако это маловероятно, поскольку речь о длинной цепочке произвольно сгенерированных цифр и букв. Примеры будут далее.
Помимо RSA, встречаются и другие алгоритмы для создания цифровых ключей:
Ed25519, DSA, EdDSA и другие. В 2024 году чаще всего используют RSA и Ed25519.
Поговорим об их разнице. RSA работает на любой системе, но расходует больше памяти и процессорного времени на создание и верификацию ключей. Ed25519 более эффективный и менее ресурсоёмкий, однако работает не на всех системах.
Большинство пользователей не заметят разницы между алгоритмами RSA и Ed25519. Поэтому рекомендую использовать RSA на 3072 или 4096 бит.
Если у вас операционная система Linux или macOS, перейдите в . Если у вас Windows 10 и более новая версия — настройте программу OpenSSH. Для старых версий Windows попробуйте PuTTY Generator или похожие утилиты.
В выбранной программе введите команду ssh-keygen. Система создаст пару ключей и уточнит место для их сохранения — по умолчанию будет предложена . Ключи добавятся в папку .ssh и получат имя id_rsa.
Для защиты существующего ключа от перезаписи можно использовать флаг -f при вызове команды ssh-keygen. Выглядеть это будет так: ssh-keygen -f $HOME/.ssh/skillbox_private. В этом случае система запросит пароль для защиты приватного ключа и сохранит его в зашифрованном виде. В папке .ssh появятся ключи skillbox_private и skillbox_private.pub, а система сообщит о завершении операции.После вы сможете использовать новые ключи для доступа к серверам.
Следующий шаг — парольная фраза, дополнительная мера безопасности. Её создавать не обязательно — для пропуска нажмите Еnter. Всё: ключи готовы, в терминале должна появиться графика с названием технологии шифрования.
Скриншот: iTerm2 / Skillbox Media
Посмотрим содержимое папки .ssh. Для этого выполним несколько команд:
- cd .ssh — переходим в папки .ssh;
- ls -a — выводим список содержимого, включая скрытые файлы;
- cat id_rsa — смотрим на содержимое приватного ключа.
⚠️ Внимание: ниже на скриншоте приватный ключ показан для примера. Он нигде не используется и уже удалён. Никому не показывайте этот ключ — от него зависит безопасность вашей информации.
Скриншот: iTerm2 / Skillbox Media
С помощью команды cat id_rsa.pub можно посмотреть публичный ключ — такой же набор не связанных символов, только меньше. Этот ключ можно передавать.
Скриншот: iTerm2 / Skillbox Media
После флажка -t мы пишем нужную технологию, а после -b — новый размер ключа. Дальше действуем по базовому сценарию: выбираем директорию для сохранения ключей и добавляем парольную фразу, если она вам необходима.
Скриншот: iTerm2 / Skillbox Media
В папке .ssh можно хранить разные SSH-ключи.
Скриншот: iTerm2 / Skillbox Media
Скриншот: iTerm2 / Skillbox Media
Переходим на github.com и выполняем следующие шаги:
- создаём учётную запись, если её нет;
- в настройках профиля выбираем подраздел «SSH and GPG keys»;
- кликаем на кнопку «New SSH key» и вставляем в поле публичный ключ;
- добавляем к публичному ключу краткое произвольное описание;
- кликаем на «Add SSH key» и вводим пароль от учётной записи, если нужно.
Публичные ключи можно не описывать. Это удобно, если у вас несколько ключей для разных проектов. По описанию проще находить нужный ключ.
Скриншот: GitHub / Skillbox Media
Скриншот: iTerm2 / Skillbox Media
Скриншот: GitHub / Skillbox Media
Если в процессе настройки у вас возникнут вопросы, сложности или вам просто захочется больше узнать о SSH больше — посмотрите документацию на GitHub.
GitHub и некоторые другие сервисы не работают по паролю. Однако для удалённого подключения к серверу пароль нужен, но его можно заменить SSH.
- ssh — запрос на установку защищённого соединения;
- user — вводим выданный логин;
- host — адрес удалённого сервера. Здесь может быть как IP-адрес, так и хост с определённым доменным именем.
SSH-соединение установлено, и можно входить на указанный сервер без пароля.
Научитесь работать с нейросетями — бесплатно!
Большая конференция по ИИ: пять экспертов и 10 нейросетей. Освойте нейросети — работа с ними становится обязательным навыком. Нажмите на баннер, чтобы узнать подробности.
Сегодня все чаще в работе используются серверы с установленной операционной системой семейства Linux. Для возможности удаленного доступа используется протокол прикладного уровня под названием SSH. В данной статье мы рассмотрим использование протокола SSH для подключения к удаленным Linux-серверам, а также настройку некоторых параметров с целью улучшения безопасности.
Подключение по SSH можно использовать для абсолютно любого дистрибутива, так как протокол SSH используется по умолчанию практически во всех современных дистрибутивах Unix и Linux.
В качестве примера вся конфигурация SSH, которая будет описана в данной статье, использовалась в дистрибутиве Ubuntu версии 22.04. Однако ее без проблем можно использовать в любых других дистрибутивах, включая Debian, CentOS, Astra Linux и т.д.
Для подключения к серверам на Linux по протоколу SSH существует большое количество клиентских программ.
Среди самых известных программ для Windows можно выделить PuTTY, Bitvise SSH Client, SuperPuTTY, mRemoteNG, MobaXterm
На macOS можно воспользоваться программой Termius или стандартной утилитой SSH, используя терминал.
Также можно использовать стандартный SSH-клиент (OpenSSH), который вызывается через командную строку (cmd) и присутствует в ОС семейства Windows: Windows 10, Windows 11 и Windows Server 2019.
Установка SSH на сервер
В большинстве случаев SSH уже предустановлен на сервере, и вы сразу сможете подключиться. Если же пакет SSH по каким-то причинам не установлен, то его необходимо установить при помощи одной из следующих команд (все команды представленные ниже необходимо выполнять от имени пользователя root
или от обычного пользователя, но с правами sudo
).
Для дистрибутивов на основе APT (Ubuntu, Debian, Linux Mint, Kali Linux, Astra Linux и другие) используйте команду:
apt -y install openssh-server
Для дистрибутивов на основе RPM (CentOS, Fedora, Red Hat Enterprise Linux, ALT Linux и другие) необходимо выполнить одну из команд ниже:
Для пакетного менеджера YUM:
yum -y install openssh-server
Для пакетного менеджера DNF:
dnf -y install openssh-server
Для дистрибутивов на основе Pacman (Arch Linux, ArchLabs, Manjaro и другие) необходимо выполнить команду:
pacman -S openssh
Вместе с пакетом openssh-server
также автоматически устанавливается пакет openssh-client
, который представляет собой консольную утилиту SSH для подключения к удаленным серверам.
Синтаксис команды SSH
Стандартный синтаксис команды SSH выглядит следующим образом:
ssh <имя_пользователя@IP_адрес_или_доменное_имя_удаленного_хоста>
ssh alex@80.242.57.93
По умолчанию подключение происходит по 22 порту. Если же порт SSH сервера другой, то он указывается при помощи опции -p
:
ssh alex@80.242.57.93 -p 2222
Конфигурационный файл SSH-сервера
Конфигурационный файл, который использует SSH-сервер, называется sshd_config
и располагается в директории /etc/ssh
. Не путайте файл SSH-сервера с файлом SSH-клиента — ssh_config
. Далее в статье будет использоваться только файл сервера — sshd_config
.
Подключение по SSH при помощи пароля
ssh alex@80.242.57.93
После ввода команды выше появится приглашение к вводу пароля. Если пароль введен правильно, то вы попадете на сервер. Пароль необходимо вводить каждый раз при подключении.
Если вы подключаетесь к серверу в первый раз, то увидите сообщение от так называемого «отпечатка пальцев» (fingerprint):
Fingerprint используется для повышения безопасности путем генерации уникального набора символов. Каждый раз при подключении к серверу ваше устройство, с которого осуществляется подключение, сравнивает ранее сгенерированную комбинацию. Если, например на сервере была переустановлена операционная система, был переустановлен SSH-сервер или же на текущем сетевом адресе произошла смена устройства, но при этом адрес остался прежним, то в таких случаях система будет предупреждать что отпечаток изменился по сравнению с первым подключением.
Использование паролей не является безопасным методом подключения, так как пароль можно попытаться подобрать. Наиболее безопасным методом аутентификации является использование SSH-ключей. О них речь пойдет в следующем разделе.
Подключение по SSH при помощи ключей
Более распространенным и более безопасным способом вместо использования паролей являются SSH-ключи.
В работе используются два типа ключей: открытый (public) и закрытый (private). Открытый ключ используется для шифрования и является публичным — если кто-то вдруг завладеет вашим открытым ключом, то ничего критичного не произойдет. В свою очередь закрытый ключ используется для расшифровки. Закрытый ключ должен храниться только у вас и не в коем случае не быть доступным для третьих лиц. Для использования ключей сначала их необходимо сгенерировать. Для генерации используется команда:
ssh-keygen
Для начала команда предложит вам выбрать директорию, в которую будут сохранены открытый и закрытый ключи. По умолчанию ключи хранятся в скрытой (символ точки) директории .ssh
, которая в свою очередь будет создана в домашней директории того пользователя, из-под которого запущена команда ssh-keygen
. В данном примере ключи будут сохранены в домашней директории пользователя alex
а именно в /home/alex/.ssh
. Также вы можете указать другой путь и директорию куда будут сохранены ключи. Чтобы оставить путь по умолчанию, достаточно нажать на клавишу Enter:
Далее программа предложит задать passphrase — пароль для ключа. Это обеспечит дополнительный уровень защиты. Если кто-то получит доступ к вашему ключу, то ему придется подбирать еще и пароль. Однако стоит заметить, что при использовании passphrase вам придется вводить ее каждый раз при новом подключении по аналогии с использованием паролей. Passphrase можно не использовать. Для этого достаточно при появлении фраз Enter passphrase (empty for no passphrase) и Enter same passphrase again нажать на клавишу Enter:
После этого ssh-keygen
сообщит о том что ключи сгенерированы и сохранены в ранее указанной директории:
Проверим содержимое директории .ssh
(/home/alex/.ssh
):
id_rsa
— закрытый ключid_rsa.pub
— открытый ключ
Перед тем как подключаться к нужному хосту, необходимо скопировать открытый ключ на этот удаленный хост. Для этого в комплекте с OpenSSH поставляется утилита для копирования открытых ключей на удаленные серверы — ssh-copy-id
. Синтаксис у команды следующий:
ssh-copy-id -i <полный путь до файла открытого ключа- id_rsa.pub> имя_пользователя_на_удаленном_сервере@IP_адрес_или_доменное_имя
Предположим, нам необходимо подключиться к серверу с IP адресом 82.97.250.52 без пароля, только при помощи ключа. Для этого копируем ранее сгенерированный ключ на хост 82.97.250.52:
ssh-copy-id -i /home/alex/.ssh/id_rsa.pub alex@82.97.250.52
Так как мы впервые осуществляем подключение, то нам необходимо ввести yes
:
При копировании ключа нам необходимо ввести пароль от учетной записи пользователя на удаленном хосте. Пароль необходимо вводить только один раз:
После этого ключ будет добавлен:
Теперь можно попробовать зайти на удаленный сервер:
ssh alex@82.97.250.52
На удаленном хосте переданный открытый ключ был записан в файл authorized_keys
, который находится в скрытой директории .ssh
в домашней директории того пользователя, из-под которого осуществлялось подключение:
Запрет на подключение при помощи пароля
Так как использование паролей при подключении по SSH не является безопасным, то рекомендуется отключить данный метод аутентификации и оставить только вход по ключам.
Для этого откроем на редактирование конфигурационный файл SSH-сервера (sshd_config
) при помощи любого текстового редактора:
nano /etc/ssh/sshd_config
Далее необходимо найти параметр PasswordAuthentication
и изменить значение на no
:
PasswordAuthentication no
После этого сохраните изменения, выйдите из файла и перезапустите демон SSH-сервера при помощи команды:
systemctl restart ssh
Будьте предельно осторожны при выключении аутентификации по паролю, не убедившись перед этим, что аутентификация по ключам корректно работает. Если вход по ключам не будет работать, а аутентификация по паролю будет выключена — вы не сможете попасть на сервер при помощи SSH. Для решения данной проблемы вы можете использовать веб-консоль которая находится в разделе «Консоль» в панели управления сервера:
Авторизуйтесь под необходимой учетной записью, далее верните значение параметра PasswordAuthentication
в yes
и перезапустите демон SSH.
Смена стандартного порта SSH
По умолчанию сервер SSH работает по 22 порту. Порт можно изменить. Для этого в файле sshd_config
найдите строку Port
. Раскомментируйте при необходимости (удалите символ решетки #
) и задайте любой порт, который не занят на вашем сервере, в диапазоне от 0 до 65536 (кроме портов 0-1023, так как данный диапазон зарезервирован для популярных приложений).
После этого сохраните изменения, выйдите из файла и перезапустите демон SSH-сервера при помощи команды:
systemctl restart ssh
Теперь при подключении используйте опцию -p
, в которой будет задан новый порт, например:
ssh alex@82.97.250.52 -p 2224
Запрет на подключение по SSH пользователю root
По умолчанию в некоторых дистрибутивах разрешено подключение из-под учетной записи root
. Так как root
-пользователь обладает всеми привилегиями в системе и может выполнять многие опасные действия, то необходимо отключить вход для пользователя root
.
Для этого в файле sshd_config
найдите строку PermitRootLogin
и задайте ей значение no
:
PermitRootLogin no
После этого сохраните изменения, выйдите из файла и перезапустите демон SSH-сервера при помощи команды:
systemctl restart ssh
Теперь при попытке входа от имени root
-пользователя будет отображаться ошибка: Permission denied, please try again.
Разрешение/запрет на подключение по SSH определенным пользователям
AllowUsers
разрешает определённым пользователям подключение по SSH. Разрешить доступ можно как одному пользователю, так и нескольким сразу, для этого их необходимо перечислить через пробел. Предполагается, что пользователи, которым разрешено подключение, уже созданы в операционной системе.DenyUsers
запрещает определённым пользователям подключение по SSH. Запретить доступ можно как одному пользователю, так и нескольким сразу, для этого их необходимо перечислить через пробел. Предполагается, что пользователи которым запрещено подключение, уже созданы в операционной системе.
AllowUsers test admin
И запретим доступ для пользователей nginx
и websrv
:
DenyUsers nginx websrv
Также разрешать и запрещать доступ можно и для групп:
AllowGroups www
DenyGroups db
После этого сохраните изменения, выйдите из файла и перезапустите демон SSH-сервера при помощи команды:
systemctl restart ssh
Теперь пользователи, которым запрещен доступ, при попытке входа будут получать ошибку Permission denied, please try again.
Заключение
Протокол SSH является незаменимым средством для подключения к вашим удаленным серверам. Помимо встроенного шифрования, вы также можете гибко настраивать конфигурацию SSH-сервера с целью повышения защиты.
Для подключения к удаленному серверу по протоколу SSH с помощью стандартной командной строки Windows, вы можете использовать программу ssh, которая доступна в операционных системах Windows 10 и более новых версий. Предварительно можете проверить установлен ли данный клиент в вашей системе.
Чтобы подключиться к ssh выполните следующие действия:
- Откройте меню “Пуск” и начните вводить “cmd”. Выберите “Командная строка” из результатов поиска.
- В командной строке введите команду ssh вместе с вашим именем пользователя и IP-адресом (или доменным именем) сервера.
- Замените username на ваше имя пользователя на сервере, а server_ip_or_domain на IP-адрес или доменное имя удаленного сервера.
- После ввода команды ssh, вам будет предложено ввести пароль для вашего аккаунта на удаленном сервере. Введите пароль и нажмите Enter.
- Если все было введено верно, вы будете подключены к удаленному серверу через SSH.
- Для завершения сессии SSH и выхода из удаленного сервера введите команду exit и нажмите Enter.
Обратите внимание, что для использования SSH на удаленном сервере должен быть настроен и работать SSH-сервер. Также учтите, что использование SSH командной строки требует знания основ команд и работы в терминале.
Tell us how can we improve this post?
SSH — сетевой протокол, разработанный в 1995 году с целью установления стабильного и безопасного соединения с удаленными серверами. В наши дни технология получила наибольшее распространение при работе с VPS/VDS и выделенными серверами. Благодаря передаче данных по защищенным криптографическими методами каналам достигается беспрецедентно высокий уровень информационной безопасности.
Для дистанционного управления сервером, работы с текстовыми файлами, медиа-материалами и другими форматами администраторы используют специальные SSH-клиенты и ряд команд. Для чего нужны SSH-команды, какие они бывают и как ими пользоваться — разберем в этой статье.
Для лучшего понимания термина представим отвлеченную ситуацию: вы живете в Москве, а у вашего заказчика из Екатеринбурга «полетел» интернет-магазин, размещенный на локальном сервере. Вариантов дальнейшего развития ситуации может быть несколько:
- Вы всё бросайте и ближайшим рейсом вылетаете в другой город, чтобы решить проблему на месте.
- Или же отбрасываете в сторону эмоции, удаленно подключаетесь к серверу по SSH, находите и устраняете ошибки, не покидая удобного кресла в московском бизнес-центре.
Отправка команд и пакетов данных выполняется по защищенному SSH-протоколу.
Если с удаленным сервером или ПК удастся связаться таким образом, это можно сравнить с тем, словно вы подсоединили к нему свою клавиатуру. С этого момента можно запускать и выполнять на нём различные программы, проводить любые операции и действия, предусмотренные командной строкой.
Что можно делать с помощью SSH-команд
Команды по SSH можно использовать для:
- настройки серверного оборудования;
- программирования;
- установки WordPress, Bitrix, OpenCart и других CMS;
- выявления и устранения ошибок на сайте;
- запуска и остановки ПО, в том числе зависшего;
- копирования, вставки и перемещения файлов;
- настройки параметров безопасности ПК и файлов;
- перезагрузки сервера;
- удаления списка файлов, форматирования жесткого диска;
- дистанционного запуска файлов.
Конечно, этот список далеко не полный, но позволяет оценить открывающиеся возможности по удаленной работе с сервером.
Кратко о подключении и работе по SSH
Взаимодействие с виртуальными и выделенными серверами по SSH-протоколу выполняется в несколько этапов с помощью достаточно простых команд. Рассмотрим их более детально.
Запуск SSH-клиента
Если вы используйте MacOS, Linux или другие Unix-системы, значит, ничего скачивать и устанавливать не нужно — у этих ОС уже есть SSH-клиент (Terminal). Чтобы его запустить, нажмите Ctrl+Alt+T.
Далее для подключения к удаленному серверу введите в командную строку команду:
- root — имя суперпользователя (чаще всего подключаются через этот аккаунту). Если вы используете другое имя пользователя, впишите его вместо рута.
- 11.44.45.66 — IP-адрес удаленного сервера.
По умолчанию для подключения по SSH-протоколу используется 22-й порт. Порт — это что-то типа номера рейсового автобуса, курсирующего по маршруту. И все вокруг уже знают, что «попасть» на остановку SSH можно на автобусе-порте под номером 22. Но, всё течет, всё меняется, и иногда на маршрут вместо привычного автобуса выходит, например, маршрутка №320.
Так и стандартный 22-й порт можно заменить на другой, что ещё больше обезопасит подключение. Для этого используется команда:
У ОС Windows собственного SSH-клиента нет, его придется скачивать дополнительно. Одним из самых популярных вариантов является PuTTY с графической оболочкой, рассчитанной на более удобную и простую настройку параметров удаленного соединения.
SSH-соединение
Установление соединения выполняется в соответствии со следующим алгоритмом:
- SSH-клиент запрашивает подключение к серверу.
- Участники соединения проводят взаимную идентификацию, решают вопросы относительно используемых протоколов шифрования.
- Создается защищенный и стабильно функционирующий канал отправки команд.
В роли сервера в рамках SSH-подключения могут выступать в том числе удаленные компьютеры или ноутбуки.
Обмен ключами шифрования
После запуска SSH-клиента:
- Удаленный сервер направляет клиенту перечень протоколов шифрования, с которыми он готов работать.
- Если клиент также готов работать с этими протоколами, между ним и сервером криптографическими инструментами создается защищенное и надежное соединение. Внести в него изменения или взломать практически невозможно.
- Каждая сторона подключения получает специальный ключ, с помощью которого производится шифрование и дешифрование команд.
Если подключение прошло в штатном режиме, при первом сеансе связи сервер попросит подтвердить соединение:
Are you sure you want to continue connecting (yes/no)?
Завершаем операцию и вводим yes. Таким образом, мы выполнили уникальное подключение. В дальнейшем при изменении настроек и/или параметров работы соединения его участники поймут, что что-то идет не так и нужно бить тревогу.
Фактически на этом всё. Защищенное соединение по SSH-протоколу установлено. Теперь вы можете без каких-либо проблем управлять удаленным сервером практически из любой точки планеты.
Root-доступ
По умолчанию при использовании SSH root-доступ разрешен, однако такой подход ставит под угрозу безопасность соединения. Поэтому после подключения рекомендуется раскомментировать строчку:
Дополнительно, чтобы разрешить доступ только определенным пользователям (одному или нескольким), воспользуйтесь следующей командой:
Список SSH-команд и основы работы с командной строкой
Разберем основные команды и базовые навыки для работы по SSH-протоколу.
Командная строка, горячие клавиши и дополнительные символы
При подключении к удаленному серверу посредством SSH вы не увидите привычный для большинства пользователей рабочий стол или графический интерфейс с различными кнопками. Перед вами окажется черный экран с текстовыми строками. Именно он и называется командной строкой, которая является текстовым интерфейсом ПО.
Для взаимодействия с утилитой необходимо прописать определенную команду SSH в командную строку в виде текста, а программа выполнит поставленные перед ней задачи.
Помимо команд допускается использование дополнительных символов:
- ; — выполняет функцию разделителя, позволяющего прописывать и активировать сразу несколько команд:
cd ~/Documents; mkdir Pervaya_papka
- && — еще один разделитель. От предыдущего его отличает один важный момент — запуск команд, разделенных &&, осуществляется последовательно, при этом новая команда выполняется, только если успешно завершилась предыдущая:
cd ~/Documents && mkdir Pervaya_papka
- | — одновременно запускает две разные команды.
- ~ — символ является сокращенным написанием /home/имя_учетной_записи/.
Также упростить работу с SSH в консоли можно с помощью горячих клавиш:
- ↑ — открывает выполненную ранее команду;
- Ctrl+C — останавливает запущенный процесс;
- Ctrl+D — аналогична Ctrl+C, только интерпритируется как желание выйти из программы;
- Ctrl+A — отправляет курсор в начало текущей строки;
- Ctrl+E — отправляет курсор в конец текущей строки;
- Ctrl+W — удалить слово в текущей строчке;
- Ctrl+U — удалить всю строчку;
- Ctrl+Shift+C — копировать;
- Ctrl+Shift+V — вставить.
Базовые команды
Рассмотрим наиболее часто используемые SSH-команды:
- sudo — выдаёт права суперпользователя на использование последующей команды, если её нужно выполнить от имени администратора.
- Is — отображает содержимое вокруг вас, то есть все директории и файлы. При этом не обязательно переходить в интересующую папку, можно указать её путь:
ls ~/Desktop/adminvps
- cd — используется для перехода в любую выбранную папку:
cd ~/Desktop/ctomserver
- mkdir — позволяет создавать новую папку:
mkdir ~/Desktop/shared_hosting
- rm — команда для удаления папок и их содержимого (документов, медиа, фото) без возможности восстановления:
rm ~/Desktop/trash
- cp — применяется для создания копии указанного файла в выбранном каталоге:
cp ~/Documents/adminvps.txt /home/adminvps/Desktop/important
- mv — команда для перемещения файлов:
mv ~/Desktop/adminvps.txt ~/Documents
Также может использоваться для переименования файла:
mv ~/Desktop/adminvps.txt adminvps-42.txt
- find — поиск файлов и папок в файловой системе по типу или названию. Например, такая команда будет искать папки с именем adminvps:
find -type d -name adminvps
- history — по умолчанию отображает 10 последних использованных инструментов или приложений. Чтобы изменить это количество любое число:
history 20
- clear — удаляет из текущей сессии консоли все ранее введенные данные, историю выполненных команд, а также содержимое открытых файлов.
Команды для работы с папками и файлами
- ls -lia — отобразит перечень содержимого каталого (всех файлов и папок, в том числе скрытых) в алфавитном порядке с указанием текущего размера.
- pwd — отобразит полный путь до текущей папки.
- cd / && du -hs * — полезная команда, если нужно быстро очистить забитый до отказа жесткий диск, используется для поиска директории с самым большим количеством файлов.
- df — показывает объем свободного дискового пространства сервера.
- cp -r Papka1 Papka 2 — скопирует первую папку вместе со всем содержимым во вторую директорию.
- du -sh — отобразит, сколько места занимает текущая папка и её подпапки.
- du -sh* — показывает, сколько весит каждый файл в текущей папке.
- touch — создаёт файл заданного формата в выбранной директории:
touch ~/Desktop/adminvps.txt
- fsck -y — автопроверка с последующим исправлением ошибок файловой системы.
Команды для работы с архивами
- tar cf Archive.tar adminvps.txt — создать архив в формате .tar, содержащий указанный файл.
- tar xf Archive.tar — выполнить распаковку архива.
- tar czf Archive.tar.gz adminvps.txt — создать архив с использованием сжатия Gzip.
- tar xzf Archive.tar.gz — распаковать такой архив.
- gzip adminvps.txt— сжать документ.
- zip -r Archive.zip /home/adminvps/Desktop/Papka/ — добавить в архив содержимое указанной директории.
- unzip — распакует архив (синтаксис строится по такому же принципу).
Команды для управления процессами
- ps -e — отображает на экране все активные в настоящий момент процессы.
- top — выводит запущенные пользователем процессы с информацией о нагрузке каждого на процессор, занимаемой оперативной памяти, времени работы. Чем-то похожа на диспетчер задач в Windows.
- kill PID — достаточно специфическая команда, позволяющая завершить текущий процесс с заданным PID-кодом (вместо PID вводится число).
- killall — позволяет завершить процесс, зная только его название. PID-код здесь не нужен.
- bg — выводит на экран перечень остановленных и фоновых задач.
- fg — отображает последние задачи.
Команды для работы с системной информацией
- reboot либо shutdown -r — выполняет перезагрузку сервера.
- free — выводит информацию об использовании оперативной памяти (сколько занято и сколько свободно);
- vmstat — отображает информацию о памяти, процессах, степени загрузки процессора и многом другом. Позволяет мониторить состояние и производительность сервера.
- uptime — функциональная и часто используемая системными администраторами команда, показывающая время беспрерывной работы сервера без перезагрузки.
- date — сегодняшняя дата.
- cal — команда выводит на экран календарь на текущий месяц.
- cat /proc/cpuinfo или meminfo — показывает характеристики процессоре или оперативной памяти соответственно.
Команды для работы с сетевыми настройками
- ifconfig — отображает текущие сетевые интерфейсы.
- ifconfig -a — позволяет получить доступ к полному списку интерфейсов, в том числе к тем, которые не активны в настоящий момент.
- ifconfig eth1 down — отключает интерфейс eth1.
- ifconfig eth1 up — включает интерфейс eth1.
- ping adminvps.ru — пинг указанного сайта, проверка соединения в сетях TCP/IP.
- dig adminvps.ru — отображает информацию о DNS-серверах сайта.
- wgеt адрес_ссылки — позволяет скачать файл по указанному адресу. Можно указывать сразу несколько URL-адресов.
- wgеt -c адрес_ссылки — продолжает остановленное скачивание.
Команды для разграничения прав доступа
- chown — нужная команда, которая позволяет назначить владельца для папок и любых файлов системе:
chown adminVPS (имя учетной записи) ~/Desktop/file.jpg
- chmod — используется для смены прав доступа к папке или файлу. Например, для назначения прав на чтение и перезапись файла:
chmod 777 ~/Desktop/photo22.png
Подводим итоги
С помощью SSH-команд вы можете удаленно работать с любыми файлами, настраивать сетевые функции и параметры работы сервера и многое другое. В любом случае, SSH-соединение отличается предельно простым и лаконичным интерфейсом и высокой безопасностью передачи любых видов данных.