SSH

Материал из SoftTimeINFO
Перейти к: навигация, поиск

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

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

Содержание

[править] Linux

Для связи клиента с сервером по протоколу SSH используется клиент ssh и сервер sshd. Клиенты, как правило, доступны сразу после установки операционной системы, сервер необходимо устанавливать, настраивать и запускать.

[править] Установка

Так как подавляющее большинство серверов работает под управлением одной из UNIX-подобных операционных систем, дальнейшее изложение будет вестись на примере Linux системы, в частности на примере Ubuntu (Debian-ветвь Linux вообще очень популярна в качестве платформы для сервера). Как правило, ssh-сервер устанавливается в ходе установки операционной системы. Если сервер не установлен, то установить его можно при помощи команды

sudo apt-get install openssh-server

или помощи более общей команды

sudo apt-get install ssh

Если требуется получить доступ к удалённому серверу, и нет необходимости предоставлять доступ к текущему хосту, запуск сервера не требуется, достаточно воспользоваться консольной командой ssh. Однако, если текущий хост должен принимать соединения от удаленных ssh-клиентов, потребуется запустить SSH-сервер при помощи команды service

sudo service ssh start

Перезапуск сервера осуществляется при помощи команды

sudo service ssh restart

Перечитать конфигурационный файл сервера, можно при помощи команды

sudo service ssh reload

Остановка сервера осуществляется при помощи команды stop

sudo service ssh stop

[править] Клиент

[править] Обращение к удаленному серверу

Для того, чтобы обратиться к удаленному серверу, необходимо выполнить команду ssh, передав ему адрес удаленного хоста

ssh 192.168.0.1

При этом ssh будет использовать в качестве логина имя текущего пользователя. Так как имя текущего пользователя редко совпадает с именем пользователя из под которого необходимо осуществить вход на удаленный сервер, его часто указывают явно, отделяю от адреса символом @

ssh user@192.168.0.1

Если соединение с сервером осуществляется в первый раз, удаленный сервер может попросить подтверждение от пользователя, получив которое сохраняет адрес удаленного хоста в файле ~/.ssh/known_hosts. В следующий раз, обнаружив IP-адрес в этом файле, ssh-клиент сразу устанавливает соединение с сервером без дополнительных вопросов. Установив соединение и передав на сервер логин, клиенту предлагается ввести пароль (при вводе пароля, символы не отображаются в консоли). В качестве пароля используется системный пароль, назначенный при регистрации пользователя в операционной системе. Если пароль введен правильно, выводится приглашение командной строки удаленного сервера, все команды, которые будут выполняться в консоли будут выполнены на удаленном сервере.

Можно не устанавливать диалоговый сеанс, а просто передать команду для выполнения сразу после адреса, ниже приводится пример выполнения команды uptime

ssh user@192.168.0.1 uptime

Если команда содержит пробелы, то её следует заключить в кавычки

ssh user@192.168.0.1 "ls -la"

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

ssh -p 2222 user@192.168.0.1

[править] Псевдонимы

Как видно из предыдущего раздела, команда для связи с SSH-сервером может принимать довольно сложную форму, ввод которой каждый раз может быть утомителен. Ситуация еще более осложняется, когда требуется поддерживать связь с десятками SSH-серверов. Параметры соединения можно сохранить в файле config подкаталога .ssh в домашнем каталоге пользователя (в свежеустановленной системе файл ~/.ssh/config, как правило, не существует и требуется его самостоятельно создание).

Host node1
Hostname db00.test.dev
Port 2222
User root
Host node2
Hostname db01.test.dev
Port 2222
User root

В примере приведенном выше вводится два псевдонима node1 и node2 для серверов с доменными именами db00.test.dev и db01.test.dev, соответственно. При помощи помощи директив Host, Port и User можно задать адрес хоста, номер порта и имя пользователя, соответственно. Благодаря конфигурационному файлу ~/.ssh/config следующие сокращенные команды доступа на сервер

ssh node1
ssh node2

полностью эквивалентны

ssh -p 2222 root@db00.test.dev
ssh -p 2222 root@db01.test.dev

[править] Вход по ключу

Конфигурационный файл config позволяет задать большинство параметров, необходимых для доступа к удаленному серверу, за исключением пароля. Однако ряд, задач, особенного пакетных, выполняющихся в скриптах, требуют безопасного доступа, не прерываемого вводом внешних параметров. В этому случае прибегают к организации доступа по открытому ключу. Клиент заводит два ключа, открытый и закрытый, закрытый ключ помещается в домашнем каталоге ~/.ssh/id_rsa, а открытый (public) ключ id_rsa.pub размещается на сервере в конфигурационном файле ~/.ssh/authorized_keys в домашнем каталоге того, пользователя, из под чьего имени осуществляется вход на сервер.

Для генерации ключей служит команда

ssh-keygen -t rsa

После того, как ключи сгенерированы, открытый ключ id_rsa.pub переправляется на сервер и дописывается в конец файла authorized_keys

cat id_rsa.pub  >> ~/.ssh/authorized_keys

rsa не единственно возможный формат, параметр -t в команде ssh-keygen позволяет задать несколько типов шифрования: rsa, dsa или edcsa (последний не поддерживается старыми версиями SSH-клиентов).

[править] Обмен файлами

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

scp /path/to/source path/to/destination

Первый параметр задает источник из которого осуществляется копирование, второй — пункт назначения. Каждый из параметров может принимать путь к удаленному хосту, который строится по следующим правилам имя_пользователя@хост: путь_к_файлу. В примере ниже локальный файл id_rsa.pub загружается на сервер по адресу /home/user/.ssh/id_rsa.pub

scp id_rsa.pub user@192.168.0.1:/home/user/.ssh/id_rsa.pub

Если папка /home/user является домашним каталогом пользователя user на хосте 192.168.0.1, вместо абсолютного пути можно указать путь относительно домашнего каталога

scp id_rsa.pub user@192.168.0.1:.ssh/id_rsa.pub

Подставив сетевой путь в качестве первого параметра-источника, можно скачать файл с удаленной машина на локальную

scp user@192.168.0.1:.ssh/config config

Кроме того, утилита scp допускает передачу файла от одного удаленного хоста другому, без загрузки копии на хост управления (one и two — псевдонимы удаленных серверов, заданных в конфигурационном файле config)

scp one:.ssh/config two:.ssh/config

[править] Проброс порта

Пусть на удаленном сервере 192.168.0.1 сервере развернут сервер MySQL, доступ к которому можно получить только локально (127.0.0.1:3306), без возможности обратиться напрямую. SSH позволяет осуществить проброску порта или тунеля. На локальной машине назначается порт, например 3308, если клиент будет обращаться к этому порту, SSH будет перенаправлять все запросы на удаленный сервер и передавать запросы MySQL-серверу. Для осуществления проброса необходимо подвесить демон при помощи следующей команды

ssh -f -N -L 3308:127.0.0.1:3306 user@192.168.0.1

После этого, локальное обращение по 3308 порту будет перехвачено и передано на удаленный хост 192.168.0.1

mysql -u user -p -P 3308

[править] Массовое выполнение команд

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

ssh user@192.168.0.1 uptime

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

sudo apt-get install dsh

после этого выполнить команду на нескольких серверах можно, передавая адреса при помощи параметра -m

dsh -m user@192.168.0.1 -m user@192.168.0.2 -m user@192.168.0.3 uptime

Для того, чтобы каждый раз не писать цепочку адресов в параметре -m, их можно поместить в файл /etc/dsh/groups

user@192.168.0.1
user@192.168.0.2
user@192.168.0.3

После этого можно выполнить команду, используя сокращенный синтаксис

dsh groups uptime

Если в файле /etc/dsh/machines.list указать имя группы groups, то команду можно сократить до

dsh uptime

[править] Сервер

Операционная система содержит ряд вспомогательных пользователей, возможность аутентификации которым в системе не предоставляется (как правило, это пользователи из под которых работают сервера: www-data, mysql, redis и т. п.). Чтобы предотвратить вход в систему из под такого пользователя в качестве интерпретатора среды им назначается /bin/false (вместо /bin/sh или /bin/bash), а в качестве домашнего каталога /nonexistent. Посмотреть, какой интерпретanор назначен тому или иному пользователю, равно как и сам список пользователей можно в файле /etc/passwd

