Что такое протокол SSH
SSH — защищенный протокол для удаленного доступа к компьютерам. Через SSH можно выполнять операции в командной строке компьютера, который физически находится в другом месте.
Иными словами, SSH — это дистанционная командная строка. Визуально вы работаете на своем компьютере, но в реальности — на другом.
Что значит «протокол»?
Протокол — это набор соглашений, правил, по которым разные программы могут обмениваться информацией. SSH — это набор правил, который известен и вашему компьютеру, и физически отдаленному компьютеру.
Пример: вы вводите команду удаления файла, и эта команда передается на другой компьютер и выполняется там. Ответ (или сообщение об ошибке) возвращается и показывается на вашем компьютере.
Что значит «защищенный»?
Вся информация передается в зашифрованном виде. Подобно тому, как некоторые сайты работают по HTTPS, шифруя информацию. Например, ваш онлайн-банкинг обязательно должен работать по защищенному соединению. В таком случае даже если всю информацию перехватывает злоумышленник, он не сможет расшифровать её.
Для чего нужен SSH?
Не всегда есть возможность физически находиться у компьютера, с которым нужно работать. Например, если вы хотите создать свой сайт, то он будет размещен на компьютере хостинг-провайдера. Этот компьютер может находиться на другом конце света. Вам нужен способ запускать команды на этом компьютере не выходя из своего дома.
Как подключаться по SSH?
Для подключения к удаленной машине по SSH нужен клиент — специальная программа. В *nix-подобных системах (Linux, macOS) клиент обычно установлен в системе по умолчанию, и достаточно открыть терминал. В Windows нужно скачать сторонний клиент, например, Putty.
Для подключения нужно указать адрес сервера и, опционально, имя пользователя и порт. Вот как выглядит команда при использовании консольного клиента (в терминале):
Например, для подключения к серверу 52.307.149.244 в аккаунт ivan нужно ввести:
В графическом клиенте вроде Putty нужно ввести ту же информацию в соответствующие поля:
Fingerprint
При первом подключении появится сообщение:
Введите yes в первый раз.
Это нужно для повышения безопасности. При настройке SSH-сервера создается уникальная комбинация символов — fingerprint («отпечатки пальцев»). Ваш компьютер запоминает эту комбинацию и сверяет ее при каждом новом соединении. Если кто-то переустановит SSH-сервер, или всю операционную систему, или вообще заменит удаленный компьютер, сохранив его адрес, то при следующем соединении вы узнаете об этом, потому что изменится fingerprint.
Если fingerprint не меняется, то такое сообщение не будет появляться.
Подключение по SSH по паролю
Простейший вариант — подключение по паролю. После ввода команды ssh система запросит пароль:
Пароль придется вводить каждый раз.
Подключение по SSH по ключу, без пароля
Для удобного подключения по SSH (и многим другим сервисам) без ввода пароля можно использовать ключи.
Нужно создать пару ключей: приватный (закрытый) ключ и публичный (открытый) ключ. Приватный ключ нужно хранить и никогда никому не показывать. Публичный ключ можно показывать всем и распространять свободно.
Эти ключи связаны друг с другом таким образом, что зашифровав информацию одним ключом, расшифровать ее можно только другим. Например, если ваш друг зашифрует письмо вашим публичным ключом, то прочитать его сможете только вы, потому что для этого нужен ваш приватный ключ. И наоборот: если вы зашифруете что-то своим приватным ключом, то расшифровать его можно только вашим публичным ключом. Так как публичный ключ доступен всем, любой может расшифровать это сообщение. Но он может быть уверен, что сообщение пришло именно от вас. В этом заключается идея цифровой подписи.
Генерация ключей
Создадим пару ключей:
Программа запустится и спросит, куда сохранять ключи:
Программа запросит passphrase. Это вроде пароля для ключа. Можно просто нажать Enter и пропустить этот шаг. Или ввести passphrase — тогда его нужно будет вводить каждый раз, когда используется ключ.
Теперь у вас есть два файла:
/.ssh/id_rsa — приватный ключ. Никогда никому и никуда не передавайте его!
/.ssh/id_rsa.pub — публичный ключ. Спокойно распространяйте его.
В Windows можно использовать ssh-gen в подсистеме Ubuntu for Windows или в командной строке Git for Windows. Или создавать ключи графической утилитой вроде PuTTYgen.
Загрузка публичного ключа на сервер
Нужно добавить публичный ключ на сервер в файл
Другой способ — подключиться по паролю, открыть в редакторе файл
/.ssh/authorized_keys и добавить в конец текст из вашего файла
После включения соединений по ключу рекомендуется отключить подключение по паролю.
ssh-agent
При работе с ключами возможны две неудобные ситуации:
ssh-agent решает эти проблемы. Этот агент аутентификации (authentication agent) работает на фоне в *nix-системах. В зависимости от системы, вам, возможно, придется установить и настроить его автозапуск самостоятельно.
Если добавить ключ к агенту, то:
ssh-add /home/demo/.ssh/id_rsa добавит ключ id_rsa в запущенный в системе агент. Если у него есть passphrase, то агент попросит ввести его.
Если запустить ssh-add без аргументов, то будут добавлены ключи
ssh-agent привязан к сессии. Поэтому, например, если перезагрузить компьютер, то ключи нужно будет добавлять в агент заново.
Форвардинг (проброс) ключей
Если вы подключились к удаленному серверу X, и с него хотите подключиться к другому серверу Y, например, чтобы сделать git pull с GitHub’а, то придется держать копию ваших ключей на сервере X.
Ключи, добавленные к агенту аутентификации (ssh-agent) станут доступными на удаленном сервере. При этом файлы-ключи физически не будут находиться на сервере.
Частые вопросы
Чем Telnet отличается от SSH?
Telnet это конкретная программа с графическим интерфейсом, с помощью которой можно соединяться по SSH. Обычно ей пользуются только Windows пользователи, в Linux и MacOS используют консольную утилиту ssh.
Что Такое SSH
Что такое SSH
SSH, или Безопасная Оболочка, это протокол удаленного администрирования, который позволяет пользователю управлять и вносить изменения на его удаленный сервер через Интернет. Эта служба была создана в качестве замены не зашифрованному Telnet и использует криптографические техники, чтобы обеспечить, что всё сообщение между сервером и пользователем было зашифровано. SSH предоставляет механизм для авторизации удаленного пользователя, передавая команды клиента хосту и возвращая ответ обратно клиенту.
На рисунке ниже показано обычное окно SSH. Любой пользователь Linux или macOS может воспользоваться SSH напрямую из окна терминала. Пользователи Windows могут воспользоваться SSH-клиентом вроде Putty. Вы можете выполнять shell команды также, как если бы вы напрямую управляли удаленным компьютером.
Это руководство по SSH расскажет о том, что такое SSH, как работает SSH и заодно поможет вам понять технологии позволяющие протоколу предоставлять защищенное удаленное управление. Мы подробнее остановимся на каждом из слоёв и типов шифрования, а также расскажем о значении каждого из них.
Как работает SSH
Если вы используете Linux или Mac, тогда использование SSH для вас не составит особого труда. Если вы используете Windows, вам необходимо установить SSH-клиент для подключения. Самым популярным SSH-клиентом является PuTTy, о котором вы можете узнать подробнее здесь.
Для пользователей Mac и Linux, перейдите к вашей программе терминала и следуйте инструкциям ниже:
SSH команда состоит из 3 отдельных частей:
Часть с SSH даст системе знать, что вы хотите открыть SSH соединение. даст системе сведения об аккаунте к которому вы хотите подключиться. К примеру, вы захотите получить доступ в качестве root пользователя, который фактически является синонимом для администратора системы с полными правами на изменение любых данных в системе. означает компьютер к которому вы хотите подключиться. Это может быть IP адрес или доменное имя (например www.домен.xyz).
Когда вы нажмёте Enter, вылезет окно с просьбой ввести пароль от запрошенного аккаунта. Когда вы его введёте не последует никаких сообщений, однако, ваш пароль будет передан. После того, как вы закончите ввод пароля, нажмите кнопку Enter дважды вновь. Если ваш пароль правильный, то вас встретит окно терминала удаленного управления.
Если вы хотите узнать больше об 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 файле) и предоставив необходимые личные данные для аутентификации подключения.
Есть две стадии установки подключения: первое, обе системы должны договориться о стандартах шифрования для защиты их будущих соединений, и второе, пользователи должны пройти проверку подлинности. Если данные верны, то пользователь получит доступ.
Процесс выбора шифрования
Когда клиент пытается установить соединение с сервером через TCP, то сервер предоставит протоколы шифрования и их версии, которые он поддерживает. Если клиент имеет такой же подходящий протокол и версию, достигается соглашение и соединение устанавливается с выбранным протоколом. Сервер также использует асимметричные публичные ключи, которые клиент может использовать для проверки аутентификации.
Как только оно установлено, стороны используют алгоритм обмена Диффи—Хеллмана для создания симметричных ключей. Этот алгоритм позволяет и клиенту, и серверу получить общий код шифрования, который они будет использовать для дальнейших сессий подключения.
Вот как работает алгоритм на самом простом уровне:
Теперь, когда сессия защищенная симметричным шифрованием была установлена, пользователь должен быть авторизован.
Авторизация пользователя
Финальный этап перед тем как пользователь получит доступ к серверу, это его авторизация. Для этого большинство пользователей используют пароль. Пользователя попросят вписать имя и затем последует пароль. Эти данные будут переданы через защищённый симметричным шифрованием туннель, поэтому они не могут быть перехвачены третьими лицами.
Однако даже если пароли зашифрованы, их не рекомендуют использовать для защищённого соединения. Причиной тому является относительная простота с которой боты могут подобрать пароль к вашему аккаунту. Поэтому рекомендуется использование пары ключей SSH.
Это набор асимметричных ключей, которые используются для авторизации пользователей без введения каких-либо паролей.
Заключение
Углубление своих знаний о том, что такое SSH и как он работает помогает лучше понять защитные аспекты этой технологии. Многие люди думают об этом процессе как о непонятном и невероятно сложном, однако, это гораздо проще чем им кажется. Если вам интересно узнать, сколько времени потребуется компьютеру, чтобы вычислить хеш и авторизовать пользователя, что же, это происходит меньше чем за секунду. Большая часть этого времени уходит на передачу данных через Интернет.
Надеемся, это руководство помогло вам узнать, что такое SSH и понять как различные технологии могут объединиться вместе и играть в одном механизме очень важную роль. Также вы узнали почему Telnet стал достоянием прошлого сразу после того как пришёл SSH.
Чтобы найти ещё больше руководство по Linux, загляните в раздел VPS.
Елена имеет профессиональное техническое образование в области информационных технологий и опыт программирования на разных языках под разные платформы и системы. Более 10 лет посвятила сфере веб, работая с разными CMS, такими как: Drupal, Joomla, Magento и конечно же наиболее популярной в наши дни системой управления контентом – WordPress. Её статьи всегда технически выверены и точны, будь то обзор для WordPress или инструкции по настройке вашего VPS сервера.
Как пользоваться SSH
В этой инструкции мы рассмотрим как пользоваться ssh, а также ее возможности, о которых вы даже не знали. Скорее всего, вы уже знаете как подключиться к серверу по ssh, но у этой утилиты есть еще много возможностей, таких как передача файлов ssh, подключение без пароля или выполнение скрипта на удаленном сервере. Все это мы и рассмотрим далее в статье. Но начнем с самых основ.
Базовый синтаксис
Синтаксис команды выглядит следующим образом:
$ ssh [опции] имя пользователя @ сервер [команда]
Важно заметить что ssh может работать по двум версиям протокола. Версии 1 и 2. Понятное дело, что версия 2 лучше и поддерживает больше типов шифрования и аутентификации. Больше в этой статье об отличиях протоколов мы говорить не будем и я буду подразумевать что вы используете версию 2.
Опции команды SSH
Теперь давайте рассмотрим самые основные опции команды ssh:
Это далеко не все опции утилиты, остальные выходят за рамки данной статьи. Многие настройки работы ssh можно изменять через конфигурационный файл
/.ssh/config но здесь мы это тоже подробно рассматривать не будем.
Настройка сервера SSH
Настройки сервера SSH находятся в файле /etc/ssh/sshd_config. Многие из них мы тоже трогать не будем. Рассмотрим только самые интересные. Сначала откройте файл /etc/ssh/sshd.conf
Порт ssh
По умолчанию ssh работает на порту 22. Но такое поведение небезопасно, поскольку злоумышленник знает этот порт и может попробовать выполнить Bruteforce атаку для перебора пароля. Порт задается строчкой:
Поменяйте значение порта на нужное.
Протокол SSH
По умолчанию сервер ssh может работать по двум версиям протокола, для совместимости. Чтобы использовать только протокол версии два раскомментируйте строчку:
И приведите ее к такому виду:
Рут доступ
По умолчанию Root доступ по ssh разрешен, но такое поведение очень небезопасно, поэтому раскомментируйте строчку:
Доступ только определенного пользователя к SSH
Мы можем разрешить доступ к ssh только для определенного пользователя или группы. Для этого добавьте строчки:
AllowUsers User1, User2, User3
AllowGroups Group1, Group2, Group3
Выполнение X11 приложений
Не все знают но есть возможность использовать ssh для запуска полноценных X11 приложений. Об этом мы поговорим ниже, но чтобы все заработало необходимо разрешить эту возможность на стороне сервера, добавьте такую строчку:
Основные опции рассмотрели, перед тем как переходить дальше, не забудьте перезагрузить ssh сервер чтобы сохранить изменения:
service sshd restart
Использование SSH
Подключение к серверу
Чтобы просто подключиться к серверу по SSH используйте такую команду:
Выполнить команду
Мы привыкли подключаться к удаленному серверу, а уже потом выполнять нужные команды, но на самом деле утилита ssh позволяет сразу выполнить нужную команду без открытия терминала удаленной машины. Например:
Выполнит команду ls на удаленном сервере и вернет ее вывод в текущий терминал.
Выполнить локальный скрипт
Выполним интерпретатор bash на удаленном сервере и передадим ему наш локальный скрипт с помощью перенаправления ввода Bash:
Бекап на удаленный сервер и восстановление
Мы можем сохранять бекэп диска сразу на удаленном сервере с помощью 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.
Взять пароль из локального файла
Изменить приветствие SSH
При входе по ssh может выводиться приветствие, изменить его очень легко. За это отвечает файл /etc/issue. Просто откройте этот файл и введите нужный текст:
Смотрим неудачные попытки входа SSH
Хотите посмотреть были ли попытки неудачного доступа по ssh к вашему серверу и с каких IP адресов? Запросто, все запросы логируются в файл /var/log/secure, отфильтруем только нужные данные командой:
cat /var/log/secure | grep «Failed password for»
Передача файлов по SSH
Кроме выполнения команд, можно копировать файлы по ssh. Для этого используется утилита scp. Просто укажите файл, который нужно передать, удаленный сервер и папку на сервере, вот:
$ scp /адрес/локального/файла пользователь@ хост: адрес/папки
Кроме утилиты scp, передача файлов ssh может быть выполнена более хитрым способом. Прочитаем файл и с помощью cat, передадим, а там сохраним поток в файл:
cat localfile | ssh user@host «cat > remotefile»
ssh user@host «cat > remotefile»
Пойдем еще дальше, вы можете сжимать файлы перед передачей с помощью tar, а потом их сразу же на лету распаковывать:
Такое копирование файлов ssh позволяет отправлять сразу целые папки.
Запуск графических приложений по ssh
Если вам нужно запустить то или иное графическое приложение на удаленной машине необязательно для этого использовать VNC, вы можете обойтись возможностями ssh. Программа будет выполняться на стороне сервера, а вам будет лишь транслироваться окно, чтобы вы могли сделать все что нужно. Причем все данные шифруются. Чтобы эта функция работала, нужно включить ее поддержку на стороне сервера.
Затем просто выполняем команду запуска графического приложения на удаленном сервере вот таким образом:
Завершение сессии SSH
В файл /etc/ssh/ssh_config. Теперь, чтобы разорвать SSH соединение достаточно нажать Enter и набрать:
Другие управляющие символы можно узнать нажав:
Туннели SSH
С помощью SSH туннелей вы можете пробросить порт с удалённого сервера на локальную машину. Это очень полезно, в первую очередь, для разработчиков. Для того чтобы пробросить порт с удалённой машины локальной используйте опцию -L и такой синтаксис:
Например, сделаем удалённую базу данных доступной локально на порту 5555. Для этого выполните подставив свои значения:
Теперь локальная база данных на порту 3306 будет доступна на удалённом сервере при обращении к порту 5555.
Выводы
Теперь вы знаете как пользоваться SSH. Как видите, технология SSH позволяет сделать намного больше чем можно предположить с первого взгляда, и это еще далеко не все. Какие интересные возможности SSH используете вы при повседневной работе? Поделитесь в комментариях!












