Лабораторная работа №3

 

Цель работы

Изучение и практическое применение шифрованной файловой системы LUKS и протокола удалённого управления ОС SSH.

 

Подготовительная часть

Для подготовки к лабораторной работе необходимо:

         иметь представления о принципах сетевого взаимодействия, стеке протоколов TCP/IP и маршрутизации в IP-сетях;

         иметь представления о принципах работы ассиметричной криптографии;

         иметь навыки работы в UNIX-подобных системах;

         изучить руководства к утилитам (команда man), а также представленные в списке литературы.

 

Теоретическая часть

Протокол SSH

SSH (англ. Secure SHell — «безопасная оболочка») — сетевой протокол сеансового уровня, позволяющий производить удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Схож по функциональности с протоколами Telnet и rlogin, но, в отличие от них, шифрует весь трафик, включая и передаваемые пароли. SSH допускает выбор различных алгоритмов шифрования. SSH-клиенты и SSH-серверы доступны для большинства сетевых операционных систем.

SSH-сервер обычно работает на TCP-порту 22. Спецификация протокола SSH версии 2 содержится в RFC 4251. Для аутентификации сервера в SSH используется протокол аутентификации сторон на основе алгоритмов электронно-цифровой подписи RSA или DSA. Для аутентификации клиента также может использоваться ЭЦП RSA или DSA, но допускается также аутентификация при помощи пароля (режим обратной совместимости с Telnet) и даже IP-адреса хоста (режим обратной совместимости с rlogin). Аутентификация по паролю наиболее распространена; она безопасна, так как пароль передается по зашифрованному виртуальному каналу. Аутентификация по IP-адресу небезопасна, эту возможность чаще всего отключают. Для создания общего секрета (сеансового ключа) используется алгоритм Диффи-Хеллмана (DH). Для шифрования передаваемых данных используется симметричное шифрование, алгоритмы AES, Blowfish или 3DES. Целостность переданных данных проверяется с помощью CRC32 в SSH версии 1 или HMAC-SHA1/HMAC-MD5 в SSH версии 2.

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

 

Рассмотрим базовые компоненты, входящие в состав наиболее распространённой реализации протокола SSH — OpenSSH:

         ssh — клиент протокола SSH;

         sshd — сервер, предоставляющий защищённый доступ к ресурсам по протоколу SSH;

         scp — программа для удаленного копирования файлов по протоколу SCP (Secure Copy), который в качестве транспорта использует SSH;

  sftp — FTP-подобный клиент, использующий протокол SFTP (SSH File Transfer Protocol), пришедший на замену устаревшему протоколу SCP;

         sftp-server — серверная часть подсистемы SFTP, которая обладает большими возможностями, чем встроенная в sshd;

         ssh-keygen — генератор пар ключей;

         ssh-copy-id — вспомогательная утилита, которая упрощает копирование открытого ключа на удалённые хосты;

         ssh-agent — вспомогательная утилита, которая поддерживает кэш закрытых ключей. Кэширование позволяет избежать частого ввода пароля для расшифровки ключей перед их использованием;

         ssh-add — вспомогательная утилита, которая добавляет ключи в кэш ssh-agent.

 

В простейшем случае клиент протокола SSH запускается следующей командой:

ssh [-p порт] [-l пользователь] [пользователь@]хост [команда]

Пользователю предлагается ввести “yes” только при первом подключении. Дальнейшие попытки входа предваряются проверкой сохраненного ключа сервера. SSH клиент сообщит вам, если сохраненный ключ будет отличаться от только что полученного. Ключи серверов сохраняются в ~/.ssh/known_hosts.

 

Аутентификация пользователя по паролю

При данном типе аутентификации, настроек сервера sshd и клиента ssh по умолчанию вполне достаточно. При аутентификации сначала производится обмен ключами между сервером и клиентом и хэш пароля передается серверу в зашифрованном виде. Далее производится обмен данными.

 

Аутентификация пользователя по его открытому ключу

Данный тип аутентификации более безопасен, к тому же может избавить от ввода пароля при подключении к серверу. Аутентификация по открытому ключу основана на криптоалгоритмах DSA или RSA и сводится к проверке соответствия открытого ключа, хранимого на сервере, закрытому ключу, который хранится у клиента.

Генерация пары ключей осуществляется утилитой ssh-keygen. Закрытый ключ сохраняется в ~/.ssh/id_dsa или ~/.ssh/id_rsa, а открытый в ~/.ssh/id_dsa.pub или ~/.ssh/id_rsa.pub (для криптосхем DSA и RSA соответственно). Для включения аутентификации по ключам открытый ключ должен быть помещен в файл ~/.ssh/authorized_keys на удаленном компьютере.

Рассмотрим практический пример настройки аутентификации по открытому ключу:

ssh-keygen -t rsa -b 2048

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

Для упрощения копирования открытого ключа на удалённые хосты существует вспомогательная утилита ssh-copy-id, которая в простейшем случае вызывается следующим образом:

ssh-copy-id [пользователь@]хост

При этом она подключается к удалённому хосту и добавляет открытый ключ ~/.ssh/id_rsa.pub в файл ~/.ssh/authorized_keys указанного пользователя.

 

Безопасное копирование

Копирование файлов между компьютерами по протоколу SSH осуществляется командой:

scp [-P порт] [[пользователь@]хост:]файл [[пользователь@]хост:]файл

Параметры, передаваемые scp, похожи на параметры cp, с файлом или файлами в качестве первого аргумента и приемником копирования во втором.

 

Туннелирование SSH

Протокол SSH позволяет создавать туннели для использования с любыми прикладными протоколами. Все данные, передаваемые по туннелям SSH, шифруются аналогично обычному обмену по этому протоколу. Таким образом, эту возможность можно использовать для обеспечения конфиденциальности информационного обмена по небезопасным протоколам, таким как SMTP, POP3, FTP и т.д.

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

OpenSSH имеет следующие параметры для туннелирования:

Также при туннелирования используются следующие параметры ssh:

         -N — означает использование в не-командном режиме, только для туннелирования. Без этого параметра ssh запустит обычную сессию;

         -f — указывает ssh продолжать работу после установления туннеля в фоновом режиме.

Шифрование файловой системы

Для прозрачного шифрования блочных устройств в Linux, начиная с версии ядра 2.6, используется подсистема dm-crypt. Данная подсистема создает виртуальное устройство, связанное с нижлежащим устройством. При записи в это виртуальное устройство данные на лету шифруются, и при чтении расшифровываются.

 

Управление осуществляется утилитой cryptsetup.

LUKS (The Linux Unified Key Setup) — стандарт, определяющий независимый от платформы формат шифрования блочных устройств и метод управления ключами.

 

LUKS обладает следующими особенностями:

 

Ниже приведен пример создания шифрованного раздела в файле-контейнере:

Для работы необходимо загрузить необходимые модули ядра ОС (модули dm-crypt и модуль ядра, реализующий шифрование AES):

modprobe -a dm-mod dm-crypt aes

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

dd if=/dev/urandom of=/tmp/crypt.dat bs=1M count=50

Связываем созданный файл с  «петлевым устройством» — специальным псевдоустройством, через которое проходят системные вызовы к файловой системе:

 losetup /dev/loop0 /tmp/crypt.dat

Первичное форматирование устройства (по умолчанию в качестве алгоритма шифрования используется AES):

cryptsetup luksFormat /dev/loop0

Подключение зашифрованного устройства:

cryptsetup luksOpen /dev/loop0 cryptme

Создание файловой системы Ext2:

 mkfs -t ext2 /dev/mapper/cryptme

Монтирование файловой системы (точка монтирования должна существовать до запуска команды):

        mount -t ext2 /dev/mapper/cryptme /mnt/crypto

Завершение работы с шифрованной ФС производится в обратном порядке.

Размонтирование файловой системы:

umount /mnt/crypto

Отключение зашифрованного устройства:

cryptsetup luksClose /dev/mapper/cryptme

Отключение петлевого устройства:

 losetup -d /dev/loop0

 

Рабочее задание

1. Изучение протокола SSH на примере OpenSSH.

1.1. Настройте OpenSSH для аутенфикации по открытому ключу. Для этого объединитесь в пары, сгенерируйте и обменяйтесь открытыми ключами при помощи команд, указанных выше. Проверьте работоспособность при помощи клиента ssh. Убедитесь в том, что трафик между компьютерами зашифрован при помощи tcpdump.

1.2. Передайте файл с одного компьютера на другой при помощи программы scp. С помощью сниффера tcpdump убедитесь, что файл не передаётся по сети в открытом виде.

1.3. Передайте файл с одного компьютера на другой при помощи sftp.

1.4. Настройте туннелирование трафика по протоколу SSH.

2. Шифрование файловой системы:

2.1. Создайте шифрованную файловую систему в произвольном файле.

2.2. Скопируйте в созданную ФС несколько текстовых файлов.

2.3. Отключите шифрованную ФС. Просмотрите содержимое файла, содержащего шифрованную ФС и убедитесь, что данные не читаемы.

2.4. Подключите шифрованную ФС обратно.

 

Справочная информация

Блочное устройство (block device) — вид файла устройств в UNIX-подобных системах, обеспечивающий интерфейс к устройству, реальному или виртуальному, в виде файла в файловой системе.

 

mount <имя устройства> <точка монтирования> — монтирование ФС

umount <имя устройства> или umounts <точка монтирования>  — размонтирование ФС

mkfs –t <тип ФС> <имя устройства> или mkfs.<тип ФС> <имя устройства> — создание ФС  

dd — копирование и конвертация файлов. Основные параметры:

§  if=файл — читает данные из файла вместо стандартного ввода.

§  of=файл — пишет данные в файл вместо стандартного вывода.

§  bs=n — размер блока (в байтах, либо добавляется суффикс k и M для Кб и Мб соответственно)

§  count=n — сколько блоков скопировать.

 

lsmod — вывод используемых модулей ядра.

modprobe <имя модуля> — включение модуля ядра.

rmmod <имя модуля> — отключение модуля ядра.

losetup <петлевое устройство> <файл или устройство> — связывание файла или другое устройство (например, /dev/hdb1) с петлевым устройством /dev/loopX, где X = 0,1,2....).

 

Относительные пути:

В Unix-подобных системах возможно указывать следующие относительные пути:

./ — текущий каталог;

../  — каталог на уровень выше;

~/ — домашний каталог пользователя.

 

Системные файлы:

 

/proc/crypto — список доступных ядру криптографических алгоритмов.

/dev/random — специальное символьное псевдоустройство, предоставляющий интерфейс к генератору случайных чисел. Возвращает единичные случайные байты.

/dev/urandom — аналогично предыдущему, но работает быстрее  за счет меньшей стойкости к  криптографическим атакам.

/dev/zero  — псевдоустройство, возвращающее нулевые байты.

 

Примечание: В каталоге /proc обычно смонтирована виртуальная ФС procfs, позволяющая получить доступ к информации о системных процессах из ядра.