Статья Урок по SSH: азы использования и продвинутые трюки (часть первая)

Что такое и для чего нужен SSH

Безопасный шелл (SSH) — это сетевой протокол, обеспечивающий функции шелла на удалённой машине через безопасный канал. SSH несёт в себе различные улучшения безопасности, среди них аутентификация пользователя/хоста, шифрование данных и целостность данных, благодаря чему невозможны популярные атаки вроде подслушивания (eavesdropping), DNS/IP spoofing, подделка данных (data forgery), перехват соединения (connection hijacking) и т. д. Пользователям ftp, telnet или rlogin, которые используют протокол, передающий данные в виде открытого текста, крайне рекомендуется переключиться на SSH.

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

OpenSSH серверные/клиентские пакеты поставляются со следующими утилитами:
  • OpenSSH сервер: sshd (SSH daemon)
  • OpenSSH клиент: scp (безопасное удалённое копирование), sftp (безопасная передача файлов), slogin/ssh (безопасный удалённый вход), ssh-add (дополнение закрытого ключа), ssh-agent (агент аутентификации), ssh-keygen (управление ключами аутентификации).
Установка сервера и клиента OpenSSH на Linux

Если вы хотите установить сервер/клиент OpenSSH и настроить автоматический запуск сервера OpenSSH, следуйте следующим инструкциям, которые различаются в зависимости от дистрибутива.

Debian, Ubuntu или Linux Mint
Код:
$ sudo apt-get install openssh-server openssh-client
В системах основанных на Debian, сразу после установки, OpenSSH будет запускаться автоматически при загрузке. Если по каким либо причинам сервер OpenSSH не запускается автоматически при запуске системы, вы можете выполнить следущую команду для однозначного добавления ssh в загрузку при старте системы.
Код:
$ sudo update-rc.d ssh defaults
Fedora или CentOS/RHEL 7
Код:
$ sudo yum -y install openssh-server openssh-clients
$ sudo systemctl start sshd service
$ sudo systemctl enable sshd.service
CentOS/RHEL 6
Код:
$ sudo yum -y install openssh-server openssh-clients
$ sudo service sshd start
$ sudo chkconfig sshd on
Arch Linux
Код:
$ sudo pacman -Sy openssh
$ sudo systemctl start sshd service
$ sudo systemctl enable sshd.service
Настройка сервера OpenSSH

Если вы хотите настроить сервер OpenSSH, вы можете редактировать общесистемный файл конфигурации размещённый в /etc/ssh/sshd_config.

Есть пара опций OpenSSH, которые могут заинтересовать:
По умолчанию, sshd прослушивает порт 22 и ожидает входящие соединения ssh. Изменив порт по умолчанию для ssh, вы можете предотвратить различные автоматизированные атаки хакеров.
Если ваша машина имеет более чем один физический сетевой интерфейс, возможно вы заходите уточнить, какой из них связан с sshd, для этого вы можете использовать опцию ListenAddress. Эта опция помогает улучшить безопасность посредством ограничения входящих SSH только через особый интерфейс.
Код:
HostKey /etc/ssh/ssh_host_key
Оция HostKey определяет гда размещён персональный хост ключ.
Код:
PermitRootLogin no
Оция PermitRootLogin – может ли root входить в систему посредством ssh.
Код:
AllowUsers alice bob
Используя опцию AllowUsers вы можете выборочно отключить службу ssh для определённых пользователей Linux. Можно задать множество пользователей, разделяя их пробелами.

После того, как был изменён /etc/ssh/sshd_config, убедитесь, что перезапустили службу ssh.

Для перезапуска OpenSSH на Debian, Ubuntu или Linux Mint:
Код:
$ sudo /etc/init.d/ssh restart
Для перезапуска OpenSSH на Fedora, CentOS/RHEL 7 или Arch Linux:
Код:
$ sudo systemctl restart sshd.service
Для перезапуска OpenSSH на CentOS/RHEL 6:
Код:
$ sudo service sshd restart
Как подключиться к SSH

Подключение к SSH из Linux

Пользователям Linux не нужно устанавливать дополнительных программ.

Подключение к SSH из Windows

Для Windows многие рекомендуют и успешно пользуются PuTTY. Я ничего не имею против этой программы, но сам предпочитаю и рекомендую .

Cygwin – это не просто клиент SSH. Это мощный комбайн, в котором поддерживаются многие команды Linux. Например, в Cygwin очень легко создавать SSL-сертификаты (точно также, как и в Linux). В Windows для создания самоподписанных сертификатов нужно поплясать с бубном. В Cygwin очень удобно пользоваться cURL (не нужно ничего устанавливать отдельно) и т. д. Те, кому не хватает на Windows командной строки и программ Linux, в лице Cygwin найдут себе отдушину.

Установка Cygwin проста. Переходим на и скачиваем или версию.

Скачается крошечный файл — это установщик. Установщик графический. Хоть он и содержит большое количество опций, все они довольно простые и многие знакомы по другим графическим установщикам. Если что-то непонятно, просто нажимайте «Далее». Пожалуй, только следующее окно может привести в замешательство:

28789


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

Соединение SSH (общее для Linux и Windows)

Пользователи Linux открывают консоль, пользователи Windows печатают в Cygwin.

SSH нужна следующая информация для подключения:
  • IP или имя хоста
  • номер порта
  • имя пользователя
  • пароль пользователя
Два из этих параметров SSH может предположить: имя пользователя и номер порта. Если порт не указан, то предполагается порт по умолчанию. Если не указан пользователь, то используется то же имя, что и в системе, из которой происходит подключение. Например, адрес хоста для подключения 192.168.1.36. Если я наберу
Код:
ssh 192.168.1.36
Я вижу следующее
Код:
Alex@MiAl-PC ~
$ ssh 192.168.1.36
The authenticity of host '192.168.1.36 (192.168.1.36)' can't be established.
ECDSA key fingerprint is SHA256:sIxZeSuiivoEQ00RXAQHxylxuEA8SC5r/YPhL8wfp8s.
Are you sure you want to continue connecting (yes/no)?
Поскольку я подключаюсь к хосту первый раз, то это незнакомый хост. У меня спрашивают, хочу ли я продолжить. Я набираю yes:
Код:
Warning: Permanently added '192.168.1.36' (ECDSA) to the list of known hosts.
Alex@192.168.1.36's password:
Хорошо, хост 192.168.1.36 добавлен в список знакомых хостов. У меня запрашивается пароль для пользователя Alex. Поскольку на сервере с SSH нет такого пользователя, но я нажимаю Ctrl+C (для разрыва) и ввожу команду вместе с именем пользователя удалённой системы. Пользователь вводится перед адресом удалённой машины и отделяется от адреса символом @. Символ @ на английском читается как at и можно перевести как «в». Т.е. запись mial@192.168.1.36 можно истолковать как «пользователь mial в машине 192.168.1.36».
Код:
ssh mial@192.168.1.36
28790


Приглашение Alex@MiAl-PC сменилось приглашением mial@mint. Это означает, что мы уже на удалённой машине, т. е. у нас уже произошло соединение. Если нужно указать порт (если он отличается от стандартного), то порт нужно указывать после ключа -p. Например так:
Код:
ssh mial@192.168.1.36 -p 10456
После подключения нас встречает примерно такое приветствие:
Код:
Linux mint 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 16 15:32:25 2015 from 192.168.1.35
Из него следует, что удалённая машина — это Linux Mint, с ядром 3.16, 64-битная версия. Также важная информация о времени последнего входа и IP адресе с которого произошло соединение. Если время и IP вам незнакомы, а вы являетесь единственным пользователем, то ваша система скомпрометирована и нужно принимать соответствующие меры.

Наберём несколько команд, чтобы убедиться где мы и кто мы: pwd[/B], [B]uname -a и т. д.:

28791


Чтобы закончить сессию (отключиться), наберите
Код:
exit
Или нажмите Ctrl+D.

Вход в SSH без ввода пароля

Во-первых, это просто удобнее. Во-вторых, это безопаснее.

Во-первых, нам нужно создать rsa ключи. Если вы пользователь Linux, то у вас всё в порядке. Если вы пользователь Windows, но вы не послушали мой совет и выбрали PuTTY, то у вас проблема и думайте сами, как её решать. Если у вас Cygwin, то всё также в порядке.

Если вы успели залогиниться на удалённой системе, разлогинтесь. После этого наберите
Код:
ssh-keygen -t rsa
28792


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

Теперь на удалённой машине нам нужно создать каталог .ssh. Про выполнение команда на удалённой машине ещё будет рассказано ниже. Пока просто копируете команду, не забывая поменять IP адрес и имя пользователя на свои:
Код:
ssh mial@192.168.1.36 mkdir .ssh
Теперь нам нужно скопировать содержимое файла id_rsa.pub на удалённую машину. Сделать это очень просто (не забываем менять данные на свои):
Код:
cat .ssh/id_rsa.pub | ssh mial@192.168.1.36 'cat >> .ssh/authorized_keys'
28793


Теперь просто логинимся и больше никакой пароль у нас не спрашивают. И так теперь будет всегда.

Выполнение команд на удалённом сервере без создания сессии шелла

Кроме открытия сессии шелла на удалённой системе, ssh также позволяет выполнять отдельные команды на удалённой системе. Например, для выполнения команды tree на удалённом хосте с именем remote-sys и отображением результатов на локальной системе, нужно сделать так:
Код:
ssh remote-sys tree
Мой реальный пример:
Код:
ssh mial@192.168.1.36 tree
28794


Используя эту технику, можно делать интересные вещи, вроде такой, как выполнение команды ls на удалённой системе и перенаправление вывода в файл на локальной системе:
Код:
ssh remote-sys 'ls *' > dirlist.txt
Реальный пример:
Код:
ssh mial@192.168.1.36 'ls *' > dirlist.txt
cat dirlist.txt
28795


Обратите внимание на одиночные кавычки в вышеприведённой команде. Это сделано потому, что мы не хотим, чтобы раскрытие пути было выполнено на локальной машине; поскольку нам нужно это выполнение на удалённой системе. Также если мы хотим стандартный вывод перенаправить в файл на удалённой машине, мы можем поместить оператор редиректа и имя файла внутри одиночных кавычек:
Код:
ssh remote-sys 'ls * > dirlist.txt'
Передача стандартного вывода с локальной машины на удалённую по ssh

Не менее интересный вариант выполнения команд приведён немного выше:
Код:
cat .ssh/id_rsa.pub | ssh mial@192.168.1.36 'cat >> .ssh/authorized_keys'
  • Команда cat построчно считывает и отображает содержимое файла .ssh/id_rsa.pub, расположенного на локальной машине.
  • | (труба) передаёт то, что должно было бы появиться в стандартном выводе, другой команде.
  • Вместо команды, которая должна была бы обрабатывать передаваемые ей строки, происходит соединение к удалённой системе (ssh mial@192.168.1.36).
  • На удалённую систему приходят строки, для которых предусмотрена команда cat >> .ssh/authorized_keys. Т.е. содержимое стандартного вывода построчно записывается в файл .ssh/authorized_keys, находящийся на удалённой машине.
Открытие графической программы, расположенной на удалённом компьютере

Для следующего фокуса нужно два компьютера с системой Linux. К сожалению, даже Cygwin с этим трюком не справляется. Причём оба Linux'а должны быть с графическим пользовательским интерфейсом.

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

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

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

Пожалуй самая часто используемая из этих функций — это возможность транслировать трафик систем X Window. На системе с запущенным X сервером (это машины, которые имеют графический пользовательский интерфейс) возможно запустить программу X клиента (графическое приложение) на удалённой системе и видеть результаты её работы на локальной системе. Сделать это просто. Например, я хочу подключиться к удалённому хосту remote-sys и на нём я хочу запустить программу xload. При этом видеть графический вывод этой программы я смогу на локальном компьютере. Делается это так:
Код:
ssh -X remote-sys
xload
Реальный пример:
Код:
ssh -X mial@192.168.1.36
gedit
Т.е. SSH запускается с ключом -X. А затем просто запускается программа. Посмотрите на скриншот.

28796


Я нахожусь в Kali Linux. Я успешно логинюсь к удалённому компьютеру по SSH. После этого я запустил программу gedit. Этой программы, может быть, даже нет на Kali Linux, но она точно есть в Linux Mint, к которой я и подключился. Результат работы этой программы я могу видеть на экране так, будто бы программа запущена локально. Но, повторюсь, я хочу, чтобы вы это поняли, запущенной программы gedit на локальном компьютере нет. Если я захочу сохранить результат работы gedit (или любой другой программы, открытой таким образом), то окажется, что она работает в окружении удалённого компьютера, видит его файловую систему и т. д. Это удобно, когда вы хотите настроить удалённый компьютер используя графический интерфейс.

О том, как передать изображение со всего рабочего стола вы узнаете в этой же статье далее, в секции «Как настроить VNC через SSH».

На некоторых системах для этого «фокуса» нужно использовать опцию “-Y” вместо опции “-X”.

Копирование с/на удалённый компьютер (scp и sftp)

scp

Пакет OpenSSH также включает две программы, которые использует зашифрованный туннель SSH для копирования файлов по сети. Первая программа – scp(«безопасное копирование») – используется чаще, как и схожая с ней программа cp для копирования файлов. Наиболее заметная разница в том, что источником файла может быть удалённый хост после которого следует двоеточие и расположение файла. Например, если мы хотим скопировать документ, названный document.txt из нашей домашней директории на удалённую систему remote-sys в текущей рабочей директории на нашей локальной системе мы можем сделать так:
Код:
scp remote-sys:document.txt .
document.txt                                   100%  177     0.2KB/s   00:00
Реальный пример:
Код:
# удалим файл на локальной машине, если он есть
rm dirlist.txt
# создадим файл на удалённой машине
ssh mial@192.168.1.36 'ls * > dirlist.txt'
# проверим его наличие
ssh mial@192.168.1.36 'ls -l'
# скопируем его на локальную машину
scp mial@192.168.1.36:dirlist.txt .
# проверим его содержимое
cat dirlist.txt
28797


Для копирования файла с локальной машины на удалённую:
Код:
scp локальный_файл remote-sys:.
Реальный пример
Код:
# создаём новый файл
touch nfile.txt
# отправляем файл
scp nfile.txt mial@192.168.1.36:.
nfile.txt                                     100%    0     0.0KB/s   00:00
# проверяем наличие файла на удалённой машине
ssh mial@192.168.1.36 'ls -l'
В команде отправки:
  • nfile.txt — имя файла,
  • mial@192.168.1.36 — имя пользователя и удалённый хост,
  • . (точка) означает, что файл нужно скопировать в текущую рабочую директорию на удалённом сервере, при этом имя файла останется прежним, т. е. nfile.txt
Памятка:
Для копирования файла с B на A когда залогинены в B:
scp /path/to/file username@a:/path/to/destination
Копирование файла с B на A когда залогинены в A:
scp username@b:/path/to/file /path/to/destination
sftp

Вторая программа для копирования файлов через SSH — это sftp. Как следует из её имени, она является безопасным заменителем ftp программ. sftp работает как и оригинальная ftp программа. Тем не менее, вместо отправки чистым текстом она использует зашифрованный туннель SSH. Важным преимуществом sftp перед ftp является то, что для неё не требуется запущенный FTP сервер на удалённом хосте. Для неё требуется только SSH сервер. Это означает, что любая удалённая машина, которая подключена через SSH клиент может также быть использована как FTP-подобный сервер. Вот пример сессии:
Код:
Alex@MiAl-PC ~
$ sftp mial@192.168.1.36
Connected to 192.168.1.36.
sftp> ls
dirlist.txt                             newfile.txt
nfile.txt                               temp
Видео                              Документы
Загрузки                        Изображения
Музыка                            Общедоступные
Рабочий стол                 Шаблоны
sftp> lls
dirlist.txt  nfile.txt
sftp> ls temp
temp/TakeMeHome
sftp> cd temp/
sftp> get TakeMeHome
Fetching /home/mial/temp/TakeMeHome to TakeMeHome
sftp> bye
SFTP протокол поддерживается многими графическими файловыми менеджерами, которые можно найти в дистрибутивах Linux. Используя как Nautilus (GNOME), так и Konqueror (KDE), мы можем вводить URI (ссылки) начинающиеся на sftp:// в строку перехода и работать с файлами, расположенными на удалённой системе с запущенным SSH сервером.

Вторая часть здесь.
 

Сергей Попов

Кодебай
30.12.2015
4 727
6 721
BIT
444
niktrij
Четверг на 02:11 ДП
в /etc/ssh/sshd_config специально поставлено разрешение входа суперпользователя без пароля. Однако, на андроиде с запущенным Linux Deploy все равно никуда не входит и требует ввод пароля, подробности на скрине : https://ibb.co/f4q2Xm Что не так? Как проверить?
 
  • Нравится
Реакции: th3gn, removed и serge263
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!