Мастер-класс по Linux
Что потребуется перед началом
Виртуальная машина, на которой установлена Ubuntu Server 22.04 (см. часть 0). Чтобы её развернуть развернуть, необходимо:
- ПК, способный запустить систему виртуализации с виртуальной машиной GNU/Linux. Подойдет любой новейший процессор Intel или AMD.
- Минимум 30 Гб свободного места на жестком диске (под систему и снимки).
- Минимум 4 Гб оперативной памяти для виртуальной машины (не забывайте, что оперативная память также требуется и под хостовую машину).
- Установленный VirtualBox.
- Загруженный образ дистрибутива (рекомендуется Ubuntu Server 22.04).
Часть 0. Развертывание виртуальной машины
Процесс развертыв ания виртуальной машины показан на VirtualBox 7.0, установленный на хостовую машину с операционной системой Manjaro (Linux).
Установка операционной системы виртуальной машины
- 
Устанавливаем VirtualBox. 
- 
Скачиваем образ для установки дистрибутива Ubuntu Server 22.04 с официального сайта. Вы можете выбрать любой способ загрузки, подходящий вам, например через Torrent клиент. Во время подготовки материала использовался образ ubuntu-22.04.3-live-server-amd64.iso, как наиболее универсальный вариант.
- 
Пока качается образ - создаем виртуальную машину (далее ВМ) в системе виртуализации. Ставить будем в VirtualBox (далее VB) Открываем окно создания виртуальной машины:  Как назвать - дело ваше. Удобно набрать "ubuntu" в названии, тогда VB сразу подставит значения для Ubuntu в выпадающие списки. Важно указать, что мы хотим пропустить автоматическую установку:  Для виртуальной машины рекомендуется задать оперативную память 4096 МБ. На странице официальной странице дистрибутива указано, что минимальным требование является 1024 МБ. Этот параметр вы можете изменить в будущем в настройках виртуальной машины:  Выделяем диск. Использовать рекомендуется динамический виртуальный диск. Тогда покуда внутри ВМ вы не забьете место на диске - оно не будет занято и в вашей хостовой системе. Фактический размер будет динамически растягиваться под требования (но автоматически сжиматься не будет). Достаточно будет и 25 GiB. Лучше сразу больше, все равно место оно не занимает, пока не потребуется:  После того, как задали все параметры, нажимаем "Готово". 
- 
Идем в настройки VirtualBox и создаем новую сеть NAT. Настраиваем проброс портов 127.0.0.1:2222 -> 10.0.5.5:22. Это нам потребуется для того, чтобы мы могли по SSH подключиться к виртуальной машине из хостовой. Переходим к созданию новой сети NAT:  Указываем, что хотим создать подсеть 10.0.5.0/24: Далее делаем проброс портов 127.0.0.1:2222 -> 10.0.5.5:22: После того, как все указали, применяем настройки сети и проброса портов. 
- 
В настройках ВМ в системе виртуализации выбираем загруженный образ в качестве содержимого оптического носителя, чтобы с него загрузиться:   
- 
В настройках ВМ в пункте "Сеть" выбираем "Сеть NAT" и нашу новую сеть:  Незабываем подтвердить внесенные изменения в виртуальную машину. 
- 
Запускаем виртуальную машину и устанавливаем систему. Подробно рассматривать процесс установки не будем, остановимся только на самых важных деталях. Руководство по установке Ubuntu Server. Выбираем пункт Try or Install Ubuntu Server: Выбор региона и раскладки клавиатуры. Если выбираете себе что-то, кроме английской раскладки - дело ваше, страдать Вам. Мы оставим все все по умолчанию:   Оставим также по умолчанию то, что хотим устанавливать:  Далее настройки сетевого интерфейса. Оставляем по умолчанию:  Proxy - пропускаем, оставляем пустым:  Какое зеркало для загрузки репозиториев использовать - выбираем ru.archive.ubuntu.com- зеркало Yandex: Настройки разметки диска. Оставляем все по умолчанию - система автоматически поставится поверх LVM. Для реальных систем идут жаркие споры о том стоит или не стоит ставить систему на LVM:    Настройки пользователя, hostname- сетевое имя системы и пароля. Парольroot(пользователя с идентификатором (UID - user ID)0и имеющим неограниченные привилегии, аналог администратора, далее будем называть егоroot) не устанавливается. Задаем пароль только для своего основного пользователя. Настоятельно не советуем ставить свой настоящий сложный пароль на ВМ. После ввода его попросят еще раз для подтверждения: Пропускаем рекламу:  Выбираем установить OpenSSH-сервер:  Пропускаем установку дополнительных пакетов:  Ждем завершения установки системы:  Подтверждаем изъятие диска:  ВМ "на логине". Пробуем войти своим пользователем. Если все введено верно, то вы увидите приглашение ввода команд (command prompt):  Если загружается снова установка, то проверьте в параметрах ВМ то, что диск извлечен:  
Создание снимка
Делаем мгновенный снимок виртуальной машины, если ваша система виртуализации это поддерживает. Тогда в любой момент мы сможем вернуться на данное состояние системы, если что-то сломаем. В VB переходим во вкладку "Снимки" (Snapshots) и нажимаем "сделать". Названия не принципиальны.
Люди делятся на два типа:
- Еще не делают бэкапы
- Уже делают бэкапы




