Обычные пользователи почти всегда работают с компьютером локально. То есть они физически находятся у компьютера, используют имеющиеся у него устройства ввода-вывода (клавиатуру, мышь, дисплей) для выполнения необходимых операций. Однако, не всегда есть возможность физически находиться у компьютера, с которым нужно работать. Например, если вы хотите создать свой сайт, то он будет размещен на компьютере хостинг-провайдера. Этот компьютер может находиться на другом конце света. Вам нужен способ запускать команды на этом компьютере не выходя из своего дома. При профессиональной работе с компьютерами часто возникает потребность выполнять определенные операции на удаленных машинах. Например, системный администратор может обслуживать компьютерную сеть, состоящую из десятков компьютеров. Было бы очень неудобно постоянно физически перемещаться между компьютерами. Более того, удаленный компьютер может располагаться, например, в центре обработки данных у облачного провайдера, или быть вообще виртуальной машиной на кластере. Такое часто бывает при использовании облачных систем.
Источник: securityboulevard.com.
Специально для таких случаев существуют протоколы удаленного доступа. Они позволяют подключиться к удаленному компьютеру и работать на нем так же, как вы обычно работаете на локальной физической машине. Такие протоколы разделяются на графические и текстовые. Графические протоколы, например, RDP (remote desktop protocol) передают по сети изображение графического интерфейса в одну сторону, движения мыши и события клавиатуры - в другую. Текстовые протоколы, такие как Telnet или SSH, передают только текстовую информацию и позволяют работать в терминале удаленной машины. Здесь мы рассмотрим самый популярный текстовый протокол удаленного доступа - SSH.
SSH — защищенный протокол для удаленного доступа к компьютерам. Через SSH можно выполнять операции в командной строке компьютера, который физически находится в другом месте. Иными словами, SSH — это дистанционная командная строка. Визуально вы работаете на своем компьютере, но в реальности — на другом.
Протокол — это набор соглашений, правил, по которым разные программы могут обмениваться информацией. SSH — это набор правил, который известен и вашему компьютеру, и физически отдаленному компьютеру. Пример: вы вводите команду удаления файла, и эта команда передается на другой компьютер и выполняется там. Ответ (или сообщение об ошибке) возвращается и показывается на вашем компьютере.
При удаленной работе обычно используются существующие открытые каналы коммуникации, то есть компьютерные сети. Почти всегда - подключение происходит через Интернет. Поэтому очень важно обеспечить безопасность соединения. При использовании протокола SSH вся информация передается в зашифрованном виде. Подобно тому, как некоторые сайты работают по HTTPS, шифруя информацию. Например, ваш онлайн-банкинг обязательно должен работать по защищенному соединению. В таком случае даже если всю информацию перехватывает злоумышленник, он не сможет расшифровать её.
Используя SSH можно подключиться к любой удаленной машине при соблюдении некоторых условий. Ни параметры удаленной машины, ни расстояние не имеют значения. Также можно подключаться как к физическим, так и к виртуальным машинам. При подключении, вы даже можете не знать, к чему вы подключаетесь, к физическому компьютеру или к виртуальной машине в датацентре какой-то компании. При работе никакой разницы вы не заметите.
Как и большинство сетевых протоколов, SSH работает по клиент-серверному принципу. То есть на вашем компьютере, за которым вы работаете физически должна быть установлена специальная программа - ssh клиент. С ее помощью вы и будете подключаться к другим машинам. А на удаленной машине, то есть той, к которой вы подключаетесь должна работать другая программа - ssh сервер. Она будет принимать ваше подключение, выполнять ваши команды, следить за правами доступа и так далее. Как настроить и клиент и сервер мы поговорим далее.
Выводы:
Источник: Wikimedia.
Для того, чтобы иметь возможность подключиться к удаленной машине нужно соблюдение нескольких условий. Во-первых, как мы уже говорили, на ней должен быть установлен и работать ssh сервер. Существуют разные сервера, но самым распространенным является свободный и бесплатный сервер openssh. Он существует и для Linux и для Windows и для других операционных систем. Во многие дистрибутивы Linux, ориентированные на серверную работу он устанавливается по умолчанию. Если же его нет, то установить его очень просто командой:
1
$ sudo apt install openssh-server
Естественно, удаленная машин должна быть доступна по сети с локальной. Если удаленная машина выключена, не подключена к сети или подключена к изолированной сети, куда не пройдут пакеты от локальной машины - подключиться вы к ней не сможете. Другими словами, удаленная машина должна пинговаться с локальной.
Обратите внимание, что удаленная машина не должна быть скрыта NAT’ом или каким-либо сетевым экраном, блокирующим входящие соединения. Кстати, домание компьютеры, выходящие в интернет через обычного провайдера, как правило, как раз скрыты за NAT. Поэтому, находясь в своей домашней сети, вы сможете подключиться к другому компьютеру в ней, а извне - нет.
Протокол ssh никак не связан с интернетом. Вы можете подключаться к машинам, которые подключены в общую локальную сеть, независимо от того, есть ли выход в интернет. В любом случае, вы должны знать адрес удаленной машины, чтобы к ней подключиться. Обычно используется IP-адрес. Но если у сервера есть назначенное доменное имя - можете использовать его.
Кроме IP-адреса нужно знать номер сетевого порта, который прослушивает сервер ssh. По умолчанию любая служба ssh использует порт 22. Однако, администраторам при настройке сервера рекомендуется ради безопасности изменить порт на случайный. Поэтому для подключения надо знать, был ли переназначен стандартный порт и, если да, то на какой.
Еще одно необходимое условие - знание учетной записи пользователя на удаленной машине. Помните, что после подключения вы первым делом должны будете авторизоваться на сервере. Поэтому для этого вы должны знать имя пользователя и его пароль. Этот пользователь должен быть зарегистрирован именно на удаленной машине. Ваш локальный пользователь не подойдет. Если вы сами настраиваете сервер, то такое надо предусмотреть заранее. Например завести специального пользователя, предназначенного именно для того, чтобы под ним на эту машину заходили по протоколу ssh.
Еще одно предостережение. На реально используемых серверах обязательно должен стоять файерволл - специальная программа, которая блокирует входящие соединения на определенные порты. Она нужна для безопасности. Так вот, по умолчанию, такие программы блокируют все порты. Если вы хотите какие-то определенные порты использовать, их надо добавить в исключения файервола.
Как мы уже говорили, на локальной машине должне быть установле ssh-клиент. В *nix-подобных системах (Linux, macOS) клиент обычно установлен в системе по умолчанию, и достаточно открыть терминал и воспользоваться командой ssh. В Windows нужно скачать сторонний клиент, например, Putty. SSH-клиентов тоже существует много разных. Есть даже графические клиенты. Но даже в них придется работать в командной строке - ведь сам протокол ssh - чисто текстовый.
Выводы:
Для подключения нужно воспользоваться командой ssh. при запуске нужно указать адрес сервера, имя пользователя и, опционально, порт подключения. Вот как выглядит команда при использовании консольного клиента (в терминале):
1
$ ssh username@remote_host -p port
Например, для подключения к серверу 52.307.149.244 в аккаунт user нужно ввести:
1
$ ssh user@52.307.149.244
Если не указывать порт, то будет использован порт SSH по умолчанию — 22. Используемый порт задается при настройке SSH-сервера.
При первом подключении к конкретному серверу появится такое сообщение:
1
2
3
The authenticity of host '52.307.149.244 (52.307.149.244)' 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
Введите yes в первый раз.
Это нужно для повышения безопасности. При настройке SSH-сервера создается уникальная комбинация символов — fingerprint («отпечатки пальцев»). Ваш компьютер запоминает эту комбинацию и сверяет ее при каждом новом соединении. Если кто-то переустановит SSH-сервер, или всю операционную систему, или вообще заменит удаленный компьютер, сохранив его адрес, то при следующем соединении вы узнаете об этом, потому что изменится fingerprint. Если fingerprint не меняется, то такое сообщение не будет появляться.
Простейший вариант — подключение по паролю. После ввода команды ssh система запросит пароль:
1
2
$ ssh ivan@52.307.149.244
password:
Пароль придется вводить каждый раз. Обратите внимание, что пароль нужно вводить уже после установки подключения. Это сделано для того, чтобы передаваемый по сети пароль уже мог шифроваться. Ведь передавать пароли в открытом виде - очень небезопасно.
После подключения вы войдете в командную строку удаленной машины. В командной строке немного чего изменится.
Обратите внимание, что изменилось приглашение командной строки - теперь там отображаются данные удаленной машины, другое имя пользователя. Другое приглашение - явный знак того, что вы работаете не на своем локальном физическом компьютере.
Теперь можно вводить любые команды и они будут выполнены на удаленном компьютере. Порядок работы такой же, как и в обычной командной строке.
Для выхода из удаленного сеанса необходимо нажать комбинацию клавиш Ctrl + D. Либо можно ввести команду exit.
Выводы:
Пи работе с удаленными машинами приходится при каждом подключении вводить пароль. Если вы работаете на разных машинах, приходится запоминать все пароли от всех удаленных компьютеров. Это, конечно, безопасно, но очень неудобно. К счастью, методы асимметричного шифрования позволяют избежать этого и авторизоваться на удаленных машинах без пароля, по ключу.
Асимметричные шифры устроены таким образом, что всегда используют пару ключей - один для шифрования данных, а другой, парный - для расшифровки. Эта пара ключей генерируется вместе специальным алгоритмом. И по одному ключу невозможно восстановить другой. Причем расшифровать данные можно только тем ключом, который был сгенерирован в паре с тем, которым эти данные были зашифрованы.
Поэтому пару ключей можно использовать и для авторизации. Один из ключей - тот, что используется для шифрования - назвается приватным. Его нельзя никому передавать, показывать или пересылать. Его надо хранить в секрете. Второй ключ - публичный - используется для расшифровывания. Вот его можно передавать кому угодно. Обратите внимание, что если какие-то данные удается расшифровать вашим публичным ключом, это значит, что они были зашифрованы вашим приватным ключом, и никаким другим. А так как ваш приватный ключ знаете только вы, значит и отправили эти данные именно вы. Так публичный ключ как бы подтверждает вашу личность.
Обратите внимание, что в такой схеме не очень соблюдается секретность передачи данных - ведь расшифровать их может кто угодно. Подробное рассмотрение алгоритмов шифрования и протоколов и схем их применения далеко выходит за рамки нашей темы. Заметим только, что в реальности для обеспечения секретности, целостности и идентификации в криптографических системах используются разные схемы. Мы сейчас рассматриваем только использование ключей для авторизации на сервере.
Итак, чтобы использовать авторизацию по ключу надо первым делом сгенерировать свою собственную пару ключей. Для этого используется программа ssh-keygen, которая включена в пакет ssh-клиента.
Создадим пару ключей:
1
$ ssh-keygen
Программа запустится и спросит, куда сохранять ключи:
1
2
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 и пропустить этот шаг.
1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Ключи созданы:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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+ |
+-----------------+
Теперь у вас есть два файла:
В Windows можно использовать ssh-gen в подсистеме Ubuntu for Windows или в командной строке Git for Windows. Или создавать ключи графической утилитой вроде PuTTYgen.
После генерации необходимо скопировать ключ на удаленный сервер. Нужно добавить публичный ключ на сервер в файл ~/.ssh/authorized_keys. Самый простой способ — запустить на локальной машине команду для копирования ключа:
1
$ ssh-copy-id -i /home/demo/.ssh/id_rsa ivan@52.307.149.244
Обратите внимание, что при этом придется обязательно ввести пароль от учетки на сервере. Таким образом скопированный ключ подтверждает, что его владелец знает пароль, поэтому в будущем можно его пускать без проверки.
Другой способ — подключиться по паролю, открыть в редакторе файл ~/.ssh/authorized_keys и добавить в конец текст из вашего файла ~/.ssh/id_rsa.pub.
Теперь при подключении пароль запрашиваться не будет. После включения соединений по ключу рекомендуется отключить подключение по паролю в настройках ssh сервера.
Один и тот же публичный ключ можно использовать для авторизации на разных серверах. Просто скопируйте его туда, куда часто заходите. Кроме обычных компьютеров, авторизация через SSH по ключу используется и на многих публичных сервисах. Например, популярный хостинг программных репозиториев GitHub заставляет использовать именно доступ по ключу для синхронизации проектов. Многие облачные сервисы так же имеют возможность авторизации по ключу.
Только заметьте, что если вы скомпрометировали ваш приватный ключ, придется генерировать новую пару ключей. А затем придется рассылать новый публичный ключ по всем свои серверам. Причем, компрометация - это не когда вы его по ошибке где-то опубликовали, это когда возникает малейшее подозрение, что третьи лица могли получить к нему доступ.
Выводы:
При работе с многими удаленными серверами кроме паролей приходится запоминать еще много информации: ip-адреса, имена пользователей на каждом сервере, номера нестандартных портов, которые тоже могут отличаться, другие опции. Это не так критично, как пароли, но все равно может доставить неудобств.
В стандартном клиенте ssh предусмотрена возможность запомнить частые подключения в конфигурационном файле. Он располагается по адресу ~/.ssh/config. Если его там нет, вполне можно создать новый пустой. Вообще, папка ~/.ssh/ - это общее место, где собираются многие файлы, имеющие отношение к входящим или исходящим подключениям по ssh. Например, именно туда сохраняются файлы ключей и публичные ключи удаленных пользователей.
Этот файл имеет довольно простую структуру. В нем прописывается символьное имя подключения, которые вы будете использовать вместо строки подключения в команде ssh. После этого могут идти несколько опций, например - имя пользователя, адрес хоста, номер порта, адрес публичного ключа, который будет использоваться при подключении. Выглядит это примерно так:
1
2
3
4
5
6
7
8
9
10
11
12
Host targaryen
HostName 192.168.1.10
User daenerys
Port 7654
IdentityFile ~/.ssh/targaryen.key
Host tyrell
HostName 192.168.10.20
user oberyn
Host martell
HostName 192.168.10.50
У этого файла довольно много опций, но эти - самые полезные. После того, как в файл добавлена запись можно подключаться к хосту только по алиасу, например так:
1
$ ssh targaryen
Все остальные параметры клиент подставит сам.
Выводы:
При работе в удаленной сессии есть один подводный камень. Из-за особенности функционирования процессов в Linux, когда мы выходим из сеанса (разлогиниваемся), то все запущенные команды и программы автоматически завершатся. Следующий раз нам приходится начинать работы с самого начала. И нельзя запустить какой-то долгий процесс, чтобы он выполнялся, пока мы отключились. Такое происходит и в случае непреднамеренного отключения, например, при обрыве связи.
Чтобы обойти это ограничение, существуют специальные программы. Они не входят в стандартные дистрибутивы, так что их придется устанавливать отдельно. Такие программы работают резидентно, то есть в режиме сетевой службы и поэтому могут поддерживать сеанс даже после того, как пользователь отключился.
Tmux (terminal multiplexor) - популярная программа, значительно облегчающая работы в терминале на удаленной машине. Среди возможностей данной программы:
То есть кроме поддержания сессии tmux сильно “прокачивает” стандартную командную строчку. Это очень упрощает и ускоряет сложную работу на сервере.
Для начала работы необходимо подключиться к удаленной машине по ssh. Конечно, можно использовать программу tmux на локальной машине для расширения возможностей терминала, но здесь мы рассмотрим возможности этой программы при удаленном доступе к терминалу.
При необходимости нужно установить tmux, введя команду
1
sudo apt install tmux
Обратите внимание, что эта программа должна быть установлена именно на той машине, на которой вы будете выполнять команды. То есть, если вы планируете использовать ее для работы на удаленном сервере, то именно в нем она и должна быть установлена. Если она есть только на вашей локальной машине, на сервере она не заработает.
Теперь можно запустить tmux, введя одноименную команду:
На экране мы видим главное окно программы tmux:
Сочетание клавиш <Ctrl>+B позволяет вводить команды tmux. Наиболее применимые команды:
Обратите внимание, сначала надо зажать <Ctrl>+B именно как комбинацию клавиш. Потом отпустить и сразу нажать клавишу, соответствующую нужной команде. Поначалу такая работа покажется очень неудобной, но со временем вы привыкните к такому оригинальному методу ввода команд.
Обратите внимание на нижнюю строчку. Здесь перечислены открытые окна терминала. Можно воспринимать их как вкладки, по которым можно перемещаться. Мы можем создать новое окно (ctrl-b c):
Теперь мы видим, что в нижней строке появилось окно 1. Звездочкой обозначено текущее окно.
Мы можем также переименовать окно (ctrl-b ,), чтобы лучше ориентироваться. Это бывает полезно для организации рабочего пространства.
Теперь мы имеем второе окно (под номером 1, так как нумерация начинается с 0) с именем window1.
Давайте для иллюстрации запустим в первом окне команду htop:
Tmux позволяет вывести список всех созданных окон (ctrl-b w), в котором можно перемещаться между ними. Также доступен предварительный просмотр содержимого каждого окна:
Работая в этой программе можно также разделять пространство в отдельно взятом окне на две панели. В каждой панели можно работать независимо, вводить команды и наблюдать результат одновременно.
Текущее окно или панель можно разбить на две панели как вертикально (ctrl-b %), так и горизонтально (ctrl-b "). Панели можно дробить неограниченное число раз:
При выполнении команды exit (или ctrl-d) панель закрывается.
Если эта панель была единственной в окне - то закроется все окно, а если окно было единственным - программа tmux завершится.
Еще одной возможностью tmux является работа с сессиями. Если использовать сессии, то вместо выхода из сессии подключения к удаленной машине можно отключиться от сессии, а при повторном подключении сессия сессия сохранит свое состояние. То есть, все процессы, запущенные на удаленной машине так и будут продолжать выполняться.
Для запуска сессии необходимо запустить tmux со специальным параметром, указав имя сессии:
Запустим в этой сессии какой-нибудь интерактивный процесс:
Нажав сочетание клавиш ctrl-b d, отсоединимся от сессии:
При помощи команд терминала можно убедиться, что программа, которую мы запустили все еще работает, несмотря на то, что мы вышли из родительского процесса.
Можно даже выйти из подключения к удаленной машине и спустя некоторое время зайти обратно.
При запуске tmux можно вывести список всех открытых сессий:
Соответственно, можно вместо запуска нового терминала подключиться к одной из существующих сессий:
Как мы можем наблюдать, терминал остался в том же состоянии, в котором мы его оставили, когда выходили из сессии:
Выводы: