SSH (от англ. secure shell — безопасная оболочка) это набор программ, которые позволяют регистрироваться на компьютере по сети, удаленно выполнять на нем команды, а также копировать и перемещать файлы между компьютерами. SSH организует защищенное безопасное соединение поверх небезопасных каналов связи. SSH предоставляет замены традиционным r-командам удаленного доступа с тем отличием, что они обладают повышенной безопасностью. SSH — сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов).
Оглавление
Что такое SSH
SSH, или Безопасная Оболочка, это протокол удаленного администрирования, который позволяет пользователю управлять и вносить изменения на его удаленный сервер через Интернет. Эта служба была создана в качестве замены не зашифрованному Telnet и использует криптографические техники, чтобы обеспечить, что всё сообщение между сервером и пользователем было зашифровано. SSH предоставляет механизм для авторизации удаленного пользователя, передавая команды клиента хосту и возвращая ответ обратно клиенту.
На рисунке ниже показано обычное окно SSH. Любой пользователь Linux или macOS может воспользоваться SSH напрямую из окна терминала. Пользователи Windows могут воспользоваться SSH-клиентом вроде Putty. Вы можете выполнять shell команды также, как если бы вы напрямую управляли удаленным компьютером.
Это руководство по SSH расскажет о том, что такое SSH, как работает SSH и заодно поможет вам понять технологии позволяющие протоколу предоставлять защищенное удаленное управление. Мы подробнее остановимся на каждом из слоёв и типов шифрования, а также расскажем о значении каждого из них.
Что значит «протокол»?
Протокол — это набор соглашений, правил, по которым разные программы могут обмениваться информацией. SSH — это набор правил, который известен и вашему компьютеру, и физически отдаленному компьютеру.
Пример: вы вводите команду удаления файла, и эта команда передается на другой компьютер и выполняется там. Ответ (или сообщение об ошибке) возвращается и показывается на вашем компьютере.
Что значит «защищенный»?
Вся информация передается в зашифрованном виде. Подобно тому, как некоторые сайты работают по HTTPS, шифруя информацию. Например, ваш онлайн-банкинг обязательно должен работать по защищенному соединению. В таком случае даже если всю информацию перехватывает злоумышленник, он не сможет расшифровать её.
Интенсив: Девопс для программистов. Вся база за 3 месяца
Из чего состоит протокол SSH
Протокол SSH состоит из 2-х основных компонентов:
- Клиент SSH;
- Сервер SSH.
Клиент SSH — это та программа на вашем компьютере, с помощью которой вы можете получить доступ к используемому серверу. Данная программа бывает как с графическим интерфейсом, то есть в виде обычного приложения, так и без — тогда все команды по настройке передаются через консоль (терминал). Должен быть установлен на компьютере, с которого планируется управление сервером.
Сервер SSH — ожидает сетевое подключение пользователя, и когда получает от него запрос на соединение, воспроизводит все нужные манипуляции, чтобы авторизовать данного пользователя. Может быть запущен на удаленной машине.
Соответственно, сам протокол SSH — это взаимодействие между клиентом и сервером, через которое могут передаваться любые файлы, может осуществляться работа консоли или запуск программ и др.
Ка посмотреть номер открытого порта SSH
Чтобы посмотреть номер открытого порта SSH, можно использовать различные утилиты, предназначенные для этого. Самые популярные из них мы приведем чуть ниже.
Открытый порт SSH подразумевает, что он используется каким-нибудь сервисом или программой для передачи данных по сети. Простые и популярные утилиты, чтобы посмотреть номер открытого порта:
- NetStat. Определяет открытый порт протокола SSH и все соединения в сети в онлайн-режиме.
- SS. Данная программка работает непосредственно с подсистемами ядер, поэтому осуществляет свою работу несколько быстрее и точнее своих конкурентов. Но если вы хотите посмотреть только номер открытого порта, то скорость ее работы не имеет большой важности.
- Lsoft. Также легко покажет номер любого порта SSH и не только.
- Nmap. Делает то же самое, что и предыдущие, но сам по себе является мощным сетевым сканером, который профессионально тестирует и сканирует вашу сеть.
- Zenmap. По сути этот же Nmap с абсолютно с той же функциональностью. Но различие в том, что здесь добавляется удобный визуальный интерфейс.
Абсолютно любой из предложенных инструментов можно использовать, чтобы определить открытый порт протокола SSH и не только. Так как перечень данных утилит используется профессиональными администраторами серверов.
Как поменять номер порта SSH на другой?
Как мы уже говорили в самом начале, по умолчанию используется 22-й порт. Но это не очень хорошо с точки зрения безопасности. Так как стандартный номер порта SSH сильно повышает риск брутфорс-атак. Поэтому смена порта со стандартного немного повышает безопасность вашего сетевого соединения. Обычно конфигурация портов находится по следующему пути настройки сервера: «/etc/ssh/sshd_config».
Чтобы поменять номер порта SSH, нужно:
- Проверить список открытых портов одной из утилит, предложенных выше, чтобы не занимать уже и так открытые порты.
- Подключиться к серверу с рут-правами по SSH.
- Открыть файл sshd_config любым имеющимся редактором текста.
- Найти запись «port 22» или любую другую, которую хотите изменить.
- Изменить на нужный номер порта SSH и сохранить.
- Перезагрузить сервер, чтобы новые конфигурации заработали.
Как вы заметили, сменить номер порта SSH не так сложно, но это сможет повысить защищенность серверного соединения. Поэтому менять номер порта SSH протокола всегда рекомендуется при настройке нового сервера.
Для чего нужен SSH?
Не всегда есть возможность физически находиться у компьютера, с которым нужно работать. Например, если вы хотите создать свой сайт, то он будет размещен на компьютере хостинг-провайдера. Этот компьютер может находиться на другом конце света. Вам нужен способ запускать команды на этом компьютере не выходя из своего дома.
Как подключаться по SSH?
Для подключения к удаленной машине по SSH нужен клиент — специальная программа. В *nix-подобных системах (Linux, macOS) клиент обычно установлен в системе по умолчанию, и достаточно открыть терминал. В Windows нужно скачать сторонний клиент, например, Putty.
Для подключения нужно указать адрес сервера и, опционально, имя пользователя и порт. Вот как выглядит команда при использовании консольного клиента (в терминале):
ssh username@remote_host -p port
Например, для подключения к серверу 52.307.149.244 в аккаунт ivan нужно ввести:
ssh ivan@52.307.149.244
Если не указывать порт, то будет использован порт SSH по умолчанию — 22. Используемый порт задается при настройке SSH-сервера, программы, которая запущена на удаленном компьютере и ожидает подключения извне.
В графическом клиенте вроде Putty нужно ввести ту же информацию в соответствующие поля:
Как работает SSH
Если вы используете Linux или Mac, тогда использование SSH для вас не составит особого труда. Если вы используете Windows, вам необходимо установить SSH-клиент для подключения. Самым популярным SSH-клиентом является PuTTy, о котором вы можете узнать подробнее здесь.
Для пользователей Mac и Linux, перейдите к вашей программе терминала и следуйте инструкциям ниже:
SSH команда состоит из 3 отдельных частей:
ssh {user}@{host}
Часть с SSH даст системе знать, что вы хотите открыть SSH соединение. {user} даст системе сведения об аккаунте к которому вы хотите подключиться. К примеру, вы захотите получить доступ в качестве root пользователя, который фактически является синонимом для администратора системы с полными правами на изменение любых данных в системе. {host} означает компьютер к которому вы хотите подключиться. Это может быть IP адрес или доменное имя (например www.домен.xyz).
Когда вы нажмёте Enter, вылезет окно с просьбой ввести пароль от запрошенного аккаунта. Когда вы его введёте не последует никаких сообщений, однако, ваш пароль будет передан. После того, как вы закончите ввод пароля, нажмите кнопку Enter дважды вновь. Если ваш пароль правильный, то вас встретит окно терминала удаленного управления.
Если вы хотите узнать больше об SSH командах, посетите данное руководство.
Симметричное шифрование
При симметричном кодировании один и тот же секретный ключ используется для шифрования и дешифрования пакетов данных и клиента, и хоста.
При установке соединения специальный алгоритм обмена ключами предварительно согласовывает ключ шифрования и потом использует его на протяжении всей сессии.
Асимметричное шифрование
Если вы используете для авторизации вместо пароля пару приватный+публичный ключ, то SSH применяет ассиметричное шифрование на этапе установки соединения. О том, как сгенерировать пару “приватный+публичный ключ”, читайте ниже.
Публичный ключ используется для шифрования данных, а приватный — для их расшифровки.
- Публичный ключ можно свободно распространять.
- Приватный ключ нельзя никому показывать и передавать.
Алгоритм подключения с асимметричными ключами работает так:
1. Хост и клиент используют свои публичные ключи для генерации общего секретного ключа шифрования сессии.
2. Затем хост шифрует данные публичным ключом и предлагает клиенту расшифровать их своим приватным ключом.
3. Если операция успешна, то клиент авторизуется на хосте с соответствующим именем пользователя.
4. Затем сессия продолжается уже с использованием симметричного шифрования.
Хэширование
В отличие от других схем шифрования, хэширование в SSH используется не для дешифровки данных, а для создания уникальных шифрованных ключей для подтверждения сообщений об аутентификации. Эти ключи (хэши) используются в механизме симметричного шифрования SSH-сессии.
Объяснение разных техник шифрования
Теперь, когда мы получили немного знаний о том, что такое SSH, нам следует перейти к техниками шифрования. Главным преимуществом SSH над его предшественниками является использование шифрования для защиты передачи данных между хостом и клиентом. Хост — это удаленный сервер к которому вы хотите получить доступ, тогда как клиент — это компьютер с которого вы пытаетесь получить доступ к хосту. Существует три различных технологий шифрования, используемых SSH:
- Симметричное шифрование
- Асимметричное шифрование
- Хеширование
Симметричное шифрование
Симметричное шифрование — это форма шифрования, где секретный ключ используется для шифрования и дешифровки сообщения как клиентом, так и хостом. Стоит отметить, что любой клиент имеющий ключ, может дешифровать передаваемое сообщение.
В симметричном шифровании обычно используется один ключ или пара ключей, где один ключ может быть легко вычислен с помощью другого.
Симметричные ключи используются для шифрования всего сообщения в течение SSH сессии. И клиент, и сервер получают ключ согласованным методом, и данный ключ никогда не разглашается третьим лицам. Процесс создания симметричного ключа осуществляется при помощи алгоритма обмена ключами. Что делает этот способ шифрования в некотором смысле безопасным, так это то, что ключ никогда не передаётся от клиента к хосту. Наоборот, оба компьютера делят части публичной информации и используют её для вычисления ключа. Даже если другая машина сможет перехватить информацию, она не сможет вычислить ключ, потому что алгоритм обмена ключом будет неизвестен.
Необходимо отметить, что для каждой SSH сессии свой секретный токен, который генерируется до авторизации клиента. Как только ключ был сгенерирован, все пакеты должны быть зашифрованы приватным ключом. Это включает в себя пароль вписанный пользователем в консоль, таким образом личные данные всегда защищены от анализаторов трафика (снифферов).
Существует разные шифры симметричного шифрования, включая AES (Advanced Encryption Standard), CAST128, Blowfish и т.д. Перед установкой защищённого соединения, клиет и хост решают какой из шифров использовать, создавая список поддерживаемых шифров в порядке их предпочтительности. Самый предпочтительный шифр из списка клиента, который присутствует в списке хоста будет использоваться в качестве двунаправленного шифра.
К примеру, если две машины Ubuntu 14.04 LTS сообщаются друг с другом с помощью SSH, то они будут использовать aes128-ctr в качестве шифра по умолчанию.
Асимметричное шифрование
В отличии от симметричного шифрования, асимметричное использует два отдельных ключа для шифрования и дешифровки. Эти два ключа также известны как приватный и публичный ключи. Вместе они формируют пару публичных-приватных ключей.
Публичный ключ, как понятно из его названия свободно распространяется между всеми группами. Однако несмотря на то, что он тесно связан с приватным ключом в плане его функциональности, приватный ключ не может быть математически вычислен с помощью публичного. Взаимоотношения между двумя ключами крайне сложны: сообщение, которое зашифровано публичным ключом машины может быть расшифровано лишь приватным ключом той же машины. Эти односторонние отношения означают, что публичный ключ не может дешифровать свои же сообщения, также как не может расшифровать ничего зашифрованного приватным ключом.
Приватный ключ должен оставаться приватным для сохранения защищённости соединения, никакие третьи лица не должны его знать. Надёжность всего этого зашифрованного соединения заключается в том, что приватный ключ никогда не показывается, так как это единственный компонент, который способен расшифровать сообщения зашифрованные публичным ключом. Поэтому любая группа имеющая возможность расшифровать сообщение в таком типе шифрования должна обладать соответствующим приватным ключом.
В отличии от устоявшегося представления о шифровании, асимметричное шифрование не используется для шифрования всей SSH сессии. Вместо этого оно используется только в процессе алгоритма обмена ключами симметричного шифрования. Перед установлением защищённого соединения обе стороны генерируют временные пары открытых и закрытых ключей и совместно используют соответствующие открытые ключи для создания общего секретного ключа.
После того как симметричное соединение будет установлено, сервер использует публичный ключ и передаёт его клиенту для авторизации. Если клиент может успешно расшифровать сообщение значит это означает, что он обладает приватным ключом, который необходим для подключения. После этого начинается SSH сессия.
Хеширование
Одностороннее хеширование — это еще одна форма криптографии, которая используется в SSH. Такого рода хеширование отличается от двух упомянутых выше тем, что оно не предназначено для дешифровки. Оно создает уникальное значение фиксированной длины для каждого ввода, которое не показывает никакого общего поведения для его раскрытия. Это делает его практически невозможным для обратного преобразования.
Создать криптографический хеш из заданного значения довольно легко, но получить значение из хеша невозможно. Это означает, что если клиент обладает нужным значением, он может генерировать криптографический хеш и сравнить его значение со значением сервера, чтобы проверить совпадают ли они.
SSH использует хеши для подтверждения сообщений об аутентификации. Это делается при помощи HMACs или Hash-based Message Authentication Codes (Кода Аутентификации Сообщений, Использующего Хеш-функции). Это обеспечивает подлинность полученной команды.
Если выбран необходимый алгоритм симметричного шифрования, это означает, что также выбран подходящий алгоритм аутентификации сообщений. Это работает также, как выбирается шифр в разделе о симметричном шифровании.
Каждое переданное сообщение должно содержать MAC, который рассчитывается с помощью симметричного ключа, порядкового номера пакета и содержимого сообщения. Оно отправляется извне симметрично зашифрованных данных в качестве итогового раздела пакета связи.
Как работает SSH с этими техниками шифрования
Поняв, что такое SSH и узнав о его техниках шифрования, можно перейти к его функционированию. SSH работает используя модель клиент-сервер для обеспечения аутентификации двух удаленных систем и шифрования данных, которые проходят между ними.
SSH по умолчанию работает через TCP порт 22 (это может быть изменено, если необходимо). Хост (сервер) ожидает на порте 22 (или любом другом порте назначенном SSH) входящие подключения. Далее он организует защищённое соединение, проводя аутентификацию клиента и открывая необходимую оболочку, если проверка успешна.
Клиент должен начать SSH подключение инициируя соединение с сервером через TCP, обеспечив защищенное симметричное соединение, подтвердив отображенный идентификатор на соответствие с предыдущими записями (обычно записанными в RSA файле) и предоставив необходимые личные данные для аутентификации подключения.
Есть две стадии установки подключения: первое, обе системы должны договориться о стандартах шифрования для защиты их будущих соединений, и второе, пользователи должны пройти проверку подлинности. Если данные верны, то пользователь получит доступ.
Базовый синтаксис
Синтаксис команды выглядит следующим образом:
$ ssh[опции] имя пользователя@сервер[команда]
Важно заметить что ssh может работать по двум версиям протокола. Версии 1 и 2. Понятное дело, что версия 2 лучше и поддерживает больше типов шифрования и аутентификации. Больше в этой статье об отличиях протоколов мы говорить не будем и я буду подразумевать что вы используете версию 2.
Опции команды SSH
Теперь давайте рассмотрим самые основные опции команды ssh:
- f — перевести ssh в фоновый режим;
- g — разрешить удаленным машинам обращаться к локальным портам;
- l — имя пользователя в системе;
- n — перенаправить стандартный вывод в /dev/null;
- p — порт ssh на удаленной машине;
- q — не показывать сообщения об ошибках;
- v — режим отладки;
- x — отключить перенаправление X11;
- X — включить перенаправление Х11;
- C — включить сжатие.
Это далеко не все опции утилиты, остальные выходят за рамки данной статьи. Многие настройки работы ssh можно изменять через конфигурационный файл ~/.ssh/config но здесь мы это тоже подробно рассматривать не будем.
Настройка сервера SSH
Настройки сервера SSH находятся в файле /etc/ssh/sshd_config. Многие из них мы тоже трогать не будем. Рассмотрим только самые интересные. Сначала откройте файл /etc/ssh/sshd.conf
Порт ssh
По умолчанию ssh работает на порту 22. Но такое поведение небезопасно, поскольку злоумышленник знает этот порт и может попробовать выполнить Bruteforce атаку для перебора пароля. Порт задается строчкой:
Port 22
Поменяйте значение порта на нужное.
Протокол SSH
По умолчанию сервер ssh может работать по двум версиям протокола, для совместимости. Чтобы использовать только протокол версии два раскомментируйте строчку:
Protocol 2
И приведите ее к такому виду:
Protocol 2
Рут доступ
По умолчанию Root доступ по ssh разрешен, но такое поведение очень небезопасно, поэтому раскомментируйте строчку:
PermitRootLogin no
Доступ только определенного пользователя к SSH
Мы можем разрешить доступ к ssh только для определенного пользователя или группы. Для этого добавьте строчки:
AllowUsers User1, User2, User3
AllowGroups Group1, Group2, Group3
Здесь User1 и Group1 — пользователь и группа к которым нужно разрешить доступ.
Выполнение X11 приложений
Не все знают но есть возможность использовать ssh для запуска полноценных X11 приложений. Об этом мы поговорим ниже, но чтобы все заработало необходимо разрешить эту возможность на стороне сервера, добавьте такую строчку:
X11Forwarding yes
Основные опции рассмотрели, перед тем как переходить дальше, не забудьте перезагрузить ssh сервер чтобы сохранить изменения:
service sshd restart
Использование SSH
Основная цель этой статьи — показать интересные и полезные способы использования ssh, о которых, возможно, вы не знали. Переходим к самому вкусному — возможности ssh.
Подключение к серверу
Чтобы просто подключиться к серверу по SSH используйте такую команду:
ssh user@host
Выполнить команду
Мы привыкли подключаться к удаленному серверу, а уже потом выполнять нужные команды, но на самом деле утилита ssh позволяет сразу выполнить нужную команду без открытия терминала удаленной машины. Например:
ssh user@host ls
Выполнит команду ls на удаленном сервере и вернет ее вывод в текущий терминал.
Выполнить локальный скрипт
Выполним интерпретатор bash на удаленном сервере и передадим ему наш локальный скрипт с помощью перенаправления ввода Bash:
ssh user@host ‘bash -s’ < script.sh
Бекап на удаленный сервер и восстановление
Мы можем сохранять бекэп диска сразу на удаленном сервере с помощью ssh. Перенаправим вывод dd с помощью оператора перенаправления |, затем сохраним его на той стороне в файл:
sudo dd if=/dev/sda | ssh user@host ‘dd of=sda.img’
Теперь чтобы восстановить состояние диска из сделанной копии выполните:
ssh user@host ‘dd if=sda.img’ | dd of=/dev/sda
Здесь и выше /dev/sda имя файла вашего жесткого диска.
Аутентификация без пароля
Использование ssh пароля для входа на сервер не только неудобно но и небезопасно, потому что этот пароль в любой момент может быть подобран. Самый надежный и часто используемый способ аутентификации — с помощью пары ключей RSA. Секретный ключ хранится на компьютере, а публичный используется на сервере для удостоверения пользователя.
Настроить такое поведение очень легко. Сначала создайте ключ командой:
ssh-keygen -t rsa
Во время создания ключа нужно будет ответить на несколько вопросов, расположение оставляйте по умолчанию, если хотите подключаться без пароля — поле Passphare тоже оставьте пустым.
Затем отправляем ключ на сервер:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
Вот и все. Теперь при попытке подключится к этому серверу пароль запрашиваться не будет, а стазу произойдет подключение. Смотрите подробнее создание открытого ключа для ssh.
Взять пароль из локального файла
Напомню, что хранить пароли в обычных текстовых файлах небезопасно, но если хотите, то да — возможно. Для этого используется оператор перенаправления ввода Bash:
ssh user@host < local_file.txt
Изменить приветствие SSH
При входе по ssh может выводиться приветствие, изменить его очень легко. За это отвечает файл /etc/issue. Просто откройте этот файл и введите нужный текст:
vi /etc/issue
Welcome!
Смотрим неудачные попытки входа SSH
Хотите посмотреть были ли попытки неудачного доступа по ssh к вашему серверу и с каких IP адресов? Запросто, все запросы логируются в файл /var/log/secure, отфильтруем только нужные данные командой:
cat /var/log/secure | grep «Failed password for»
Передача файлов по SSH
Кроме выполнения команд, можно копировать файлы по ssh. Для этого используется утилита scp. Просто укажите файл, который нужно передать, удаленный сервер и папку на сервере, вот:
$ scp /адрес/локального/файлапользователь@хост:адрес/папки
Например:
scp ~/test.txt user@host:documents
Кроме утилиты scp, передача файлов ssh может быть выполнена более хитрым способом. Прочитаем файл и с помощью cat, передадим, а там сохраним поток в файл:
cat localfile | ssh user@host «cat > remotefile»
Или так:
ssh user@host «cat > remotefile» < localfile
Пойдем еще дальше, вы можете сжимать файлы перед передачей с помощью tar, а потом их сразу же на лету распаковывать:
tar czf — /home/user/file | ssh user@host tar -xvzf -C /home/remoteuser/
Такое копирование файлов ssh позволяет отправлять сразу целые папки.
Запуск графических приложений по ssh
Если вам нужно запустить то или иное графическое приложение на удаленной машине необязательно для этого использовать VNC, вы можете обойтись возможностями ssh. Программа будет выполняться на стороне сервера, а вам будет лишь транслироваться окно, чтобы вы могли сделать все что нужно. Причем все данные шифруются. Чтобы эта функция работала, нужно включить ее поддержку на стороне сервера.
Затем просто выполняем команду запуска графического приложения на удаленном сервере вот таким образом:
ssh -XC user@remotehost «eclipse»
Как вы уже видели опция X разрешает перенаправление X11 на стороне клиента, а С — сжатие данных.
Завершение сессии SSH
Если вы использовали SSH с нестабильным интернетом, когда соединение время от времени рвется, то вам уже, наверное, надоело закрывать терминал, потому что иначе, на первый взгляд, сеанс никак не прекратить. Когда соединение с удаленным сервером разорвано вы не можете ввести никакую команду и сочетания клавиш Ctrl+C, Ctrl+Z, Ctrl+D не работают. И не будут работать поскольку клиент пытается отправить эти команды на сервер. Но есть решение — Escape последовательности. Чтобы активировать их поддержку добавьте строку:
EscapeChar ~
В файл /etc/ssh/ssh_config. Теперь, чтобы разорвать SSH соединение достаточно нажать Enter и набрать:
~.
Другие управляющие символы можно узнать нажав:
~?
Туннели SSH
С помощью SSH туннелей вы можете пробросить порт с удалённого сервера на локальную машину. Это очень полезно, в первую очередь, для разработчиков. Для того чтобы пробросить порт с удалённой машины локальной используйте опцию -L и такой синтаксис:
$ ssh-Lлокальный_порт:удаленный_адрес:удаленный_портпользователь@сервер
Например, сделаем удалённую базу данных доступной локально на порту 5555. Для этого выполните подставив свои значения:
$ ssh -N -L 5555:127.0.0.1:3306 root@losst-1
Опция -N сообщает, что команду на удалённой машине выполнять не нужно. Локальный порт — 5555, поскольку сервер баз данных слушает на локальном интерфейсе удалённой машины, то и здесь надо указывать адрес 127.0.0.1. А порт MySQL по умолчанию 3306. Если же вы хотите чтобы локальный сервис был доступен на удалённой машине, то следует использовать опцию -R:
$ ssh -N -R 5555:127.0.0.1:3306 root@losst-1
Теперь локальная база данных на порту 3306 будет доступна на удалённом сервере при обращении к порту 5555.
Подключение по SSH по паролю
Простейший вариант — подключение по паролю. После ввода команды ssh система запросит пароль:
ivan@52.307.149.244’s password:
Пароль придется вводить каждый раз.
Подключение по SSH по ключу, без пароля
Для удобного подключения по SSH (и многим другим сервисам) без ввода пароля можно использовать ключи.
Нужно создать пару ключей: приватный (закрытый) ключ и публичный (открытый) ключ. Приватный ключ нужно хранить и никогда никому не показывать. Публичный ключ можно показывать всем и распространять свободно.
Эти ключи связаны друг с другом таким образом, что зашифровав информацию одним ключом, расшифровать ее можно только другим. Например, если ваш друг зашифрует письмо вашим публичным ключом, то прочитать его сможете только вы, потому что для этого нужен ваш приватный ключ. И наоборот: если вы зашифруете что-то своим приватным ключом, то расшифровать его можно только вашим публичным ключом. Так как публичный ключ доступен всем, любой может расшифровать это сообщение. Но он может быть уверен, что сообщение пришло именно от вас. В этом заключается идея цифровой подписи.
Генерация ключей
Создадим пару ключей:
ssh-keygen
Программа запустится и спросит, куда сохранять ключи:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
Нажмите Enter для сохранения в стандартное место — директорию .ssh/id_rsa в вашей домашней директории.
Программа запросит passphrase. Это вроде пароля для ключа. Можно просто нажать Enter и пропустить этот шаг. Или ввести passphrase — тогда его нужно будет вводить каждый раз, когда используется ключ.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Ключи созданы:
Your identification has been saved in /home/demo/.ssh/id_rsa.
Your public key has been saved in /home/demo/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key’s randomart image is:
+—[ RSA 2048]—-+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ….Eo+ |
+——————+
Теперь у вас есть два файла:
- ~/.ssh/id_rsa — приватный ключ. Никогда никому и никуда не передавайте его!
- ~/.ssh/id_rsa.pub — публичный ключ. Спокойно распространяйте его.
В Windows можно использовать ssh-gen в подсистеме Ubuntu for Windows или в командной строке Git for Windows. Или создавать ключи графической утилитой вроде PuTTYgen.
Загрузка публичного ключа на сервер
Нужно добавить публичный ключ на сервер в файл ~/.ssh/authorized_keys. Самый простой способ — запустить на локальной машине команду для копирования ключа:
ssh-copy-id -i /home/demo/.ssh/id_rsa.pub ivan@52.307.149.244
Другой способ — подключиться по паролю, открыть в редакторе файл ~/.ssh/authorized_keys и добавить в конец текст из вашего файла ~/.ssh/id_rsa.pub.
Теперь при подключении пароль запрашиваться не будет1.
После включения соединений по ключу рекомендуется отключить подключение по паролю.
ssh-agent
При работе с ключами возможны две неудобные ситуации:
- Если при создании ключа вы указали passphrase (пароль для ключа), то вам придется вводить пароль при каждом подключении.
- Если у вас есть несколько ключей для разных целей, то при соединении по ssh придется указывать нужный ключ вручную
ssh-agent решает эти проблемы. Этот агент аутентификации (authentication agent) работает на фоне в *nix-системах. В зависимости от системы, вам, возможно, придется установить и настроить его автозапуск самостоятельно.
Если добавить ключ к агенту, то:
- для него больше не будет спрашиваться passphrase
- не нужно будет вводить ключ вручную — он будет автоматически использован при соответствующем подключении
ssh-add /home/demo/.ssh/id_rsa добавит ключ id_rsa в запущенный в системе агент. Если у него есть passphrase, то агент попросит ввести его.
Если запустить ssh-add без аргументов, то будут добавлены ключи ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 и ~/.ssh/identity.
Список добавленных в агент ключей можно посмотреть командой ssh-add -L:
→ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC91r/+5WEQHcxVMrxpP9jKuONjlrnEHshfG3v/ab2NKDSljdskODOIsdhaaoDoiSADhAaoDISHasoiDiASisjadOHISDdKJDASHSidshIHDSIHDIAsdjasAs7XG/drBhi16zQ2e8VcLD7bVQS1Cpo0O1tP+93YQBvcIE02RltqVKYo7BlgCaJzpdowK8fHSzpfCYsEFjdjosOjfdsjdjkAJOKkKKHJHhaIiAiaihsiIoqkpqdmlnvnuuUSCaAS8aDhajiadiiAahhakKAKDHAKurmD08jnX9HfH/d15pLK/Glo1Su6iEOU3bW8k92QlY54pPFLKiNRPFuUryE5md7T /Users/demo/.ssh/some_key.pem
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsLC9WpSZ/9YpQ2z1FTSsORcP+ohzCdVjYaoc3C0fRnUbkp4SnvMHFTHNFFod0FhV0cQcOLvBsZAK/0tUPIXeDDFvYD70r5i0AsQbqA0k7gK3b3MP7tmnPxMHd607TI+1FMO54Yig0vnpZOgKmgCsxWq6tckwyLB91BlPiGxLBZiu5yPDIguEQCSnAwkF0vjqrNGsoHB4+fkj0USfjiifsjihf39hifSIHiJFHSijshfj39jfsjisfiisfiissr893IFsifijfsjSOIiAShadfhssU0q0JpjaDEWcMmYXmuz3xSnbhkueGLBXMU2zXDFDWCDSHq9/oRr29UAfVaHAMw== /Users/demo/.ssh/id_rsa
ssh-agent привязан к сессии. Поэтому, например, если перезагрузить компьютер, то ключи нужно будет добавлять в агент заново.
Командная строка
Если вы подключитесь к другому компьютеру по SSH, вы не увидите там рабочий стол и окна программ. Вы увидите чёрный экран и строки текста. Это нормально. Это называется командной строкой. Сейчас вы поймёте.
Когда вы работаете за компьютером, вы обычно видите окна, кнопки, страницы и всё подобное. Это называется графическим интерфейсом.
Графический интерфейс — это не сами программы. Это лишь способ представления программы. Сама программа — это то, что исполняется внутри компьютера: то, что считает, копирует, обрабатывает и так далее. Есть огромное количество программ без графического интерфейса: например, веб-сервер Apache — это программа. Сервер работает на вашем компьютере, занимает память, выдаёт страницы куда нужно, ведёт свою серверную работу, но у него нет графического интерфейса — нет никакого окошка, на которое вы можете сказать «Это сервер».
Или, например, ваш браузер. Если у вас Chrome, то вы видите окно с веб-страницей. А есть версия Headless Chrome, которая может выплёвывать любые страницы в виде картинок прямо на ваш жёсткий диск. У этого «Хрома» нет графического интерфейса со страницей (но есть небольшой интерфейс для настройки).
С нашей человеческой точки зрения интерфейс — это и есть программа. А с точки зрения компьютера интерфейс — это что-то побочное. И опытные программисты довольно часто используют в работе программы, у которых нет графического интерфейса, только командная строка.
Командная строка — это текстовый интерфейс программы. Вы вводите в эту строку команду, программа может в ответ что-то вас спросить текстом, вы ей текстом ответите, и программа сделает свою работу. Мы уже сталкивались с командной строкой, когда собирали своё приложение в электроне или объясняли, как устроен интернет:
Здесь в командной строке пользователь maximilyakhov на компьютере iMac-Maxim выполнил команду ping для адреса thecode.media — то есть проверил, откликается ли сервер с нашим сайтом. Это видно из второй строки. Программа Ping стала показывать статистику: получили пакеты по 64 байта за 79 мс. Пользователь удовлетворился результатом, вышел из программы клавишей Ctrl+C и получил итоговую статистику. Сейчас командная строка готова к новым командам
Бывают и другие интерфейсы программ. Например, может быть голосовой интерфейс: компьютер вас слушает, интерпретирует команды, задаёт вам вопросы голосом.
Может быть интерфейс в виде чата. Вместо того чтобы давать текстовые команды в командной строке, вы пишете команды чат-боту.
Может быть даже физический интерфейс: когда вы играете в приставку, вы даёте команду с помощью джойстика или каких-нибудь палок с датчиками. Когда в вас попадают враги, джойстики могут вибрировать — это приставка вам пытается что-то сказать. Так что графический интерфейс — это лишь одна из разновидностей.
SSH-соединение
Основной принцип работы такой: SSH-клиент на компьютере соединяется с SSH-сервером, они убеждаются, что каждый именно тот, за кого себя выдаёт, договариваются о шифровании и после этого устанавливают защищённый туннель для передачи команд. Важно понимать, что сервер — это просто такое название для удалённого компьютера. Сервером может быть и домашний ноутбук, и плата на Raspberry Pi.
Запуск SSH-клиента
Если у вас один из вариантов линукса, BSD, UNIX или Мак — поздравляем, SSH-клиент у вас уже есть. Для его запуска достаточно набрать в командной строке что-то подобное:
ssh login@11.22.33.44
Здесь login — это имя пользователя, под которым вы хотите зайти на сервер, а 11.22.33.44 — IP-адрес этого сервера. Чаще всего используется 22 порт, но иногда эта настройка может меняться.
Порт — это что-то вроде номера маршрутки, которая идёт по городу. Все привыкли, что если нужно «доехать» до SSH, то садятся на маршрутку номер 22. Но иногда начальник городского транспорта (администратор) может поменять номер, тогда вместо 22-й маршрутки нужно будет садиться, например, на 320-ю.
У Виндоус нет встроенного SSH-клиента, поэтому нужно скачать его отдельно. Чаще всего выбирают PyTTY — SSH-клиент с графической оболочкой, в которой можно настраивать параметры соединения:
Минимально нужно указать адрес сервера, 22 порт уже написан по умолчанию.
Обмен ключами шифрования
Когда мы запускаем SSH-клиент и говорим ему соединиться с нужным сервером, происходит следующее:
- Сервер отправляет клиенту протоколы шифрования, с которыми он умеет работать. Если клиент тоже умеет работать с ними — всё отлично, идём дальше.
- Сервер и клиент с помощью криптографической магии устанавливают защищённое соединение, которое невозможно взломать или изменить (как они сами думают).
- Теперь у каждой стороны есть секретный ключ, которым зашифровывается и расшифровывается каждое сообщение.
Если всё прошло штатно, то при самом первом подключении сервер пришлёт в ответ что-то вроде этого:
The authenticity of host ‘11.22.33.44 (11.22.33.44)’ can’t be established.
ECDSA key fingerprint is fd: fd: d4:f9:77:fe: 73:84:e1:55:00:ad: d6:6d: 22:fe.
Are you sure you want to continue connecting (yes/no)?
Здесь сервер спрашивает, точно ли мы хотим установить это соединение. Если да — вводим в ответ yes. Это значит, что мы получили уникальный «отпечаток пальцев» для нашего соединения. Теперь, когда поменяются настройки SSH-сервера или его полностью переустановят, отпечаток уже не совпадёт и клиент будет бить тревогу. Всё для того, чтобы сделать соединения более безопасными в будущем.
Доступ по паролю или ключу
У нас уже есть защищённое соединение, и теперь мы можем вводить пароль. Для этого, после запуска нашей команды или клиента, SSH-сервер присылает в ответ такое:
login@11.22.33.44’s password:
Это значит, что нам нужно ввести пароль от пользователя с именем login. Пароль вводится каждый раз, когда мы устанавливаем SSH-соединение.
Есть и другой способ доказать серверу, что вы имеете право подключаться к нему: ключи доступа. Если настроить доступ по ключу, то пароль уже не нужен. Главное — нигде не публиковать приватный ключ. О ключах сейчас говорить не будем, сложновато.
Теперь соединение установлено, можно управлять удалённым компьютером, сидя у себя дома. Именно за это SSH и любят админы: лаконичный и понятный (для них) интерфейс, простота работы и полная безопасность при грамотной настройке.
Форвардинг (проброс) ключей
Если вы подключились к удаленному серверу X, и с него хотите подключиться к другому серверу Y, например, чтобы сделать git pull с GitHub’а, то придется держать копию ваших ключей на сервере X.
Утилита ssh с флагом -A позволяет «пробросить» ключи с подключаемой машины в удаленную:
ssh -A ivan@52.307.149.244
Ключи, добавленные к агенту аутентификации (ssh-agent) станут доступными на удаленном сервере. При этом файлы-ключи физически не будут находиться на сервере.
Выбираем SSH-клиент
Мы уже выяснили, что обособленно пользователи получить какую-то пользу от протокола не могут. Для управления нужна дополнительная утилита. Вопрос в том, какая именно. Secure Shell настолько востребован, что разработчики создали уже несколько десятков SSH-клиентов под различные платформы. В этом материале рассмотрим лучшие из них, разработанные для Windows, macOS и Linux.
Некоторые из них кроссплатформенные (то есть работают сразу на нескольких ОС) или запускаются в браузерах (это тоже делает их универсальными).
SSH-клиенты для Windows
Начнем с популярнейшей платформы. Несмотря на на отсутствие встроенных инструментов и общую неадаптированность под разработку и работу с серверами, для Windows создали как минимум десяток функциональных и быстрых SSH-клиентов.
PuTTY
Самый известный SSH-клиент для Windows. Пожалуй, единственный, что на слуху у всех вебмастеров. PuTTY отличается от конкурентов логичным интерфейсом вкупе с богатым арсеналом возможностей, включая настройку прокси-серверов и сохранение параметров подключения.
PuTTY распространяется бесплатно и имеет открытый исходный код. При этом является одним из немногих SSH-клиентов, до сих пор активно развивающихся и получающих новые версии.
Утилита поддерживает протоколы SCP, SSH, rlogin и Telnet, а также работает со всеми методами шифрования данных.
Оригинальная программа доступна только для Windows, но есть порты от сообщества под другие платформы
Скачать с официального сайта
KiTTY
За свою жизнь PuTTY обзавелся несколькими десятками форков (копий) от сторонних разработчиков. Каждый пытался внести в знаменитый SSH-клиент что-то свое. В итоге некоторые выросли в полноценные альтернативы, во много затмившие оригинал.
KiTTY базируется на PuTTY, но обладает массой преимуществ. Можно:
- выставлять собственные фильтры для отдельных сессий;
- хранить настройки в конфигурационной файле самой утилиты (чтобы хранить ее на флэшке, например, сохраняя настройки);
- создавать алиасы для часто используемых команд (и наборов команд);
- добавлять скрипты для автоматический аутентификации на сервере;
- использовать гиперссылки;
- настраивать интерфейс, меняя цвет текста, шрифты, степень прозрачности окна и другие визуальные элементы.
Скачать программу
MobaXterm
Многофункциональный SSH-клиент, полюбившийся пользователям за высокую скорость работы, комфортный интерфейс и кучу дополнительных функций, отсутствующих у конкурентов. В нем есть браузер файлов, встроенный XServer для управления графическим интерфейсом на удаленном компьютере, масса плагинов, расширяющих возможности клиента, и portable-версия, работающая без установки.
Проект условно-бесплатный, поэтому большая часть функций недоступна до оплаты. Если не покупать платную версию, то функциональность MobaXterm будет мало чем отличаться от таковой в PuTTY. За профессиональную версию придется отдать 69 долларов.
Скачать MobaXterm
Solar-PUTTY (бывший SolarWinds)
Один из немногих SSH-клиентов с современным интерфейсом. Это платная программа, что несомненно является ее недостатком. Но, в отличие от популярнейшего PuTTY, Solar умеет гораздо больше интересных вещей и лишен недостатков оригинала.
Например:
- Сохраняет данные для входа. Не приходится постоянно проходить авторизацию заново.
- Работает сразу с несколькими сессиями в одном окне (по вкладке на каждую).
- Автоматически восстанавливает подключение, если оно по какой-то причине было утеряно.
- Интегрирован в поисковик Windows.
- Не требует установки. Всегда работает в portable-режиме.
Приложение обойдется в 99 долларов (~7650 рублей)
SmarTTY
Еще одна попытка упростить жизнь веб-разработчикам, полагающимся на SSH. Создатели SmarTTY уделил много внимания ускорению работы пользователей и повышению удобства выполнения элементарных задач.
Например, появился режим отображения терминалов в отдельных вкладках. Сам терминал научился автоматически завершать команды и быстро искать файлы. В него добавили графический интерфейс для загрузки файлов на сервер без необходимости использовать командную строку.
Также в SmarTTY встроен многофункциональный текстовый редактор с возможностями Nano и hex-терминал для отслеживания COM-портов. А еще есть portable-версия, для работы с которой даже не нужно выполнять установку.
Скачать программу
Xshell
Полнофункциональный SSH-клиент для Windows. Отличается от PuTTY и схожих продуктов возможностью задавать разные параметры для каждой терминальной сессии, создавать общие скрипты на несколько сессий.
Он поддерживает командную строку Windows и протокол SCP. Также в него встроен файловый менеджер для управления документами в графической среде.
Можно записывать выполняемые команды и превращать «записанный» материал в один скрипт, который после можно перезапустить в любой момент.
Скачать клиент
Tera Term
Популярный эмулятор терминалов для Windows с открытым исходным кодом. Может имитировать DEV VT100, DEC VT382 и другие модели. Написан на языках С и С++. Поддерживает технологии Telnet, SSH 1 и SSH 2.
Tera Term можно интегрировать с другими приложениями с помощью встроенного веб-сервера. В нем можно настроить повторяющиеся команды, поддерживающие терминал в рабочем состоянии, создавать скрипты на собственном языке Tera Term Language.
Из недостатков можно выделить устаревший дизайн и не совсем интуитивный интерфейс в сравнении с другими подобными приложениями.
Распространяется бесплатно, как и другие Open-Source-продукты.
SSH-клиенты для Linux
Пользователи Linux редко используют графические утилиты или какие-то усовершенствованные варианты SSH. Обычно все работают во встроенном терминале, но есть несколько неплохих решений для тех, кому нужно больше.
Terminal
В UNIX-подобных операционных системах есть встроенная поддержка OpenSSH. Можно использовать базовый терминал для подключения к удаленному серверу и управлению им. Интерфейс аналогичный тому, что вы можете встретить в большинстве SSH-клиентов. Только не придется скачивать сторонние программы и плагины.
Чтобы подключиться через терминал к серверу, надо ввести команду:
ssh *имя_пользователя*@*адрес_сервера*
В моем случае это выглядит так:
ssh root@82.96.152.28
После этого терминал запросит разрешение на установку соединения с удаленным сервером. Нужно согласиться, введя команду Yes и пароль администратора, чтобы авторизоваться и получить контроль над удаленным ПК.
Asbru Connection Manager (Linux)
Бесплатный интерфейс для удаленного подключения к серверу и автоматизации повторяющихся на нем задач. У Asbru простой механизм настройки соединения с VDS и есть свой язык для создания скриптов, как в SecureCRT.
Из дополнительных возможностей можно отметить функцию подключения к удаленному ПК через прокси-сервер, интеграцию с сервисом KeePassX, поддержку отдельных вкладок и окон под разные сессии, запущенные единовременно.
А еще он грамотно вписывается в интерфейс GTK и в окружение GNOME как визуально, так и в техническом плане.
Asbru можно запустить на Windows, используя компоненты Xming и включив WSL, но это весьма специфичный сценарий.
Muon
Бывший Snowflake. Графический клиент для подключения к серверу по протоколам SFTP и SSH. Включает в себя текстовый редактор, анализатор пространства на жестком диске, утилиту для считывания логов и прочие полезные инструменты.
Из прочих преимуществ отмечу:
- Быстрый доступ к часто используемым функциям вроде копирования файлов, архивирования, запуска скриптов, проверки прав на директории и т.п.
- Поиск по массивным логам.
- Встроенный терминал с поддержкой сниппетов (сокращенных версий команд, созданных пользователем).
- Сетевые инструменты и приложение для менеджмента SSH-ключей.
Muon создавался с прицелом на веб-разработчиков, работающих над бэкэнд-составляющей сайтов.
SSH-клиенты для macOS
Компьютеры Apple поддерживает подключение по протоколу SSH прямо из встроенного терминала. Для этого используется та же команда, что и в Linux:
ssh *имя_пользователя*@*адрес_сервера*
Также с последующем подтверждением подключения и авторизацией. Поэтому в macOS (как и в Linux) обычно не используются сторонние SSH-клиенты. Но они есть, и многие из них довольно качественные.
iTerm 2
Одна из главных альтернатив встроенному в macOS терминалу. Попытка расширить возможности стандартной командной строки необходимыми функциями, которые Apple упорно игнорирует годы напролет. Например, поддержку режима сплит-скрин, когда в одном окне отображается сразу два терминала с разными сессиями, или возможность добавлять комментарии к запущенным командам.
Отдельно отметим функцию Instant Playback. С помощью нее можно воспроизвести одну или несколько команд, которые были выполнены ранее, не вводя их заново. Ну а еще тут можно выделять, копировать и вставлять текст, не используя мышь (пользователи macOS поймут).
Скачать утилиту
Shuttle
Технически это не полноценный SSH-клиент, как другие описываемые в статье. Это кнопка в панели инструментов, открывающая быстрый доступ к некоторым функциям для управления сервером. Прелесть утилиты заключается в ее универсальности и расширенных возможностях для ручной настройки.
Все параметры хранятся в файле ~/.shuttle.json, который идет в комплекте с базовой утилитой. Туда можно прописать любой скрипт, используемый вами в терминале, а потом запускать его прямо с панели инструментов через компактный графический интерфейс Shuttle. Это может заметно ускорить выполнение кучи рутинных процедур.
Скачать программу
Core Shell
SSH-клиент для macOS, поддерживающий работы сразу с несколькими хостами. Можно быстро между ними переключаться в одном окне с помощью вкладок или выделить каждый из них в отдельное окно. Каждому хосту назначается своя цветовая гамма. Чтобы было еще проще их разбивать по категориям, Core Shell поддерживает систему тегов.
Используя Core Shell, можно подключиться к VDS через прокси-сервер и выполнять переадресацию агента SSH.
Core Shell поддается скрупулезной настройке и «подгонке под себя». Причем клиент способен запоминать глобальные параметры для всех хостов и отдельные параметры для каждого из хостов. А еще в него интегрирована поддержка iCloud Keychain (хранилище паролей Apple).
Скачать Core Shell
Кроссплатформенные клиенты
Эмуляторы терминала, написанные на языках, поддерживающих сразу несколько операционных систем.
Hyper
Один из самых красивых терминалов в подборке. В отличие от других SSH-клиентов, этот не отличается какой-то специфичной функциональностью. Напротив, он практически полностью повторяет функциональность базовой командной строки. Поэтому пользователям он нравится не за обилие возможностей, а за простоту и симпатичный внешний облик.
По словам разработчиков, это попытка создать максимально быстрый и надежный терминал. Это был их приоритет при разработке. При этом он построен на базе фреймворка Electron, что делает его универсальным и расширяемым.
Если вы перфекционист и привыкли к изысканным интерфейсам macOS, то Hyper станет правильным выбором. Он здорово впишется в дизайн ОС Apple благодаря своим плавным линиям и приятными анимациям.
Доступен на Windows, macOS и Linux. Распространяется бесплатно.
Terminus
Терминал нового поколения (как его называют разработчики). Кроссплатформенный эмулятор терминала с поддержкой WSL, PowerShell, Cygwin, Clink, cmder, git-bash и десятка других технологий.
Есть полезные опции, такие как восстановление закрытых вкладок из предыдущей сессии и кликабельные пути к директориям.
Интерфейс Terminus можно настроить под себя с помощью разметки CSS. То же касается и функциональной составляющей. Ее можно «прокачать» за счет сторонних плагинов, число которых постепенно растет.
Доступен на Windows, macOS и Linux. Распространяется бесплатно.
Tectia
Продвинутый SSH-клиент, используемый крупнейшими банками мира, страховыми компаниями, технологическими корпорациями и государственными органами. Он обеспечивает безопасную передачу файлов за счет использования множества методов шифрования данных.
Tectia поддерживает стандарт аутентификации X.509 PKI, задействует сертифицированные криптографические методы FIPS 140-2 и может работать со смарткартами. Услугами Tectia пользуются такие внушительные структуры, как NASA и Армия США. Они доверяют Tectia, потому что это стабильный SSH-клиент с круглосуточной отзывчивой поддержкой. Как любой дорогой коммерческий продукт.
Доступен на Windows, Linux и других UNIX-подобных ОС. Обойдется в 133 доллара за клиент-версию и 650 долларов за сервер-версию.
Termius
Кроссплатформенный SSH-клиент с приложением-компаньоном для iOS и Android. Наличие мобильной версии — ключевое преимущество программы. С помощью нее можно на ходу вносить изменения на сервер, управлять базой данных и выполнять прочие действия, обычно требующие доступа к полноценному ПК.
Он адаптирован под сенсорные экраны и синхронизируется между всеми вашими устройствами, используя стандарт шифрования AES-256.
Доступен сразу на пяти платформах, включая мобильные. Распространяется по подписке за 9 долларов (~700 рублей).
Poderosa
Профессиональный SSH-клиент, перешедший из стана opensource-проектов в разряд платных. Разработчики проекта видят своей задачей создание понятного интерфейса для управления серверами. Так, чтобы привыкшие вебмастера не путались, но обладали более широким набором инструментов.
Из функций создатели Poderosa выделяют удобный мультисессионный режим, когда экран делится на несколько частей и показывает сразу несколько терминалов. Можно также создать несколько вкладок, в каждый из которых будет по 4 терминала.
Есть ассистент, помогающий быстрее вводить часто используемые команды, и масса опций для изменения интерфейса (включая шрифты, цвета отдельных типов данных и т.п.).
Доступен на Windows и macOS. Стоит 33 доллара (~2550 рублей)
SecureCRT
Коммерческий SSH-клиент с расширенным набором функций. Отличается от большинства конкурентов усиленными механизмами защиты данных. Поддерживает сразу несколько протоколов, включая SSH2 и Telnet. Эмулирует различные Linux-консоли и предлагает массу настроек внешнего вида.
Из отличительных функций можно отметить возможность создавать свои горячие клавиши, менять цвет отображаемого контента, искать по ключевым словам, запускать несколько окон с разными или одним сервером, открывать несколько сессий в разных вкладках. Также функциональность SecureCRT можно расширить за счет скриптов на языках VBScript, PerlScript и Python.
Доступен сразу на трех ОС. Распространяется по подписке за 99 долларов (~7600 рублей)
SSH-плагины для браузеров
Портативные SSH-клиенты, запускающиеся внутри браузеров и не требующие специфической ОС.
Chrome Secure Shell App
Google Chrome уже давно метит в полноценную платформу с функциональностью операционной системы. Поэтому разработчики из команды Google Secure Shell поспешили создать для него полнофункциональный эмулятор терминала.
С помощью Chrome Secure Shell App можно подключиться к серверу по протоколу SSH и выполнять стандартные команды, к которым вы привыкли, во встроенном терминале или в условном PuTTY. Разница отсутствует.
Получалась неплохая бесплатная альтернатива для тех, кто не хочет ставить сторонние приложения.
FireSSH
Еще один плагин, имитирующий терминал в браузере. Ранее он функционировал внутри Firefox, но компания Mozilla ограничила поддержку расширения. Поэтому сейчас FireSSH работает только в Waterfox. Это инди-форк от Firefox.
Он написан на JavaScript, распространяется бесплатно и помещает в браузерную среду все возможности стандартного SSH-клиента (на уровне терминала).
Скачать
Подключение по паролю на виртуальном хостинге
На виртуальном хостинге SSH используется реже, чем на VPS/VDS и выделенных серверах. Его применяют лишь некоторые провайдеры, например, Beget.
SSH-доступ в панели управления Beget
Чтобы работать с сервером при помощи командной строки Linux, пользователю нужно:
1. Включить опцию “SSH-доступ”.
2. Подключиться к своему серверу при помощи SSH-клиента, используя логин и пароль от личного кабинета.
На платформе Linux
SSH-Linux-клиент предустановлен на всех версиях операционной системы Linux. Также SSH-доступ заранее настроен на серверах под управлением Linux.
1. Пользователю Linux для применения SSH достаточно запустить терминал (так называется командная строка в Linux) и набрать команду:
ssh user@host
- user — это имя пользователя на удаленном сервере;
- host — адрес самого сервера.
2. Система предложит вам ввести пароль.
3. Произойдет соединение с удаленным компьютером-сервером, и вы сможете начать полноценную работу на нем.
В случае с ассиметричным методом шифрования, вводить пароль не требуется, аутентификация происходит посредством сопоставления уникальных ключей между клиентом и сервером.
Пример:
1. Пользователь вводит в терминале команду соединиться с сервером под логином admin.
2. После ввода пароля пользователь авторизуется на удаленном сервере.
3. На этапе, обозначенном цифрой “1”, пользователь работает на своем локальном Linux-компьютере.
4. На этапе, обозначенном цифрой “2”, — на удаленном сервере.
На платформе Windows
На платформе Windows для использования протокола SSH разработано специальное программное обеспечение: SSH-клиенты.
Наиболее популярным является SSH Windows-клиент PuTTY, поддерживающий все современные стандарты шифрования для SSH.
1. Скачайте PuTTY с официального сайта на локальный компьютер, чтобы начать работу.
2. При запуске SSH-клиент PuTTY предложит ввести IP-адрес хоста для подключения. Например, 95.179.134.210.
3. Затем откроется окно терминала и приглашение для ввода имени пользователя и пароля, после чего вы соединитесь с удаленным сервером.
Подключение по паролю — это самый простой способ соединения по SSH, но этот способ небезопасен, так как пароль могут похитить злоумышленники.
Подключение по ключам
Для Linux
Чтобы подключиться по SSH без пароля, необходимо создать пару приватный+публичный ключ и сохранить публичный ключ на хостинге.
1. В терминале выполните команду:
ssh-keygen
2. Программа спросит, куда нужно сохранить ключи.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
3. Чтобы сохранить ключи в домашнюю директорию .ssh/id_rsa, нажмите Enter.
4. Программа запросит пароль для ключа — passphrase. Нажмите Enter, чтобы пропустить этот шаг. Иначе пароль нужно будет вводить при каждом соединении с использованием ключа.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
5. Приватный и публичный ключи созданы.
~/.ssh/id_rsa — приватный ключ.
~/.ssh/id_rsa.pub — публичный ключ.
6. Чтобы загрузить публичный ключ на сервер в файл ~/.ssh/authorized_keys, запустите на локальном компьютере команду:
ssh-copy-id -i /home/demo/.ssh/id_rsa.pub admin@95.179.134.210
Для Windows
SSH-Windows-клиент PuTTY умеет генерировать приватный и публичный ключи пользователя для их применения при подключении по SSH.
Для этого используется поставляемая в комплекте утилита puttygen.exe.
1. При запуске утилиты нажмите кнопку “Генерировать”.
2. Программа предложит вам подвигать мышью для создания случайной последовательности данных, затем генерируются ключи.
3. После создания ключи нужно сохранить на компьютер в виде текстовых файлов (Пункт “Сохранить сгенерированные ключи”, кнопки “Открытый ключ” и “Личный ключ” соответственно для публичного и приватного ключей).
4. Наверху справа в поле “Ключ” будет виден текстовый дамп публичного ключа для сохранения на удаленном сервере (хосте).
5. Для этого на сервере в домашнем каталоге создайте папку “.ssh”, а внутри нее — файл “autorized_keys”.
6. Отредактируйте этот файл любым текстовым редактором (например, mcedit) и сохраните туда дамп ключа с экрана утилиты puttygen.exe.
7. После этого в самой программе PuTTY укажите имя пользователя для автовхода:
8. Подключите в файл SSH приватный ключ, предварительно сохраненный в утилите puttygen.exe:
9. После выполнения этих операций соединение с удаленным сервером по протоколу SSH произойдет без ввода пароля за счет пары публичный + приватный ключ:
Мы рекомендуем использовать пару приватный+публичный ключ как самый безопасный способ соединения по SSH.
Настройка SSH на сервере
На Linux-сервере за работу протокола SSH отвечает программа sshd из набора программного обеспечения openssh.
Конфигурационные файлы находятся в каталоге /etc/ssh.
Основной файл конфигурации — ssh_config.
Для управления настройками сервера SSH нужны привилегии суперпользователя root.
Сами настройки sshd не требуют изменений.
Мы советуем запретить подключение по SSH для пользователя root для повышения общей безопасности системы.
Для этого нужно:
- найти в файле конфигурации sshd_config строчку “#PermitRootLogin yes”</strong>;
- заменить ее на “PermitRootLogin no”</strong>;
- перезапустить сервер SSH командой “service sshd restart”.
Применение протокола SSH для копирования файлов
SSH — это целое семейство протоколов, применяемых не только для администрирования серверов, но и, например, для удобного копирования файлов между двумя подключенными к сети компьютерами.
Для Linux-платформы при копировании файлов через SSH используется утилита SCP (secure copy).
Например, чтобы скопировать файл “data” с локальной машины на удаленный сервер, применяется команда вида “scp data admin@95.179.134.210:data”.
Утилита scp запросит пароль пользователя и затем выполнит копирование:
Для Windows платформы используется протокол SFTP (Secure FTP), разработанный как замена обычного FTP.
Поддержка SFTP есть в популярном клиенте Filezilla. Для соединения необходимо знать имя пользователя и его пароль на удаленном сервере.
1. Чтобы указать использование протокола SFTP, в Filezilla перед адресом удаленного сервера в соответствующем поле добавьте префикс “sftp://”:
2. После установки соединения по протоколу SFTP работа с файлами и каталогами на удаленном сервере в Filezilla происходит точно так же, как при использовании обычного FTP.
Если вы авторизовались при помощи SSH-ключа, то в случае с Linux ввод пароля не требуется, а в случае с Windows — ввод пароля также не нужен, но необходим путь к файлу с SSH-ключом.
Как ограничить доступ по SSH
Все изменения вносятся в /etc/ssh/sshd_config
Чтобы изменения вступили в силу, необходимо перезагрузить SSH
Сменить порт
Port 9724
Теперь при авторизации вам нужно вместо стандартного 22 порта указывать 9724.
Способ очень простой и действенный против большинства простых ботов хакеров, которые стучатся в стандартные порты. Тут главное не создать конфликт с другими службами и подобрать заведомо неиспользуемое число.
Запретить связь по старому протоколу
Здесь мы определяем, что связь возможна только по протоколу v2
Protocol 2
Запретить авторизацию под root
PermitRootLogin no
По умолчанию no. Если yes, можно авторизовываться под рутом. Под root работать небезопасно, лучше создать своего пользователя и работать под ним.
Если вы авторизованы не под root, перед всеми консольными командами нужно добавлять sudo — расшифровывается как Substitute User and DO — подмени юзера и делай (под ним). Например, позволяет исполнять команды от имени суперпользователя root.
Уменьшить число попыток авторизации
MaxAuthTries 2
Количество попыток ввода пароля. По умолчанию 6. При неудачном переборе сеанс связи обрывается.
Уменьшить время ожидания авторизации
LoginGraceTime 30s
По умолчанию, 120 секунд может длиться сеанс авторизации. По истечению этого времени он обрывается. 2 минуты на авторизацию — это перебор, всё это время сервер держит связь открытой, что очень нерационально. Полминуты за глаза хватит.
Закрыть доступ по IP
Прежде чем настраивать ограничения по IP, убедитесь, что в случае ошибки в настройке и последующего бана собственного IP у вас останется альтернативный способ вернуть доступ к серверу
Если доступ нужен только вам, самым простым и надёжным будет закрыть доступ отовсюду, кроме вашего IP или, если он динамический, то диапазона IP.
- Открываем /etc/hosts.allow и добавляем туда
SSHD: 192.168.1.1где 192.168.1.1 — ваш IP. Если у вас динамический IP, определите IP с маской подсети и запишите Вашу подсеть вместо IP, например:SSHD: 192.168.0.0/16 - Открываем /etc/hosts.deny и добавляем туда:
SSHD: ALL
Теперь никто, кроме вас, не сможет авторизоваться на сервере по SSH.
Ещё один способ ограничения доступа по IP
Можно воспользоваться следующей директивой:
AllowUsers = *@1.2.3.4
Здесь мы разрешаем доступ только для IP 1.2.3.4
Локальное перенаправление портов (SSH port forwarding): получаем доступ по SSH к удалённым ресурсам на локальной системе
«Локальное перенаправление портов» позволяет осуществлять доступ к ресурсам, находящимся внутри локальной сети. Предположим, что нужно попасть на офисный сервер БД, сидя дома. В целях безопасности этот сервер настроен так, чтобы принимать подключения только с ПК, находящихся в локальной сети офиса. Но если у вас есть доступ к SSH-серверу, находящемуся в офисе, и этот SSH-сервер разрешает подключения из-за пределов офисной сети, то к нему можно подключиться из дома. Затем осуществить доступ к БД. Проще защитить от атак один SSH-сервер, чем защищать каждый ресурс локальной сети по отдельности.
Чтобы сделать это, вы устанавливаете SSH-соединение с SSH-сервером и говорите клиенту передать трафик с указанного порта на локальном ПК. Например, с порта 1234 на адрес сервера базы данных и его порт внутри офисной сети. Когда вы пытаетесь получить доступ к БД через порт 1234 на вашем ПК («localhost») трафик автоматически «туннелируется» по SSH-соединению и отправляется на сервер БД.
SSH-сервер выступает посредником, пересылая трафик туда-сюда. При этом можно использовать любую командную строку или графический инструмент для осуществления доступа к базе данных, как вы обычно делаете это на локальном ПК.
Чтобы использовать локальное перенаправление, подключитесь к SSH-серверу с использованием вспомогательного аргумента -L. Синтаксис для туннелирования трафика будет следующим:
ssh -L local_port:remote_address:remote_port username@server.com
Предположим, что офисный сервер находится по адресу 192.168.1.111. У вас есть доступ к SSH-серверу через адрес ssh.youroffice.com, и имя вашего аккаунта на SSH-сервере — bob. В таком случае необходимая команда будет выглядеть следующим образом:
ssh -L 8888:192.168.1.111:1234 bob@ssh.youroffice.com
Запустив эту команду, вы попадете на офисный сервер баз данных через порт 8888 на localhost. Если у СУБД есть веб-интерфейс, можно вписать в адресную строку браузера http://localhost:8888. Если у вас инструмент командной строки, которому необходим сетевой адрес базы данных, то направьте его на localhost:8888. Весь трафик, отправленный на порт 8888 на ПК, будет перенаправлен на 192.168.1.111:1234 внутри офисной сети:
Это слегка сбивает с толку, если надо подключиться к серверному приложению, запущенному в той же системе, где и сам SSH-сервер. К примеру, есть SSH-сервер, работающий на порте 22 на офисном ПК. Но у вас также есть сервер баз данных, работающий на порте 1234 в той же системе по тому же адресу. Вам нужно подключиться к БД из дома, но система принимает только подключение через SSH (через 22 порт), и сетевой экран не пропускает любые внешние подключения. В таком случае можно запустить следующую команду:
ssh -L 8888:localhost:1234 bob@ssh.youroffice.com
При попытке подключиться к БД через 8888 порт на вашем ПК, трафик будет передаваться с помощью SSH-подключения. Когда он достигнет системы, в которой работает SSH, SSH-сервер отправит его на порт 1234 на «localhost», принадлежащий тому же ПК, на котором запущен SSH-сервер. То есть, «localhost» в приведённой выше команде означает «localhost» с перспективы удалённого сервера:
Хотите использовать рабочие прокси сервера бесплатно? Вот 10 инструментов для безопасного и анонимного интернет-серфинга.
Чтобы сделать это в PuTTY на Windows, выберите опцию Connection > SSH > Tunnels. Далее опцию «Local». В поле «Source Port» укажите локальный порт. В поле «Destination» введите целевой адрес и порт в формате удалённый_адрес:удалённый_порт.
Например, если нужно настроить SSH-тоннель, как это сделано выше, то введите 8888 в качестве порта-источника и localhost:1234 в качестве целевого адреса. После этого нажмите «Add» и затем «Open», чтобы открыть SSH-подключение. До подключения SSH туннелирования нужно ввести адрес и порт самого SSH-сервера в разделе «Session»:
Дистанционное перенаправление портов: открываем доступ к локальным ресурсам на удалённой системе
«Дистанционное перенаправление портов» — ситуация, противоположная локальному перенаправлению, и используется не так часто. Она позволяет открывать доступ к ресурсам на локальном ПК через SSH-сервер. Предположим, что на локальном ПК настроен веб-сервер. Но ваш ПК защищён сетевым экраном, который не пропускает входящий трафик на сервер.
Если есть доступ к удалённому SSH-серверу, можно подключиться к этому SSH-серверу и использовать дистанционное перенаправление портов. Ваш SSH-клиент укажет серверу перенаправлять трафик с определённого порта – скажем, 1234 – на SSH-сервере на указанный адрес и порт на вашем ПК или внутри локальной сети. Когда кто-то подключается к порту 1234 на SSH-сервере, этот трафик автоматически «туннелируется» по SSH-соединению. Любой, кто подключается к SSH-серверу, сможет получить доступ к серверу, запущенному на вашем ПК. Это достаточно эффективный способ обхода фаерволов.
Чтобы воспользоваться дистанционным туннелированием IP, используйте ssh-команду с аргументом —R. Синтаксис здесь будет практически таким же, как и в случае с локальным перенаправлением:
ssh -R remote_port:local_address:local_port username@server.com Главные опасности современного интернет-серфинга и как их избежать?
Предположим, что нужно создать серверное приложение, прослушивающее порт 1234 на вашем ПК. Оно доступно через порт 8888 на удалённом SSH-сервере. Адрес SSH-сервера ssh.youroffice.com, а ваше имя пользователя на SSH-сервере bob. Значит, команда будет следующей:
ssh -R 8888:localhost:1234 bob@ssh.youroffice.com
Затем кто-то может подключиться к SSH-серверу через порт 8888, и это подключение будет туннелировано на серверное приложение, запущенное на порте 1234 ПК, с которого вы подключались:
Чтобы сделать это в PuTTY для Windows, выберите опцию Connection > SSH > Tunnels. Далее – опцию «Remote». В поле «Source Port» укажите удалённый порт. В поле «Destination» введите целевой адрес и порт в формате локальный_адрес:локальный_порт.
Например, если нужно настроить SSH-тоннель, как это сделано выше, то укажите 8888 в качестве порта-источника и localhost:1234 в качестве целевого адреса. После этого нажмите «Add» и затем «Open», чтобы открыть SSH-подключение. До подключения нужно будет ввести адрес и порт самого SSH-сервера в разделе «Session».
После этого пользователи смогут подключаться к порту 8888 на SSH-сервере и их трафик будет передаваться на порт 1234 на вашей локальной системе:
Как использовать прокси сервера?
По умолчанию, удалённый SSH-сервер будет слушать только подключения с того же хоста. Другими словами, доступ будет только у людей из той же системы, на которой запущен SSH-сервер. При туннелировании трафика так делается в целях безопасности.
Нужно включить опцию «GatewayPorts» в sshd_config на удалённом SSH-сервере, если хотите изменить эти настройки.
Динамическое перенаправление портов: используем SSH-сервер в качестве прокси
Также существует «динамическое перенаправление портов», которое работает по тому же принципу что прокси или VPN-сервер. SSH-клиент создаёт SOCKS-прокси, который можно настраивать под собственные приложения. Весь трафик, отправляемый через прокси, будет отправляться через SSH-сервер. Принцип здесь схож с локальным перенаправлением – берётся локальный трафик, отправленный на определённый порт на вашем ПК, и перенаправляется через SSH-соединение на удалённый адрес.
Предположим, что вы используете общедоступную Wi-Fi сеть. Но хочется делать это безопасно. Если у вас есть доступ к SSH-серверу из дома, то можно подключиться к нему и использовать динамическое перенаправление. SSH-клиент создаст SOCKS-прокси на вашем ПК. Весь трафик, отправленный на этот прокси, будет отправляться через подключение к SSH-серверу. Никто из тех, кто использует общедоступную Wi-Fi сеть, не сможет отслеживать ваши перемещения в сети или закрывать доступ к сайтам. С перспективы сайтов, которые посещаете, будет казаться, что вы заходите на них с домашнего ПК.
Или же может понадобиться подключиться к медиа-серверу, находящемуся в вашей домашней сети. В целях безопасности, к интернету подключен только ваш SSH-сервер. При этом вы не разрешаете подключаться к медиа-серверу через интернет. В таком случае можно включить динамическое перенаправление портов, настроить SOCKS-прокси в браузере и затем подключаться к серверам, работающим в домашней сети, через браузер, как будто вы сидите дома.
Например, если медиа-сервер находится по адресу 192.168.1.123 в вашей домашней сети, то можно добавить адрес 192.168.1.123 в любое приложение при помощи SOCKS-прокси и получить доступ к медиа-серверу, как будто вы находитесь внутри домашней сети.
Чтобы воспользоваться динамическим перенаправлением, запустите ssh-команду с аргументом —D:
ssh -D local_port username@server.com
Предположим, что у вас есть доступ к SSH-серверу по адресу ssh.yourhome.com, а ваш логин на SSH-сервере – bob. Нужно использовать динамическое перенаправление для того, чтобы открыть SOCKS-прокси по порту 8888 на текущем ПК. Тогда команда для SSH туннелирования будет выглядеть следующим образом:
ssh -D 8888 bob@ssh.yourhome.com
После этого можно настроить браузер или другое приложение на использование локального IP-адреса (127.0.0.1) и порта 8888. Весь трафик этого приложения будет перенаправляться через туннель:
Чтобы сделать это в PuTTY для Windows, выберите опцию Connection > SSH > Tunnels. Далее – опцию «Dynamic». В поле «Source Port» укажите локальный порт.
Например, если вам нужно настроить SOCKS-прокси на порт 8888, то введите 8888 в качестве порта-источника. После этого нажмите «Add» и затем «Open», чтобы открыть SSH-подключение.
После этого можно настроить приложение на подключение через SOCKS-прокси на вашем локальном ПК (то есть, по IP-адресу 127.0.0.1, который ведёт на ваш локальный ПК) и указать корректный порт для работы:
К примеру, можно настроить браузер Firefox на использование SOCKS-прокси. Это удобно, так как у Firefox могут быть отдельные настройки прокси, и поэтому не обязательно использовать базовые параметры для всей системы. Firefox будет отправлять трафик через SSH туннелирование, а другие приложения будут использовать интернет-подключение в обычном режиме.
Туннель будет оставаться активным и открытым до тех пор, пока открыта сессия SSH-соединения. Когда вы завершите SSH-сессию и отключаетесь от сервера, туннель тоже закроется. Чтобы снова открыть туннель, переподключитесь при помощи соответствующей команды или нужной функции в PuTTY.
Дайте знать, что вы думаете по данной теме в комментариях. За комментарии, лайки, отклики, дизлайки, подписки низкий вам поклон!
- https://www.hostinger.ru/rukovodstva/chto-takoe-ssh
- https://guides.hexlet.io/ssh/
- https://CoderNet.ru/articles/drugoe/nomer_porta_ssh_gde_ego_mozhno_uznat_i_kak_pomenyat_na_drugoj/
- https://ru.hostings.info/termins/ssh.html
- https://losst.ru/kak-polzovatsya-ssh
- https://thecode.media/sshhhh/
- https://timeweb.com/ru/community/articles/luchshie-ssh-klienty-dlya-windows-linux-i-macos
- https://sheensay.ru/ssh
- https://www.internet-technologies.ru/articles/newbie/uchimsya-ispolzovat-ssh-tunnelirovanie-dlya-bezopasnogo-serfinga.html