Что-нибудь изменим в системе, например напишем пару команд и выключим ВМ. Теперь попробуем восстановить мгновенный снимок. Если все в полном порядке, вы откатитесь к состоянию ВМ на момент завершения установки виртуальной машины.
Люди, которые делают бэкапы, делятся на два типа:
- Еще не проверяют свои бэкапы после создания
- Уже проверяют свои бэкапы после создания

Настройка сети
Посмотрите, какой IP адрес был получен в созданной нами NAT сети с помощью следующей команды:
ip a

Установим статический адрес ВМ, чтобы при перезагрузке наша ВМ не получала от DHCP нашей сети случайны адрес из пула адресов.
Для это мы воспользуемся утилитой Netplan.
Все конфигурационные файлы Netplan находятся в папке /etc/netplan/. Во время запуска службы, она преобразовывает свою конфигурацию в конфигурацию той службы, которая будет управлять сетью и помещает её в каталог /run/. По умолчанию в Ubuntu есть только один конфигурационный файл. Его мы и откроем на редактирование:
sudo nano /etc/netplan/00-installer-config.yaml
Заменим его текущее содержимое следующим:

В данном случае мы установим статический IP-адрес на сервере Ubuntu 22.04 на 10.0.5.5/24 со шлюзом по умолчанию 10.0.5.1 и DNS-серверами 10.0.5.1. Подробнее о синтаксисе можете узнать здесь.
После того, как мы подправили мы должны сохранить изменения в файл. В текстовом редакторе Nano нужно вызвать комбинацию ctrl+x и подтвердить то, что мы хотим сохранить изменения в файл.
Далее мы применим изменения Netplan с помощью команды:
sudo netplan apply
Если все прошло успешно, то ip a нам покажет, что мы имеет интересующий нас адрес:

Проверим с помощью ping ya.ru то, что мы имеем выход в интернет:

Делаем доступным ssh
Модуль "system" управляет службой SSH во всех последних дистрибутивах Ubuntu. Таким образом, вы можете использовать команды "systemctl" для управления службой SSH.
Чтобы запустить службу SSH и добав ить ее в автозапуск, используйте следующую команду:
sudo systemctl enable ssh
Аналогично, если вы хотите проверить, запущена ли служба ssh в вашей системе или нет. Вы также можете проверить состояние службы SSH, используя следующую команду:
sudo systemctl status ssh

После включения SSH-сервера вы можете использовать его для инициирования удале нных подключений, а также принимать входящие запросы на подключение. Используйте следующую команду ssh для удаленного подключения SSH-сервера:
ssh <имя пользователя>@localhost -p 2222
Мы используем атрибут -p 2222, чтобы воспользоваться пробросом портов, который мы делали при настройки сети NAT VB.
При первом подключении от вас потребуется подтвердить, что вы хотите добавить виртуальную машину в известные хосты. Для этого введите yes на соответствующий запрос:
The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:oLDQlGjAow+wh2RDzTzts8EAQZ4iKAmZ958oSmt6QgY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
Если все получилось, то отобразится приглашение ввода команд:

Далее используйте эти данные для подключения для дальнейшего выполнения задания практической работы.
Часть 1. Подключение по SSH
Что такое SSH-ключ
Материал основан на статье Авторизация на базе ключей SSH | Академия Selectel.
Аббревиатура SSH означает Secure Shell, что дословно переводится как «безопасная оболочка». Если говорить точнее, SSH — это защищенный сетевой протокол с проверкой подлинности и шифрованием. Он используется для передачи файлов, управления сетью и удаленного доступа к операционной системе. Аббревиатура SSH также используется для описания набора инструментов, используемых для взаимодействия с одноименным протоколом.
Подключение через SSH можно просто охарактеризовать как подключение к командной строке уда ленного узла. То есть любые команды, которые будут вводиться в терминал на основной машине будут работать так же, будто вы вводите их напрямую на удаленном узле, сидя с клавиатурой около него.
Так как SSH работает по системе «клиент-сервер», обязательное условие для работы этого протокола — наличие на удаленном узле демона SSH. Демон SSH — это ПО, которое прослушивает определенный сетевой порт и при прохождении аутентификации другим узлом создает необходимую среду для работы с ним.
В свою очередь на локальной машине должно быть установлено соответствующее ПО — SSH-клиент. Он взаимодействует с удаленным хостом и передает ему необходимые данные, которые нужны для прохождения аутентификации.
Структура ключа
Можно сказать, что определение "SSH-ключ" составное, так как на самом деле это два ключа — открытый и закрытый. На узле A создаются и хранятся оба ключа, а на узел B передается только копия публичного SSH-ключа, что позволяет подключаться к узлу B с узла A.
Ключи могут быть сгенерированы с помощью различных алгоритмов, которые поддерживает текущая версия протокола SSH. Например, если использован тип шифрования RSA, то файлы будут именоваться следующим образом:
- id_rsa— закрытый ключ,
- id_rsa.pub— публичный (открытый) ключ.
В чем же разница открытого и закрытого ключа?
Открытые и закрытые SSH-ключи
Открытый (он же публичный) ключ используется для шифрования данных при обращении к удаленному узлу. Проще говоря, это набор символов, при помощи которых мы шифруем информацию. Он доступен всем. Не стоит бояться того, что открытый ключ может попасть в чужие руки, так как наличие одного лишь публичного SSH-ключа не дает злоумышленнику никаких преимуществ. Открытый SSH-ключ хранится на удаленном узле.
Закрытый (приватный) SSH-ключ — это ключ к данным. Он расшиф ровывает сами сообщения. Хранится он на устройстве, которое будет подключаться к удаленному узлу (на котором находится открытый ключ). Приватный ключ ни в коем случае нельзя передавать в чужие руки, в том числе через мессенджеры или файлообменники, во избежание утечки информации и персональных данных. Также рекомендуем сразу установить пароль на закрытый ключ, чтобы обеспечить ему дополнительную защиту.
Как работает SSH-авторизация?
Давайте представим, что Selectel — это сервер, а вы — клиент. Вы хотите подключиться к нам с использованием SSH-ключа. Предварительно вы уже создали пару ключей и передали публичный ключ нам. Алгоритм взаимодействия будет следующим:
- Вы должны изъявить свое желание подключиться к нам, то есть отправить запрос на подключение по TCP-порту.
- В случае установки TCP-соединения мы бмениваемся информацией о версиях наших  SSH-протоколов. С помощью этой информации можно по нять, какую именно конфигурацию (версию протоколов и алгоритмы работы) использовать. Самостоятельно узнать версию OpenSSH можно с помощью команды ssh -V.
- После согласования мы (сервер) направляем вам (клиенту) открытый ключ. Теперь уже вы решаете, доверять такому ключу или нет. В случае положительного ответа мы с вами генерируем сеансовый ключ, который будет использоваться для симметричного шифрования канала. Этот ключ существует, только пока существует канал (текущая сессия).
- Теперь следует аутентифицировать вас. Для этого вы отсылаете нам свой открытый ключ. Мы в свою очередь проверяем его со своим списком открытых SSH-ключей. Если совпадение найдено, мы генерируем случайное число, шифруем его открытым ключом и отправляем обратно. Вы как клиент расшифровываете сообщение закрытым ключом и отправляете полученные данные нам. В случае совпадения присланного числа с первоначальным аутентификация признается успешной.

Поздравляем! Теперь вам открыт доступ на сервер.
Создание SSH-ключа
Параметры утилиты ssh-keygen
В Linux для создания SSH-ключей используется команда ssh-keygen. Далее приведены наиболее популярные параметры для этой команды и их описание.
По умолчанию ssh-keygen использует в качестве параметра -t именно RSA, так как этот алгоритм обеспечивает наилучшую совместимость из всех, но требует большего размера ключа для обеспечения достаточной безопасности. Длина ключа по умолчанию составляет 3072 бит, но вы можете самостоятельно задать его размер от 1024 до 16384 бит с помощью опции -b команды ssh-keygen.
-C comment
Создание нового комментария. Например, одной из самых известных команд является до бавление комментария с информацией о том, кто, на какой машине и когда создал ключ:
ssh-keygen -C "$(whoami)@$(uname -n)-$(date -I)"
-p
Если указать данный параметр при вводе ssh-keygen, то вам будет предложено изменить старую секретную фразу на новую. Ввод команды будет выглядеть следующим образом:
ssh-keygen -p
Также вы можете задать все параметры для изменения секретной фразы сразу:
ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
-t type
Задает тип создаваемого ключа. Чтобы узнать какие типы доступны для вашей версии, введите:
ssh-keygen -t ?
-v
Подробный режим. ssh-keygen будет печатать отладочные сообщения о ходе выполнения. Несколько опций -v увеличивают степень подробности информации (максимум 3).
Утилиты для создания SSH-к люча
Далее мы создадим RSA ключ, добавим публичную часть на ВМ и подключимся с помощь него по SSH к ВМ. Сделаем это тремя способами:
- С помощью терминала и утилит Linux.
- С помощью утилит, предоставляемых PuTTY;
- С помощью SSH-агента PowerShell;
Генерация SSH-ключей в Linux
Процесс создания SSH-ключей на базе Linux предельно прост. Вам необходимо лишь указать некоторые параметры, которые мы опишем далее.
Мы будем создавать ключ RSA. При вводе команды ssh-keygen опцию -t RSA можно не указывать явно, так как RSA является алгоритмом по умолчанию.
ssh-keygen
Generating public/private RSA key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
В последней строке вам предлагается выбрать путь, куда будут сохранены ключи. Если оставить поле пустым, будут созданы файлы с именами id_rsa.pub и id_rsa.
Enter passphrase (empty for no passphrase):
В данной строке предлагается создать кодовую фразу. Оставив строку пустой, дополнительной защиты не будет.
С одной стороны, не вводить кодовую фразу опасно. Если закрытый ключ попадет в руки злоумышленников, то у них может появиться доступ к серверу. В то же время, если вы введете кодовую фразу, в будущем это может доставить вам неудобства. Пароль придется вводить каждый раз при использовании SSH-подключения с этим ключом. Поэтому использование кодовой фразы остается на ваше усмотрение.
Как мы упоминали ранее, кодовую фразу можно будет установить (или заменить) самостоятельно, введя ssh-keygen -p, когда ключ уже будет создан:

Созданные файлы хранятся в директории /home/<имя пользователя>/.ssh/.
Посмотреть публичный ключ текущего пользователя можно с помощью команды:
cat ~/.ssh/id_rsa.pub

Генерация SSH-ключей в PuTTY
Если вы хотите создать SSH-ключи на базе ОС Windows, самым популярным решением для этого будет использование программного обеспечения Putty. Скачать его можно с официального сайта по ссылке (актуальная версия на момент написания материала — 0.79, released on 2023-08-26). После установки программы вам будет доступно несколько .exe файлов.
Для создания SSH-ключей откройте puttygen.exe:

Выберите необходимый тип ключа и задайте его размер. Мы будем использовать RSA с длиной 2048:

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

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

Для публичного используйте имя id_rsa.pub. Для приватного id_rsa.ppk.
Putty сохраняет закрытые ключи с разрешением .ppk, что означает, что такой ключ можно будет использовать только с Putty. Чтобы сохранить секретный ключ в формате, пригодном для OpenSSH, нужно во вкладке Конвертация выбрать пункт "Экспортировать ключ в формате OpenSSH (новый формат)" и указать расположение нового файла (старый формат при конвертации из .pkk в OpenSSH сохраняет не все поля — например, комментарий):

Посмотреть публичный ключ можно в окне PuTTY Key Generator. Скопировать можно через правую кнопку мыши, вызывав тем самым контекстное меню:


Генерация SSH-ключей в Windows с помощью OpenSSH
Не так давно в ОС Windows добавили возможность использования инструментов OpenSSH. Пакет добавлен в ОС, начиная с Windows 10 и Windows Server 2019.
Установить клиент OpenSSH можно с помощью следующей команды в PowerShell (PowerShell нужно запустить от имени администратора):
Add-WindowsCapability -Online -Name OpenSSH.Client


Проверить статус компонента можно командой (также от администратора):
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'

Если в ответе команды статус Installed, то загрузка выполнена успешно.
Генерация SSH-ключей происходит таким же образом, как и в ОС Linux, с помощью ssh-keygen (команды нужно выполнять от имени пользователя):

Созданные ключи можно найти в папке C:\Users\<имя пользователя>\.ssh, если она не была изменена при генерации. Посмотреть ключ можно с помощью команды cat:

Копирование открытого ключа на сервер
Linux
Данный метод подойдет тем, чья ОС поддерживает команду SSH-Copy-ID, и удаленный сервер имеет доступ по SSH без ключа. Если это не так, попробуйте использовать второй или третий способ.
Синтаксис команды выглядит следующим образом:
ssh-copy-id {USERNAME}@{IP-ADDRESS-OR-FQDN} -p {PORT}
Замените {IP-ADDRESS-OR-FQDN} на IP-адрес или полное доменное имя (полное доменное имя) сервера, на которое вы хотите скопировать открытый ключ, {USERNAME} - имя пользователя, к которому хотите подключиться, {PORT} - порт SSH (по умолчанию 22).
Обратите внимание на последние строки вывода:

Наш клиент запрашивает разрешение на продолжение подключения к удаленному узлу, так как встречает его впервые. Необходимо ввести yes. После успешного подключения ключи будут добавлены и мы увидим приглашение к вводу пароля. Вводим пароль и получаем подтверждение о том, что теперь мы можем подключиться к удаленному узлу Linux с помощью команды ssh:

Чтобы проверить, действительно ли скопировался открытый ключ, найдем искомый файл authorized_keys на удаленном узле и посмотрим его содержимое, так как именно в него добавляются открытые SSH-ключи. Содержится он в домашней директории в скрытой папке .ssh. Посмотреть его можно так:
cat ~/.ssh/authorized_keys

PuTTY
Альтернативный способ показан в статье. В нем используется только
putty.exeбез Pageant.
Скопируйте публичный ключ, который отображается в puttygen.exe:

Затем следует любым доступным вам способом подключиться к удаленному серверу, куда необходимо скопировать открытый SSH-ключ.
В домашней директории создайте файл putty_id_rsa.pub. Сделать это можно с помощью редактора Nano:
nano putty_id_rsa.pub
Далее вставьте содержимое из буфера обмена с помощью нажатия правой клавишы мыши в окне или с помощь комбинации клавиш shift+insert:

Сохраните содержимое с помощью комбинаций ctrl+x. Подтвердите, что вы хотите сохранить содержимое из буфера на диск нажав на клавишу y:

Далее подтвердите с помощью клавиши enter путь сохранения:

Затем требуется добавить наш публичный ключ в authorized_keys.
cat putty_id_rsa.pub >> ~/.ssh/authorized_keys
С помощью cat ~/.ssh/authorized_keys проверьте, что ключ был действительно добавлен в authorized_keys:

Мы уже скопировали открытый SSH-ключ, сгенерированный с помощью Putty, на удаленный узел. Теперь необходимо произвести подключение.
Для этого откройте Pageant и добавьте туда приватный ключ, сгенерированный с помощью puttygen.exe:

Pageant по умолчанию после запуска прячется в значках панели управления рядом с часами:

Вызовите контекстное меню с помощью правой кнопки мышки и выберите пункт "Add key":

Откройте ключ в формате .ppk:

Чтобы убедиться, что ключ был добавлен, необходимо в том же контекстном меню Pageant выбрать пункт "View Keys":

Откроется окно с активным ключами:

Теперь можно установить сессию, которая будет для подключения использовать наш приватный ключ. В контекстном Pageant меню выберите "New Session":

Введите IP-адрес удаленного узла, имя пользователя и порт для подключения, а также проверьте, что в качестве типа подключения выбран SSH:

Нажмите "Open". При первом подключении вам потребуется подтвердить, что удаленный узел вам известен и его можно добавить в известные:

При успешном подключении появится приглашение к вводу команд:

PowerShell
Материал основан на статье Windows 10 OpenSSH Equivalent of ssh-copy-id | Christopher Hart.
Альтернативный поход смотрите в статье.
Далее мы используем приведенную ниже онлайн-команду PowerShell, чтобы скопировать содержимое открытого ключа id_rsa.pub на удаленное устройство Linux. Замените {IP-ADDRESS-OR-FQDN} на IP-адрес или полное доменное имя (полное доменное имя) сервера, на которое вы хотите скопировать открытый ключ, {USERNAME} - имя пользователя, к которому хотите подключиться, {PORT} - порт SSH (по умолчанию 22):
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh {USERNAME}@{IP-ADDRESS-OR-FQDN} -p {PORT} "cat >> .ssh/authorized_keys"
Далее у вас спр осят пароль от пользователя. Пример того, как выполняется копирование ключа:

Убедитесь, что вы можете подключиться по SSH к удаленному устройству Linux с помощью команды ssh. Ниже показан пример подключения к удаленному устройству Linux по IP-адресу. Обратите внимание, что нам не нужно было вводить пароль, чтобы установить SSH-подключение к удаленному устройству Linux:

Устранение неполадок
Возможные неполадки и способы их решения представлены в статье Авторизация на базе ключей SSH | Академия Selectel.