cat /etc/passwd

Результат может выглядеть следующим образом

...
user:x:1000:1000:user,,,:/home/user:/bin/bash
mysql:x:113:123:MySQL Server,,,:/nonexistent:/bin/false
...

Пользователь user имеет домашний каталог /home/user и в качестве интерпретатора bash, аутентифицироваться по SSH из под пользователя mysql уже не получится.

За настройку SSH-сервера несет ответственность конфигурационный файл /etc/ssh/sshd_config (его не следует путать с ssh_config, который лежит рядом и отвечает за SSH-клиент). После внесения изменений в конфигурационный файл, его необходимо перечитать (reload) или перезагрузить сервер (restart).

sudo service ssh reload

или

sudo service ssh restart

[править] Доступ по ключу

За аутентификацию по ключу несет ответственность следующая группа параметров конфигурационного файла /etc/ssh/sshd_config

...
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
...

Директива RSAAuthentication включает режим аутентификации по RSA-ключу (yes) или выключает (no), директива PubkeyAuthentication включает (yes) или выключает (no) возможность аутентификации по кллючу, директива AuthorizedKeysFile задает формат файла authorized_keys с открытыми ключами, по которым можно получить доступ к серверу (%h обозначает домашний каталог пользователя).

После того, как связь с сервером по ключу установлена можно отключить аутентификацию по паролю, чтобы злоумышленники в принципе не имели возможность подобрать пароль к серверу. Для этого следует выставить в no директивы PasswordAuthentication и PermitRootLogin

...
PasswordAuthentication no
PermitRootLogin no
PermitRootLogin without-password
...

[править] Смена порта

Стандартный порт 22, закрепленный за SSH широко известен, поэтому сразу после запуска сервера, порт подвергается атакам с целью подобрать пароль. Поэтому администраторы зачастую меняют порт, для этого директиве Port конфигурационного файла /etc/ssh/sshd_config передают новое значение.

Port 2222

Если необходимо, чтобы SSH-сервер прослушивал соединение сразу по двум или более портам, можно добавить несколько директив Port, упомянув все порты, которые должны прослушиваться SSH-сервером

Port 2222
Port 6789

[править] Windows

[править] Клиент PuTTY

Для доступа к SSH-серверу в операционной системе Windows используется утилита PuTTY. Поле HostName (or IP address) позволяет задать адрес сервера, Port — порт. Параметры доступа при необходимости могут быть сохранены в список сессий (Saved Sessions), в последующие сеансы, они могут быть извлечены кнопкой Load. Установка сеанса осуществляется после нажатия на кнопку Open, в результате чего открывается консоль и предлагается ввести логин пользователя. После проверки логина, предлагается ввести пароль (при вводе пароля, символы не отображаются в консоли). В случае успешной аутентификации открывается консоль удаленного сервера.

Как и в случае Linux-утилиты ssh при установки соединения с сервером первый раз, предлагается подтвердить адрес сервера дополнительно при помощи диалогового окна.

[править] Обмен файлами

Также как и в случае Linux, имеется возможность обмениваться файлами с удаленным сервером по протоколу SSH. Можно воспользоваться консольной утилитой pscp, порядок которой описывается в разделе Обмен файлами, однако в большинстве случаев используют графический клиент, например, FileZilla, выбирая при установке соединения протокол SFTP и подставляя параметры от SSH-соединения.

[править] Вход по ключу

Для доступа к серверу по ключу, необходимо загрузить утилиту pageant. После запуска, утилита располагается в системном трее, вызвав правым щелчком мыши контекстное меню можно выбрать пункт Add Keys и в диалоговом окне загрузить ключ. Утилита будет перехватывать любые SSH-соединения и обеспечивать доступ по загруженному ключ (то есть без логина и пароля).

Так же, как и в Linux, ключ может быть размещен в подкаталоге .ssh домашнего каталога пользователя C:/Users/UserName/.ssh, после чего он становится доступен консольным утилитам, использующим SSH-доступ, например git.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты