SSH (Secure Shell)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:30, 20 июля 2016.

SSH (от англ. secure shell) - это набор программ, которые позволяют регистрироваться на компьютере по сети, удаленно выполнять на нем команды, а также копировать и перемещать файлы между компьютерами. SSH организует защищенное безопасное соединение поверх небезопасных каналов связи.

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

Основные функции SSH

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

  • Безопасные команды доступа к хосту. SSH дает возможность выполнять безопасные команды доступа к хосту, такие как ssh (удаленная оболочка), slogin (удаленный вход в систему), scp (удаленное копирование);
  • X11 Forwarding. SSH предоставляет встроенный механизм для выполнения удаленных клиентов X Window;
  • Port forwarding. SSH может выполнять переадресацию портов, передавая трафик c одного порта одной машины на другой порт другой машины. При этом передаваемый трафик шифруется;


Обеспечение безопасности SSH

Безопасность протокола достигается использованием нескольких решений, которые сводят к минимуму риск использования соединения:

  • Шифрование соединение, которое может выполняться одним из методов, выбранных в процессе переговоров. Шифрованное соединение не позволяет просто перехватить и использовать трафик. Выбор алгоритма шифрования делает систему более гибкой, позволяя не использовать алгоритмы, в которых обнаружены слабые места или которые не может поддерживать одна из сторон;
  • Аутентификация сервера выполняется при любом соединении. Это не позволяет выполнить подмену сервера или подмену трафика;
  • Аутентификация клиента может выполняться одним из нескольких доступных способов. Это с одной стороны может повысить надежность аутентификации, с другой - делает систему более гибкой и упрощает ее использование;
  • Проверка целостности пакетов позволяет отследить любые незаконные изменения в трафике соединения. При обнаружении таких изменений, соединение немедленно разрывается;
  • Временные параметры аутентификации не позволяют воспользоваться данными соединения в том, случае, если спустя некоторое время после перехвата оно все-таки было расшифровано. Устаревание обычно происходит через час;

Аутентификация сервера

Аутентификация сервера производится при помощи инфраструктуры открытых ключей. Клиент, который хочет установить соединение с сервером шифрует данные известным ему открытым ключом сервера и отправляет их серверу. Сервер должен расшифровать их при помощи известного только ему секретного ключа, и отправить их назад. Так клиент может быть уверен в том, является ли хост тем, за кого себя выдает.
Аутентификация сервера дает возможность не полагаться на службу имен и маршрутизацию пакетов. В том случае, если нарушителю удалось подменить запись в DNS или перенаправить IP-пакеты на свой хост, аутентификация не пройдет, поскольку хост не обладает необходимыми секретными ключами.
ssh защищает от:

  • Подмены IP-адресов (IP-spoofing), когда удаленный хост посылает пакеты от имени другого хоста;
  • Подмены DNS-записей (DNS-spoofing), когда изменяется запись на сервере DNS и в результате соединение устанавливается не с желаемым хостом, а с тем, на который указывает новая запись;
  • Перехвата открытых паролей и прочих данных, которые передаются в открытом виде и любой, кто имеет физический доступ к каналу, может их узнать.

Аутентификация клиента SSH

Методы аутентификации клиентов, которые использует SSH:

  • По хостам. Метод аналогичный используемому в r-командах. В том случае, если соединение устанавливается с привилегированного порта, и файл .rhosts позволяет вход в систему, он разрешается. Этот метод является потенциально небезопасным, рекомендуется не использовать его. Для повышения уровня своей безопасности метод может быть дополнен RSA-аутентификацией клиентского хоста.
  • Открытый ключ. Клиент отправляет серверу открытый ключ. Если сервер знает его, он просит клиента доказать, что тот знает и секретный ключ тоже. Если клиент может это доказать, значит аутентификация считается успешной.
  • Керберос. Аутентификация проводится по схеме v5 Kerberos.
  • Пароль. В самом крайнем случае, если не удалось провести аутентификацию не одним из перечисленных способов, используется традиционная аутентификация при помощи пароля. Принцип аутентификации аналогичен тому, какой, например, используется в Telnet с той разницей, что пароль передается по зашифрованному каналу.

Аутентификация в SSH с помощью открытых ключей

Создание и установка асимметричных ключей SSH

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

Секретные ключи хранятся в файлах identity, id_dsa и id_rsa в локальном каталоге ~/.ssh (разные файлы для разных алгоритмов шифрования). Открытые ключи должны быть в файлах authorized_keys и authorized_keys2 в каталоге ~/.ssh на удаленном компьютере, на котором производится регистрация. В качестве домашнего рассматривается каталог пользователя, под именем которого выполняется регистрация. Файл authorized_keys используется для хранения открытых ключей для SSH1, а в authorized_keys2 — для SSH2.
SSH дает возможность использования одного из трех различных алгоритмов асимметричного шифрования RSA или DSA.

Типы ключей

  • rsa1 -- Тип ключа RSA1, используемый в SSH версии 1
  • rsa -- Тип ключа RSA, используемый в SSH версии 2
  • dsa -- Тип ключа DSA, используемый в SSH версии 2


Для создания, преобразования и управления ключами аутентификации используется утилита ssh-keygen. Синтаксис программы: ssh-keygen -опции.
Программа генерирует пару открытый ключ - секретный ключ. При этом она спрашивает, в какие файлы нужно записать ключи. По умолчанию секретный ключ записывается в ~/.ssh/identity (или ~/.ssh/id_rsa, ~/.ssh/id_dsa), а открытый в ~/.ssh/identity.pub.
Сгенерированный секретный ключ защищается при помощи парольной фразы (passphrase), которую нужно обязательно знать, для того чтобы воспользоваться ключом. Секретная фраза вводится в момент генерирования ключей. Она может быть затем изменена, без повторного копирования ключей.
Можно сгенерировать секретные ключи, в которых парольная фраза будет отсутствовать. Хотя это и упрощает использование ключей, делать этого не рекомендуется, поскольку в этом случае файл с секретным ключом автоматически влечет за собой полный беспрепятственный доступ ко всем системам, где установлена его открытая пара.
Полученный открытый ключ нужно добавить в файлы authorized_keys удаленных хостов, к которым будет производится доступ.

$ cat ~/.ssh/identity.pub |  ssh user@host 'cat >> ~/.ssh/authorized_keys'
user@host's password:

Аналогично для второй версии SSH:

$ cat ~/.ssh/id_dsa.pub |  ssh user@host 'cat >> ~/.ssh/authorized_keys2'
user@host's password:

или воспользоваться утилитой ssh-copy-id

~/.ssh$ ssh-copy-id -i identity.pub user@host
user@host's password:

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

$ ssh user@host
Enter passphrase for key '/home/user/.ssh/id_rsa':

Некоторые опции командной строки программы ssh-keygen

  • -t тип -- Тип генерируемого ключа. Допустимые типы: rsa, rsa1 и dsa.
  • -p -- Изменить парольную фразу
  • -l -- Показать отпечаток (fingerprint) секретного ключа

Опции ключа в ~/.ssh/authorized_keys

Для каждого открытого ключа в файлах ~/.ssh/authorized_keys можно выставить опции, ограничивающие возможности клиента, аутентифицировавшегося по данному ключу. Опции находятся перед ключом.

  • from="список-шаблонов-через-запятую" - разрешает принимать соединения только с хостов, удовлетворяющих одному из шаблонов. В качестве шаблонов поддерживаются символы - ?, * и !
  • command="команда" - при аутентификации по данному ключу разрешается запускать только указанную команду, а не то что указано пользователем - например, "echo this key disabled" или "dump -params" и обязательно использовать опцию no-pty для бинарной передачи данных
  • no-port-forwarding - запретить port-forwarding
  • no-X11-forwarding - запретить X11
  • no-user-rc - Запрещает выполнение файла ~/.ssh/rc после аутентификации (в RHEL не работает)
  • environment="NAME=VALUE" - Принудительная установка переменных среды окружения. (в RHEL не работает)
  • no-agent-forwarding - запретить использование agent-forwarding
  • no-pty - запретить интерактивную оболочку
  • permitopen="host:port" - (ограничить переназначение локального порта: ssh -L)

Примеры

Первый - разрешается логин по ключу только с определенной подсети, за исключением хоста 192.168.1.2. Второй - при логине выполняется дамп домашнего каталога, для примера указано как выставлять несколько опций одновременно (через запятую).

from="192.168.1.0/24,!192.168.1.2" ssh-rsa AAAAB2...AA== only for my network except !192.168.1.2
command="dump /home",no-pty,no-port-forwarding ssh-rsa AAAAC3...BF== key-for-dump home

Ссылки

1.Help.ubuntu.ru
2.XGURU
3.Wikipedia