Безопасный удаленный доступ в Linux с помощью SSH

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

Введение

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

Вы начнете с настройки Docker-контейнера для имитации среды удаленного сервера, что сделает лабораторную работу более реалистичной. Затем вы установите клиент OpenSSH на свою хост-машину и сгенерируете новую пару ключей RSA с помощью утилиты ssh-keygen. Далее вы настроите Docker-сервер для принятия этого ключа для аутентификации, установив безопасное соединение без пароля между вашим хостом и контейнеризованным сервером. Наконец, вы попрактикуетесь в использовании команды scp для безопасной передачи файлов и команды ssh -L для перенаправления локального порта на удаленный сервис, эффективно создавая безопасный туннель.

Настройка SSH-сервера Docker и генерация пары ключей

На этом этапе вы настроите Docker-контейнер для имитации удаленного SSH-сервера и сгенерируете безопасную пару ключей на вашей хост-машине. Такой подход обеспечивает более реалистичную среду, разделяя клиент (ваш хост) и сервер (Docker-контейнер).

Поскольку Docker и клиент OpenSSH уже установлены в этой среде, вы можете перейти непосредственно к настройке сервера.

Сначала убедитесь, что служба Docker запущена:

sudo systemctl start docker
sudo systemctl enable docker

Теперь давайте создадим Docker-контейнер, который будет выступать в роли нашего SSH-сервера. Мы будем использовать Ubuntu в качестве базового образа и настроим его с возможностями SSH-сервера. Создайте Dockerfile:

cat > Dockerfile << 'EOF'
FROM ubuntu:22.04

## Установка OpenSSH сервера и других утилит
RUN apt-get update && \
    apt-get install -y openssh-server nginx sudo && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

## Создание пользователя для SSH-доступа
RUN useradd -m -s /bin/bash sshuser && \
    echo 'sshuser:password123' | chpasswd && \
    usermod -aG sudo sshuser

## Настройка SSH
RUN mkdir /var/run/sshd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config

## Создание директории .ssh для пользователя
RUN mkdir -p /home/sshuser/.ssh && \
    chown sshuser:sshuser /home/sshuser/.ssh && \
    chmod 700 /home/sshuser/.ssh

## Экспорт SSH порта
EXPOSE 22 80

## Запуск SSH службы
CMD ["/usr/sbin/sshd", "-D"]
EOF

Соберите образ Docker:

sudo docker build -t ssh-server .

Запустите Docker-контейнер, сопоставив порт 2222 на вашем хосте с портом 22 в контейнере:

sudo docker run -d --name ssh-lab-server -p 2222:22 -p 8080:80 ssh-server

Проверьте, что контейнер запущен:

sudo docker ps

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

CONTAINER ID   IMAGE        COMMAND               CREATED         STATUS         PORTS                                        NAMES
...            ssh-server   "/usr/sbin/sshd -D"   ...             Up ...         0.0.0.0:2222->22/tcp, 0.0.0.0:8080->80/tcp   ssh-lab-server

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

Мы будем использовать команду ssh-keygen для создания новой пары ключей. Мы укажем тип ключа как rsa и размер ключа как 2048 бит для надежной безопасности. Флаг -f позволяет нам указать имя файла для наших ключей, что помогает в их организации. Мы назовем наш ключ ~/.ssh/id_rsa_lab_ssh.

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

ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_lab_ssh

Команда сгенерирует пару ключей и покажет, где сохранены файлы.

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/labex/.ssh/id_rsa_lab_ssh
Your public key has been saved in /home/labex/.ssh/id_rsa_lab_ssh.pub
The key fingerprint is:
SHA256:... labex@...
The key's randomart image is:
+---[RSA 2048]----+
|        .o*+..   |
|       . =.o. .  |
|      . o o. .   |
|       o .  .    |
|      . S        |
|     . . .       |
|      o .        |
|     o .         |
|    E .          |
+----[SHA256]-----+

Чтобы убедиться, что файлы ключей были созданы, вы можете вывести содержимое директории ~/.ssh. Вы должны увидеть ваш новый приватный ключ (id_rsa_lab_ssh) и публичный ключ (id_rsa_lab_ssh.pub).

ls -l ~/.ssh/id_rsa_lab_ssh*

Вывод будет похож на этот, показывая два новых файла:

-rw------- 1 labex labex 1876 ... /home/labex/.ssh/id_rsa_lab_ssh
-rw-r--r-- 1 labex labex  401 ... /home/labex/.ssh/id_rsa_lab_ssh.pub

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

Настройка и тестирование аутентификации по SSH-ключам

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

Чтобы SSH-сервер мог аутентифицировать вас с помощью вашего ключа, ваш публичный ключ должен быть помещен в файл ~/.ssh/authorized_keys на сервере. Поскольку наш сервер работает в Docker-контейнере, нам нужно скопировать публичный ключ с вашей хост-машины в контейнер.

Сначала скопируйте ваш публичный ключ в Docker-контейнер с помощью команды docker cp:

sudo docker cp ~/.ssh/id_rsa_lab_ssh.pub ssh-lab-server:/home/sshuser/.ssh/authorized_keys

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

sudo docker exec ssh-lab-server chown sshuser:sshuser /home/sshuser/.ssh/authorized_keys
sudo docker exec ssh-lab-server chmod 600 /home/sshuser/.ssh/authorized_keys

После добавления публичного ключа и установки прав доступа вы готовы протестировать аутентификацию по ключам. Вы попытаетесь подключиться по SSH к Docker-контейнеру, используя порт 2222 (который мы сопоставили с портом 22 контейнера) от имени пользователя sshuser, указав приватный ключ, который вы создали.

