Подключение к удаленному серверу Linux по SSH

LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы освоите ключевые навыки подключения к удаленному серверу Linux и управления им с помощью протокола Secure Shell (SSH). Вы начнете с подготовки удаленной среды, что включает в себя установку и настройку пакета сервера OpenSSH. Убедившись, что сервер готов принимать входящие соединения, вы научитесь определять его IP-адрес — это критически важный шаг для установления связи с клиентской машины.

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

Установка и настройка сервера OpenSSH

На этом этапе вы установите пакет сервера OpenSSH, который позволит вашей системе принимать входящие SSH-соединения. SSH (Secure Shell) — это криптографический сетевой протокол для безопасной работы сетевых служб в незащищенной сети. Пакет openssh-server содержит основные компоненты для хостинга SSH-сервера.

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

Выполните следующую команду для обновления индекса пакетов:

sudo apt-get update

Вы увидите вывод, похожий на приведенный ниже, указывающий на получение списков пакетов из репозиториев:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Fetched 1,845 kB in 2s (1,040 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up-to-date.

Теперь можно установить пакет openssh-server с помощью apt-get. Флаг -y автоматически дает согласие на все запросы, делая установку неинтерактивной.

sudo apt-get install -y openssh-server

После завершения команды вы увидите подтверждение установки и настройки openssh-server и его зависимостей:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ncurses-term openssh-sftp-server ssh-import-id
...
Setting up openssh-server (1:8.9p1-3ubuntu0.1) ...
...
Creating SSH2 ECDSA key; this may take some time ...
Creating SSH2 ED25519 key; this may take some time ...
...

Служба SSH-сервера под названием sshd должна запуститься автоматически после установки. Вы можете проверить ее статус с помощью команды systemctl — инструмента для управления системой systemd и менеджером служб.

Проверьте статус службы SSH:

sudo systemctl status ssh

В выводе должно быть указано, что служба находится в состоянии active (running). Это подтверждает, что SSH-сервер готов к приему соединений.

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 10:30:00 UTC; 5s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1234 (sshd)
      Tasks: 1 (limit: 4617)
     Memory: 1.2M
        CPU: 8ms
     CGroup: /system.slice/ssh.service
             └─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

...

Нажмите клавишу q на клавиатуре, чтобы выйти из режима просмотра статуса и вернуться к командной строке.

Отлично! Сервер OpenSSH установлен и запущен. На следующем этапе вы создадите нового пользователя для демонстрации работы SSH, а затем узнаете, как найти IP-адрес сервера и подключиться к нему.

Создание нового пользователя для демонстрации SSH

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

Сначала создайте нового пользователя с именем sshuser, используя команду adduser. Эта команда создаст учетную запись и предложит вам установить пароль и другие данные.

sudo adduser sshuser

Вам будет предложено ввести и подтвердить пароль для нового пользователя. Для этой лабораторной работы используйте пароль password123. Вас также попросят ввести дополнительную информацию (полное имя, номер комнаты и т. д.), но вы можете просто нажимать Enter, чтобы пропустить эти поля.

Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
 Full Name []:
 Room Number []:
 Work Phone []:
 Home Phone []:
 Other []:
Is the information correct? [Y/n] Y

Теперь убедитесь, что пользователь был успешно создан, проверив файл /etc/passwd:

grep sshuser /etc/passwd

Вы должны увидеть строку, похожую на эту:

sshuser:x:1000:1000:,,,:/home/sshuser:/bin/bash

Это подтверждает, что учетная запись sshuser создана с домашним каталогом в /home/sshuser и использует оболочку bash. Точные значения UID (идентификатор пользователя) и GID (идентификатор группы) могут отличаться в зависимости от существующих в системе пользователей.

Вы также можете проверить, был ли создан домашний каталог пользователя. Обратите внимание, что для доступа к домашнему каталогу другого пользователя требуются привилегии sudo:

sudo ls -la /home/sshuser

Вывод должен показать содержимое домашнего каталога пользователя:

total 20
drwxr-x--- 2 sshuser sshuser 4096 Jun 30 09:26 .
drwxr-xr-x 5 root    root    4096 Jun 30 09:26 ..
-rw-r--r-- 1 sshuser sshuser  220 Jun 30 09:26 .bash_logout
-rw-r--r-- 1 sshuser sshuser 3771 Jun 30 09:26 .bashrc
-rw-r--r-- 1 sshuser sshuser  807 Jun 30 09:26 .profile

Обратите внимание, что домашний каталог имеет ограниченные права доступа (drwxr-x---), что означает, что только владелец (sshuser) и пользователи из той же группы могут получить к нему доступ. Именно поэтому для просмотра его содержимого требуется sudo.

Прекрасно! Теперь у вас есть учетная запись sshuser с паролем password123, которую вы сможете использовать для SSH-подключений на следующих этапах.

Определение IP-адреса SSH-сервера

На этом этапе вы научитесь определять IP-адрес вашего SSH-сервера. IP-адрес — это уникальный числовой идентификатор, присваиваемый каждому устройству в компьютерной сети, использующей протокол IP для связи. Чтобы установить SSH-соединение, клиентская машина должна знать IP-адрес сервера, к которому она хочет подключиться.

В типичном сценарии с двумя отдельными машинами вы бы использовали этот IP-адрес для подключения с клиента. Однако в этой лабораторной работе вы работаете на одной виртуальной машине, которая будет выступать одновременно и SSH-сервером, и SSH-клиентом. Чтобы подключиться к SSH-серверу, запущенному на вашей собственной машине, вы можете использовать специальный IP-адрес 127.0.0.1, также известный как localhost. Этот адрес всегда ссылается на саму локальную машину.

Тем не менее, умение находить внешний сетевой IP-адрес машины является важным навыком. Современная команда для этого в Linux — ip.

Чтобы отобразить информацию обо всех сетевых интерфейсах в вашей системе, используйте команду ip addr:

ip addr

В выводе будут перечислены все сетевые интерфейсы, такие как lo (петлевой интерфейс), eth0 (основной интерфейс Ethernet) и, возможно, docker0 (мост Docker). Вам нужно найти запись inet под вашим основным сетевым интерфейсом, которым обычно является eth0.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:82:ae brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.114/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159625sec preferred_lft 1892159625sec
    inet6 fe80::216:3eff:fe01:82ae/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:86:fe:f0:88 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

В приведенном выше примере основным IP-адресом для интерфейса eth0 является 172.16.50.114. Вы также можете увидеть интерфейс docker0, если в системе установлен Docker.

Более простая команда для отображения только IP-адресов машины — hostname -I.

hostname -I

Эта команда выведет список IP-адресов машины через пробел.

172.16.50.114 172.17.0.1

Вывод показывает несколько IP-адресов: IP основного сетевого интерфейса (172.16.50.114) и IP моста Docker (172.17.0.1).

Теперь вы знаете, как найти IP-адрес вашей машины. На следующем этапе вы будете использовать адрес localhost (127.0.0.1) для подключения к SSH-серверу, запущенному на этой же машине.

Установление интерактивного SSH-сеанса с удаленным сервером

На этом этапе вы воспользуетесь SSH-клиентом для установления интерактивного сеанса с настроенным вами сервером OpenSSH. Интерактивный сеанс предоставляет вам доступ к командной строке на удаленном сервере, позволяя выполнять команды так, как если бы вы находились за ним физически.

Для подключения используется команда ssh, за которой следует имя пользователя и адрес сервера в формате ssh <user>@<hostname_or_ip>. Поскольку вы подключаетесь к серверу, запущенному на вашей собственной машине (localhost), под пользователем sshuser, вы будете использовать IP-адрес 127.0.0.1.

Откройте терминал и выполните следующую команду:

ssh sshuser@127.0.0.1

При первом подключении к любому новому SSH-серверу ваш клиент отобразит отпечаток публичного ключа сервера и попросит подтвердить его подлинность. Это мера безопасности для предотвращения атак типа «человек посередине» (man-in-the-middle). Вам следует ввести yes и нажать Enter для продолжения.

The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.

После подтверждения ключа хоста вам будет предложено ввести пароль для пользователя sshuser на удаленном сервере. Введите пароль password123, который вы установили при создании пользователя.

sshuser@127.0.0.1's password:

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

Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage

sshuser@ubuntu:~$

Чтобы убедиться, что вы находитесь в удаленной сессии, вы можете запустить команду pwd, чтобы вывести текущий рабочий каталог.

pwd

Вывод покажет ваш домашний каталог на удаленной машине.

/home/sshuser

Чтобы завершить интерактивный SSH-сеанс и вернуться в оболочку вашей локальной машины, просто введите exit и нажмите Enter.

exit

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

logout
Connection to 127.0.0.1 closed.

Вы успешно установили и завершили интерактивный SSH-сеанс.

Выполнение одиночной команды удаленно через SSH

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

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

Давайте попробуем запустить команду hostname на удаленном сервере. Эта команда выводит имя хоста системы.

ssh sshuser@127.0.0.1 "hostname"

Вам снова будет предложено ввести пароль (password123). После ввода пароля команда hostname выполнится на удаленном сервере, ее результат будет выведен в ваш терминал, а SSH-соединение автоматически закроется.

sshuser@127.0.0.1's password:
iZrj91w6gb8osv0mra83hdZ

Обратите внимание, что вы сразу же вернулись к локальной командной строке, и вам не пришлось вводить exit.

Вы можете выполнять и более сложные команды. Например, давайте выведем содержимое корневого каталога (/) на удаленном сервере с помощью ls -l /.

ssh sshuser@127.0.0.1 "ls -l /"

Снова введите пароль password123 при запросе. Вы увидите подробный список файлов и каталогов в корневой файловой системе удаленного сервера.

sshuser@127.0.0.1's password:
total 72
lrwxrwxrwx   1 root root     7 Apr 21  2022 bin -> usr/bin
drwxr-xr-x   4 root root  4096 May 30  2023 boot
drwxr-xr-x  19 root root  4080 Jun 30 09:23 dev
drwxr-xr-x 137 root root 12288 Jun 30 09:26 etc
drwxr-xr-x   5 root root  4096 Jun 30 09:26 home
lrwxrwxrwx   1 root root     7 Apr 21  2022 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Apr 21  2022 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Apr 21  2022 libx32 -> usr/libx32
drwx------   2 root root 16384 Dec 28  2022 lost+found
drwxr-xr-x   2 root root  4096 Apr 21  2022 media
drwxr-xr-x   2 root root  4096 Apr 21  2022 mnt
drwxr-xr-x   5 root root  4096 Feb 27  2023 opt
dr-xr-xr-x 231 root root     0 Jun 30 09:22 proc
drwx------   8 root root  4096 Jun 30 09:26 root
drwxr-xr-x  35 root root  1060 Jun 30 09:30 run
lrwxrwxrwx   1 root root     8 Apr 21  2022 sbin -> usr/sbin
drwxr-xr-x  10 root root  4096 Feb 18  2023 snap
drwxr-xr-x   2 root root  4096 Apr 21  2022 srv
dr-xr-xr-x  13 root root     0 Jun 30 09:22 sys
drwxrwxrwt  18 root root  4096 Jun 30 09:30 tmp
drwxr-xr-x  14 root root  4096 Apr 21  2022 usr
drwxr-xr-x  13 root root  4096 Apr 21  2022 var

Этот метод невероятно эффективен для управления множеством серверов или интеграции удаленных операций в ваши локальные скрипты. Теперь вы изучили два основных способа использования SSH: для интерактивных сессий и для выполнения одиночных команд.

Резюме

В этой лабораторной работе вы изучили основные шаги по включению и использованию Secure Shell (SSH) для удаленного управления сервером. Вы начали с подготовки удаленного сервера Linux, что включало обновление индекса репозитория пакетов с помощью sudo apt-get update и последующую установку пакета openssh-server. Этот процесс настроил систему на безопасный прием входящих SSH-соединений и автоматический запуск службы sshd.

Затем вы создали специальную учетную запись пользователя (sshuser) с известным паролем (password123) для аутентификации по SSH, так как стандартный пользователь labex хоть и имеет права sudo, но не имеет пароля для SSH-подключений. Вы проверили создание пользователя и убедились, что его домашний каталог был правильно настроен.

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