Используйте команду ssh с флагом -i для указания файла вашего приватного ключа и -p для указания порта:

ssh -i ~/.ssh/id_rsa_lab_ssh -p 2222 sshuser@localhost

Поскольку вы впервые подключаетесь к новому хосту, вас могут попросить подтвердить подлинность хоста. Введите yes и нажмите Enter.

The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:....
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.

Если все настроено правильно, вы будете немедленно авторизованы без запроса пароля. Вы увидите приветственное сообщение, и ваш командный процессор изменится, показывая, что вы находитесь внутри Docker-контейнера:

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-88-generic x86_64)
...
sshuser@containerid:~$

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

exit

Успешный вход без пароля подтверждает, что ваша аутентификация по ключам работает корректно между вашим хостом и Docker-контейнером. Этот метод значительно безопаснее традиционной аутентификации по паролю.

Безопасная передача файлов с помощью scp

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

Сначала давайте создадим пример файла в вашем текущем рабочем каталоге, ~/project, который мы можем использовать для передачи. Мы назовем его source_file.txt.

echo "This is a test file for scp." > source_file.txt

Вы можете убедиться, что файл был создан, перечислив его:

ls -l source_file.txt

Вывод должен показать ваш только что созданный файл:

-rw-r--r-- 1 labex labex 29 ... source_file.txt

Теперь вы будете использовать scp для копирования source_file.txt в каталог /tmp на Docker-контейнере, демонстрируя безопасную передачу файлов на удаленный сервер. Базовый синтаксис для scp выглядит так: scp -i [private_key] -P [port] [source_file] [user]@[host]:[destination_path].

Вы будете использовать флаг -i для указания вашего приватного ключа, -P для указания порта 2222 (SSH-порт нашего Docker-контейнера) и передадите файл в учетную запись sshuser на контейнере:

scp -i ~/.ssh/id_rsa_lab_ssh -P 2222 source_file.txt sshuser@localhost:/tmp/destination_file.txt

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

source_file.txt                                   100%   29     6.7KB/s   00:00

Чтобы убедиться, что файл был успешно скопирован, подключитесь к Docker-контейнеру и перечислите файл назначения:

sudo docker exec ssh-lab-server ls -l /tmp/destination_file.txt

Вывод подтвердит существование и детали скопированного файла:

-rw-r--r-- 1 sshuser sshuser 29 ... /tmp/destination_file.txt

Вы также можете проверить, были ли корректно переданы содержимое файла:

sudo docker exec ssh-lab-server cat /tmp/destination_file.txt

Это должно отобразить:

This is a test file for scp.

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

Создание SSH-туннеля для перенаправления портов с помощью ssh -L

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

Чтобы продемонстрировать это, нам нужен сервис, работающий на порту, к которому мы можем подключиться. К счастью, в нашем Docker-контейнере уже установлен и настроен Nginx. Нам нужно запустить службу Nginx внутри контейнера.

Сначала запустите службу Nginx внутри Docker-контейнера:

sudo docker exec ssh-lab-server service nginx start

Вы можете убедиться, что Nginx работает корректно внутри контейнера:

sudo docker exec ssh-lab-server service nginx status

Вывод должен показать, что служба запущена:

 * nginx is running

Теперь давайте создадим SSH-туннель. Мы будем использовать команду ssh с флагом -L, который означает локальное перенаправление портов. Синтаксис выглядит так: ssh -L [LOCAL_PORT]:[DESTINATION_HOST]:[DESTINATION_PORT] [USER]@[SERVER].

Мы будем перенаправлять трафик с порта 9090 на нашем локальном компьютере на порт 80 внутри Docker-контейнера. Флаг -N указывает SSH не выполнять удаленную команду, что идеально подходит для простого перенаправления портов. Обратите внимание, что мы используем порт 2222 для подключения к службе SSH нашего Docker-контейнера.

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

ssh -i ~/.ssh/id_rsa_lab_ssh -N -L 9090:localhost:80 -p 2222 sshuser@localhost

Теперь откройте новый терминал, нажав значок + на панели вкладок терминала. В этом новом терминале вы можете протестировать туннель с помощью curl. Обращаясь к localhost:9090, ваш запрос будет безопасно туннелирован через SSH на порт 80 внутри Docker-контейнера.

curl http://localhost:9090

Вы должны увидеть HTML-содержимое страницы приветствия Nginx по умолчанию, что подтверждает работу туннеля.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Вы успешно создали безопасный туннель, который перенаправляет трафик с вашей хост-машины на службу, работающую внутри Docker-контейнера. Чтобы закрыть соединение, вернитесь в первый терминал (тот, где выполняется команда ssh) и нажмите Ctrl+C. Затем вы можете закрыть второй терминал.

Резюме

В этой лабораторной работе вы освоили основные навыки обеспечения безопасного удаленного доступа в системе Linux с использованием протокола Secure Shell (SSH). Ключевые цели включали настройку и тестирование аутентификации по ключам, безопасную передачу файлов с помощью scp и создание SSH-туннеля для перенаправления портов.

Вы начали с подготовки среды, которая включала обновление списка пакетов системы и установку пакетов openssh-server и openssh-client. После проверки активности службы SSH вы сгенерировали безопасную пару ключей RSA длиной 2048 бит с помощью команды ssh-keygen. Этот основополагающий шаг создал открытый и закрытый ключи, необходимые для установления безопасных соединений без пароля на последующих этапах.