Основы SSH: работа с серверами, клиентами и ключами SSH

Введение

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

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

Как использовать это руководство

  • Сначала прочитайте раздел Обзор SSH, если вы не знакомы с SSH в целом или только начинаете.
  • Используйте те последующие разделы, которые применимы к тому, чего вы пытаетесь достичь. Большинство разделов не основаны ни на одном другом, поэтому вы можете использовать следующие примеры независимо друг от друга.
  • Используйте меню «Содержание» в левой части этой страницы (широко шириной страницы) или функцию поиска вашего браузера, чтобы найти нужные вам разделы.
  • Скопируйте и вставьте приведенные примеры командной строки, заменив highlightedзначения собственными значениями.

Обзор SSH

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

Как работает SSH

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

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

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

Как SSH Аутентифицирует Пользователей

Клиенты, как правило, проходят аутентификацию либо с помощью паролей (менее безопасных и не рекомендуется), либо с помощью ключей SSH, которые очень безопасны.

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

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

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

When a client connects to the host, wishing to use SSH key authentication, it will inform the server of this intent and will tell the server which public key to use. The server then checks its authorized_keys file for the public key, generates a random string, and encrypts it using the public key. This encrypted message can only be decrypted with the associated private key. The server will send this encrypted message to the client to test whether they actually have the associated private key.

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

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

Генерация и работа с SSH-ключами

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

Создание пары ключей SSH

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

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

Чтобы создать пару ключей RSA на локальном компьютере, введите:

ssh-keygen

Копировать

Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):

This prompt allows you to choose the location to store your RSA private key. Press ENTER to leave this as the default, which will store them in the .ssh hidden directory in your user’s home directory. Leaving the default location selected will allow your SSH client to find the keys automatically.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

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

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

OutputYour identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+

This procedure has generated an RSA SSH key pair, located in the .ssh hidden directory within your user’s home directory. These files are:

  • ~/.ssh/id_rsa: Закрытый ключ. НЕ ДЕЛИТЕСЬ ЭТИМ ФАЙЛОМ!
  • ~/.ssh/id_rsa.pub: Связанный открытый ключ. Этим можно свободно делиться без последствий.

Создайте пару ключей SSH с большим количеством бит

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

To do this, include the -b argument with the number of bits you would like. Most servers support keys with a length of at least 4096 bits. Longer keys may not be accepted for DDOS protection purposes:

ssh-keygen -b 4096

Копировать

Если вы ранее создали другой ключ, вас спросят, хотите ли вы перезаписать предыдущий ключ:

Overwrite (y/n)?

Если вы выберете «да», ваш предыдущий ключ будет перезаписан, и вы больше не сможете входить на серверы с помощью этого ключа. Из-за этого обязательно перезапишите ключи с осторожностью.

Удаление или изменение Парольной фразы на закрытом ключе

Если вы сгенерировали парольную фразу для своего закрытого ключа и хотите изменить или удалить ее, вы можете сделать это легко.

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

Чтобы изменить или удалить парольную фразу, просто введите:

ssh-keygen -p

Копировать

Enter file in which the key is (/root/.ssh/id_rsa):

Вы можете ввести местоположение ключа, который вы хотите изменить, или нажать ENTER, чтобы принять значение по умолчанию:

Enter old passphrase:

Введите старую парольную фразу, которую вы хотите изменить. Затем вам будет предложено ввести новую парольную фразу:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

Здесь введите новую парольную фразу или нажмите ENTER, чтобы удалить парольную фразу.

Отображение отпечатка ключа SSH

Каждая пара ключей SSH имеет один криптографический «отпечаток пальца», который можно использовать для уникальной идентификации ключей. Это может быть полезно в различных ситуациях.

Чтобы узнать отпечаток пальца SSH-ключа, введите:

ssh-keygen -l

Копировать

Enter file in which the key is (/root/.ssh/id_rsa):

Вы можете нажать ENTER, если это правильное местоположение ключа, в противном случае введите пересмотренное местоположение. Вам будет предоставлена строка, которая содержит битовую длину ключа, отпечаток пальца, учетную запись и хост, для которого он был создан, а также используемый алгоритм:

Output4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  demo@test (RSA)

Копирование открытого SSH-ключа на сервер с помощью SSH-Copy-ID

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

If you currently have password-based SSH access configured to your server, and you have the ssh-copy-id utility installed, this is a simple process. The ssh-copy-id tool is included in many Linux distributions’ OpenSSH packages, so it very likely may be installed by default.

Если у вас есть такая опция, вы можете легко перенести свой открытый ключ, набрав:

ssh-copy-id username@remote_host

Копировать

Это запрашивает пароль учетной записи пользователя в удаленной системе:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
demo@111.111.11.111's password:

After typing in the password, the contents of your ~/.ssh/id_rsa.pub key will be appended to the end of the user account’s ~/.ssh/authorized_keys file:

OutputNumber of key(s) added: 1

Now try logging into the machine, with:   "ssh 'demo@111.111.11.111'"
and check to make sure that only the key(s) you wanted were added.

Теперь вы можете войти в эту учетную запись без пароля:

ssh username@remote_host

Копировать

Копирование открытого SSH-ключа на сервер без SSH-Copy-ID

Если у вас нет утилиты ssh-copy-id, но у вас все еще есть SSH-доступ на основе пароля к удаленному серверу, вы можете скопировать содержимое открытого ключа другим способом.

You can output the contents of the key and pipe it into the ssh command. On the remote side, you can ensure that the ~/.ssh directory exists, and then append the piped contents into the ~/.ssh/authorized_keys file:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Копировать

Вас попросят ввести пароль для удаленной учетной записи:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
demo@111.111.11.111's password:

После ввода пароля ваш ключ будет скопирован, что позволит вам войти в систему без пароля:

ssh username@remote_IP_host

Копировать

Копирование открытого SSH-ключа на сервер вручную

Если у вас нет доступа SSH на основе пароля, вам придется добавить открытый ключ на удаленный сервер вручную.

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

cat ~/.ssh/id_rsa.pub

Копировать

Outputssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

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

На удаленном сервере создайте каталог ~/.ssh, если он еще не существует:

mkdir -p ~/.ssh

Копировать

После этого вы можете создать или добавить файл ~/.ssh/authorized_keys, введя:

echo public_key_string >> ~/.ssh/authorized_keys

Копировать

Теперь вы сможете войти на удаленный сервер без пароля.

Основные инструкции по подключению

В следующем разделе будут рассмотрены некоторые основы подключения к серверу с помощью SSH.

Подключение к удаленному серверу

Чтобы подключиться к удаленному серверу и открыть там сеанс оболочки, вы можете использовать команду ssh.

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

ssh remote_host

Копировать

Если ваше имя пользователя отличается на удаленном сервере, вам нужно передать имя удаленного пользователя следующим образом:

ssh username@remote_host

Копировать

При первом подключении к новому хосту вы увидите сообщение, которое выглядит следующим образом:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Введите yes, чтобы принять подлинность удаленного хоста.

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

Выполнение одной команды на удаленном сервере

Чтобы выполнить одну команду на удаленном сервере вместо появления сеанса оболочки, вы можете добавить команду после информации о подключении, например:

ssh username@remote_host command_to_run

Копировать

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

Вход на сервер с другим портом

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

Вы можете сделать это, указав номер порта с опцией -p:

ssh -p port_num username@remote_host

Копировать

To avoid having to do this every time you log in to your remote server, you can create or edit a configuration file in the ~/.ssh directory within the home directory of your local computer.

Отредактируйте или создайте файл сейчас, введя:

nano ~/.ssh/config

Копировать

Здесь вы можете установить параметры конфигурации для конкретного хоста. Чтобы указать новый порт, используйте следующий формат:~/.ssh/config

Host remote_alias
    HostName remote_host
    Port port_num

Это позволит вам войти в систему без указания конкретного номера порта в командной строке.

Добавление SSH-ключей к агенту SSH, чтобы избежать ввода фразы

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

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

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

Чтобы запустить SSH-агент, введите следующее в сеанс локального терминала:

eval $(ssh-agent)

Копировать

OutputAgent pid 10891

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

ssh-add

Копировать

Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

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

Пересылка учетных данных SSH для использования на сервере

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

Для начала необходимо запустить агент SSH и добавить ключ SSH в агент (см. ранее). После этого вам нужно подключиться к первому серверу с помощью опции -A. Это пересылает ваши учетные данные на сервер для этого сеанса:

ssh -A username@remote_host

Копировать

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

Варианты конфигурации на сервере

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

Отключение аутентификации пароля

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

To do this, connect to your remote server and open the /etc/ssh/sshd_config file with root or sudo privileges:

sudo nano /etc/ssh/sshd_config

Копировать

Inside of the file, search for the PasswordAuthentication directive. If it is commented out, uncomment it. Set it to no to disable password logins:/etc/ssh/sshd_config

PasswordAuthentication no

После внесения изменений сохраните и закройте файл. Чтобы внести изменения, необходимо перезапустить службу SSH.

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

Теперь все учетные записи в системе не смогут войти в SSH с помощью паролей.

Изменение порта, на котором работает демон SSH

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

To change the port that the SSH daemon listens on, you will have to log in to your remote server. Open the sshd_config file on the remote system with root privileges, either by logging in with that user or by using sudo:

sudo nano /etc/ssh/sshd_config

Копировать

Once you are inside, you can change the port that SSH runs on by finding the Port 22 specification and modifying it to reflect the port you wish to use. For instance, to change the port to 4444, put this in your file:/etc/ssh/sshd_config

#Port 22
Port 4444

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

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

После перезапуска демона вам нужно будет пройти аутентификацию, указав номер порта (продемонстрированный в предыдущем разделе).

Ограничение пользователей, которые могут подключиться через SSH

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

На удаленном сервере откройте этот файл сейчас с привилегиями root или sudo:

sudo nano /etc/ssh/sshd_config

Копировать

The first method of specifying the accounts that are allowed to login is using the AllowUsers directive. Search for the AllowUsers directive in the file. If one does not exist, create it anywhere. After the directive, list the user accounts that should be allowed to login through SSH:/etc/ssh/sshd_config

AllowUsers user1 user2

Сохраните и закройте файл. Перезапустите демон, чтобы внести изменения.

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

Если вам удобнее управлять группами, вы можете использовать директиву AllowGroups. Если это так, просто добавьте одну группу, которой должен быть разрешен доступ к SSH (мы создадим эту группу и добавим участников на мгновение):/etc/ssh/sshd_config

AllowGroups sshmembers

Сохраните и закройте файл.

Теперь вы можете создать системную группу (без домашнего каталога), соответствующую указанной вами группе, набрав:

sudo groupadd -r sshmembers

Копировать

Убедитесь, что вы добавили в эту группу все необходимые учетные записи пользователей. Это можно сделать, набрав:

sudo usermod -a -G sshmembers user1
sudo usermod -a -G sshmembers user2

Копировать

Теперь перезапустите демон SSH, чтобы внести изменения.

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

Отключение корневого входа

Часто рекомендуется полностью отключить root-логин через SSH после настройки учетной записи пользователя SSH, которая имеет привилегии sudo.

Для этого откройте файл конфигурации демона SSH с root или sudo на удаленном сервере.

sudo nano /etc/ssh/sshd_config

Копировать

Внутри найдите директиву под названием PermitRootLogin. Если он будет прокомментирован, раскомментируйте его. Измените значение на «нет»:/etc/ssh/sshd_config

PermitRootLogin no

Сохраните и закройте файл. Чтобы внести изменения, перезапустите демон SSH.

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

Разрешение корневого доступа для определенных команд

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

This can be accomplished through the root user’s authorized_keys file, which contains SSH keys that are authorized to use the account.

Add the key from your local computer that you wish to use for this process (we recommend creating a new key for each automatic process) to the root user’s authorized_keys file on the server. We will demonstrate with the ssh-copy-id command here, but you can use any of the methods of copying keys we discuss in other sections:

ssh-copy-id root@remote_host

Копировать

Теперь войдите на удаленный сервер. Нам нужно будет настроить запись в файле authorized_keys, поэтому откройте ее с помощью root или sudo-доступа:

sudo nano /root/.ssh/authorized_keys

Копировать

В начале строки с загруженным ключом добавьте список command=, который определяет команду, для которой этот ключ действителен. Это должно включать полный путь к исполняемому файлу, а также любые аргументы:/root/.ssh/authorized_keys

command="/path/to/command arg1 arg2" ssh-rsa ...

Сохраните и закройте файл, когда закончите.

Now, open the sshd_config file with root or sudo privileges:

sudo nano /etc/ssh/sshd_config

Копировать

Find the directive PermitRootLogin, and change the value to forced-commands-only. This will only allow SSH key logins to use root when a command has been specified for the key:/etc/ssh/sshd_config

PermitRootLogin forced-commands-only

Сохраните и закройте файл. Перезапустите демон SSH, чтобы внести изменения.

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

Переадресация отображения приложения X клиенту

Демонстрация SSH может быть настроена на автоматическую пересылку отображения приложений X на сервере на клиентскую машину. Чтобы это работало правильно, клиент должен настроить и включить систему X Windows.

To enable this functionality, log in to your remote server and edit the sshd_config file as root or with sudo privileges:

sudo nano /etc/ssh/sshd_config

Копировать

Найдите директиву X11Forwarding. Если он будет закомментирован, раскомментируйте его. Создайте его при необходимости и установите значение «да»:/etc/ssh/sshd_config

X11Forwarding yes

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

В Ubuntu/Debian:

sudo service ssh restart

Копировать

На CentOS/Fedora:

sudo service sshd restart

Копировать

To connect to the server and forward an application’s display, you have to pass the -X option from the client upon connection:

ssh -X username@remote_host

Копировать

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

Параметры конфигурации на клиентской панели

В следующем разделе мы сосредоточимся на некоторых корректировках, которые вы можете внести на стороне клиента соединения.

Определение информации о подключении для сервера

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

Создайте или откройте этот файл в текстовом редакторе на локальном компьютере:

nano ~/.ssh/config

Копировать

Внутри вы можете определить отдельные параметры конфигурации, представив каждый из них с ключевым словом Host, за которым следует псевдоним. Под этим и отступом вы можете определить любую из директив, найденных на справочном сайте ssh_config:

man ssh_config

Копировать

Пример конфигурации:~/.ssh/config

Host testhost
    HostName your_domain
    Port 4444
    User demo

You could then connect to your_domain on port 4444 using the username demo by simply typing:

ssh testhost

Копировать

Вы также можете использовать подстановочные знаки для сопоставления более чем одного хоста. Имейте в виду, что более поздние матчи могут переопределить более ранние. Из-за этого вы должны поставить свои самые общие матчи на первое место. Например, вы можете по умолчанию все подключения не разрешать пересылку X с переопределением для your_domain, имея это в вашем файле:~/.ssh/config

Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

Сохраните и закройте файл, когда закончите.

Поддержание связи, чтобы избежать тайм-аута

Если вы обнаружите, что отключились от сеансов SSH до того, как будете готовы, возможно, ваше соединение истекло.

Вы можете настроить клиента на отправку пакета на сервер так часто, чтобы избежать такой ситуации:

На локальном компьютере вы можете настроить это для каждого подключения, отредактировав файл ~/.ssh/config. Откройте его сейчас:

nano ~/.ssh/config

Копировать

If one does not already exist, at the top of the file, define a section that will match all hosts. Set the ServerAliveInterval to “120” to send a packet to the server every two minutes. This should be enough to notify the server not to close the connection:~/.ssh/config

Host *
    ServerAliveInterval 120

Сохраните и закройте файл, когда закончите.

Отключение Проверки Хоста

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

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

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

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

To make the change, the open the ~/.ssh/config file on your local computer:

nano ~/.ssh/config

Копировать

If one does not already exist, at the top of the file, define a section that will match all hosts. Set the StrictHostKeyChecking directive to no to add new hosts automatically to the known_hosts file. Set the UserKnownHostsFile to /dev/null to not warn on new or changed hosts:~/.ssh/config

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

You can enable the checking on a case-by-case basis by reversing those options for other hosts. The default for StrictHostKeyChecking is ask:~/.ssh/config

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName your_domain
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

Мультиплексирование SSH через одно TCP-соединение

Бывают ситуации, когда установление нового TCP-соединения может занять больше времени, чем вы хотели бы. Если вы подключаетесь к одной и той же машине, вы можете воспользоваться преимуществами мультиплексирования.

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

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

Чтобы настроить мультиплексирование, отредактируйте файл конфигурации клиента SSH на локальном компьютере:

nano ~/.ssh/config

Копировать

If you do not already have a wildcard host definition at the top of the file, add one now (as Host *). We will be setting the ControlMasterControlPath, and ControlPersist values to establish our multiplexing configuration.

The ControlMaster should be set to “auto” in able to automatically allow multiplexing if possible. The ControlPath will establish the path to control socket. The first session will create this socket and subsequent sessions will be able to find it because it is labeled by username, host, and port.

Setting the ControlPersist option to 1 will allow the initial master connection to be backgrounded. The 1 specifies that the TCP connection should automatically terminate one second after the last SSH session is closed:/.ssh/config

Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

Сохраните и закройте файл, когда закончите. Теперь нам нужно создать каталог, который мы указали в пути управления:

mkdir ~/.ssh/multiplex

Копировать

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

If for some reason you need to bypass the multiplexing configuration temporarily, you can do so by passing the -S flag with none:

ssh -S none username@remote_host

Копировать

Настройка SSH-туннелей

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

Настройка локального туннелирования на сервере

SSH-соединения могут использоваться для туннелирования трафика от портов на локальном хосте к портам на удаленном хосте.

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

Это часто используется для туннелирования в менее ограниченную сетевую среду в обход брандмауэра. Другим распространенным использованием является доступ к веб-интерфейсу «только для локального хоста» из удаленного местоположения.

To establish a local tunnel to your remote server, you need to use the -L parameter when connecting and you must supply three pieces of additional information:

  • Локальный порт, к которому вы хотите получить доступ к туннельному соединению.
  • Хост, к которому вы хотите подключиться удаленный хост.
  • Порт, к которому вы хотите подключиться удаленный хост.

Они приведены в указанном выше порядке (разделенном двоеточием) в качестве аргументов к флагу -L. Мы также будем использовать флаг -f, который заставляет SSH перейти в фоновый режим перед выполнением, и флаг -N, который не открывает оболочку и не выполняет программу на удаленной стороне.

For instance, to connect to your_domain on port 80 on your remote host, making the connection available on your local machine on port 8888, you could type:

ssh -f -N -L 8888:your_domain:80 username@remote_host

Копировать

Now, if you point your local web browser to 127.0.0.1:8888, you should see whatever content is at your_domain on port 80.

Более общее руководство по синтаксису:

ssh -L your_port:site_or_IP_to_access:site_port username@host

Копировать

Поскольку соединение находится в фоновом режиме, вам придется найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск по переадресованному порту:

ps aux | grep 8888

Копировать

Output1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете завершить процесс, нацелившись на PID, который является номером во втором столбце строки, который соответствует вашей команде SSH:

kill 5965

Копировать

Другой вариант — начать соединение без флага -f. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время пересылки. Преимущество этого заключается в том, что вы можете легко убить туннель, набрав CTRL-C.

Настройка удаленного туннелирования на сервере

SSH-соединения могут использоваться для туннелирования трафика от портов на локальном хосте к портам на удаленном хосте.

В удаленном туннеле устанавливается подключение к удаленному хосту. При создании туннеля указывается удаленный порт. Затем этот порт на удаленном хосте будет туннелирован на комбинацию хоста и порта, подключенного с локального компьютера. Это позволит удаленному компьютеру получить доступ к хосту через ваш локальный компьютер.

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

To establish a remote tunnel to your remote server, you need to use the -R parameter when connecting and you must supply three pieces of additional information:

  • Порт, в котором удаленный хост может получить доступ к туннельному соединению.
  • Хост, к которому вы хотите подключиться ваш локальный компьютер.
  • Порт, к которому вы хотите подключиться к локальному компьютеру.

Они приведены в указанном выше порядке (разделенном двоеточием) в качестве аргументов к флагу -R. Мы также будем использовать флаг -f, который заставляет SSH перейти в фоновый режим перед выполнением, и флаг -N, который не открывает оболочку и не выполняет программу на удаленной стороне.

For instance, to connect to your_domain on port 80 on our local computer, making the connection available on our remote host on port 8888, you could type:

ssh -f -N -R 8888:your_domain:80 username@remote_host

Копировать

Now, on the remote host, opening a web browser to 127.0.0.1:8888 would allow you to see whatever content is at your_domain on port 80.

Более общее руководство по синтаксису:

ssh -R remote_port:site_or_IP_to_access:site_port username@host

Копировать

Поскольку соединение находится в фоновом режиме, вам придется найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск по переадресованному порту:

ps aux | grep 8888

Копировать

Output1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете убить процесс, нацелившись на PID, который является номером во втором столбце, строки, соответствующей вашей команде SSH:

kill 5965

Копировать

Другой вариант — начать соединение без флага -f. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время пересылки. Преимущество этого заключается в том, что вы можете легко убить туннель, набрав CTRL-C.

Настройка динамического туннелирования на удаленном сервере

SSH-соединения могут использоваться для туннелирования трафика от портов на локальном хосте к портам на удаленном хосте.

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

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

To establish the connection, we will pass the -D flag along with the local port where we wish to access the tunnel. We will also use the -f flag, which causes SSH to go into the background before executing and the -N flag, which does not open a shell or execute a program on the remote side.

Например, чтобы установить туннель на порту 7777, вы можете ввести:

ssh -f -N -D 7777 username@remote_host

Копировать

Отсюда вы можете начать направку приложения с поддержкой SOCKS (например, веб-браузера) на выбранный вами порт. Приложение отправит свою информацию в сокет, связанный с портом.

Метод направления трафика на порт SOCKS будет отличаться в зависимости от приложения. Например, в Firefox общее местоположение — Настройки > Дополнительно > Настройки > Ручная настройка прокси. В Chrome вы можете запустить приложение с установленным флагом --proxy-server=. Вы захотите использовать интерфейс localhost и переадресованный порт.

Поскольку соединение находится в фоновом режиме, вам придется найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск по переадресованному порту:

ps aux | grep 8888

Копировать

Output1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -D 7777 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем вы можете убить процесс, нацелившись на PID, который является номером во втором столбце, строки, соответствующей вашей команде SSH:

kill 5965

Копировать

Другой вариант — начать соединение без флага -f. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время пересылки. Преимущество этого заключается в том, что вы можете легко убить туннель, набрав CTRL-C.

Использование Escape-кодов SSH для управления соединениями

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

Принудительный отключения со стороны клиента (Как вывести из застрявшего или замороженного сеанса)

Одной из самых полезных функций OpenSSH, которая остается в значительной степени незамеченной, является возможность контролировать определенные аспекты сеанса изнутри.

These commands can be executed starting with the ~ control character within an SSH session. Control commands will only be interpreted if they are the first thing that is typed after a newline, so always press ENTER one or two times prior to using one.

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

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

[ENTER]
~.

Копировать

Соединение должно немедленно закрыться, вернув вас к локальному сеансу оболочки.

Размещение сеанса SSH в фоновом режиме

Одной из самых полезных функций OpenSSH, которая остается в значительной степени незамеченной, является возможность контролировать определенные аспекты сеанса из соединения.

These commands can be executed starting with the ~ control character from within an SSH connection. Control commands will only be interpreted if they are the first thing that is typed after a newline, so always press ENTER one or two times prior to using one.

Одна из возможностей, которую это предоставляет, — поместить сеанс SSH в фоновый режим. Для этого нам нужно указать управляющий символ (~), а затем выполнить обычное сочетание клавиш для фонового фона задачи (CTRL-z):

[ENTER]
~[CTRL-z]

Копировать

Это переведет соединение в фоновый режим, вернув вас к локальному сеансу оболочки. Чтобы вернуться к сеансу SSH, вы можете использовать обычные механизмы управления заданиями.

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

fg

Копировать

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

jobs

Копировать

Output[1]+  Stopped                 ssh username@some_host
[2]   Stopped                 ssh username@another_host

Затем вы можете вывести любую из задач на передний план, используя индекс в первом столбце со знаком процента:

fg %2

Копировать

Изменение параметров пересылки портов на существующем SSH-соединении

Одной из самых полезных функций OpenSSH, которая остается в значительной степени незамеченной, является возможность контролировать определенные аспекты сеанса из соединения.

These commands can be executed starting with the ~ control character from within an SSH connection. Control commands will only be interpreted if they are the first thing that is typed after a newline, so always press ENTER one or two times prior to using one.

Одна вещь, которую это позволяет пользователю изменить конфигурацию переадресации портов после того, как соединение уже установлено. Это позволяет создавать или разрушать правила пересылки портов на лету.

Эти возможности являются частью интерфейса командной строки SSH, к которому можно получить доступ во время сеанса с помощью управляющего символа (~) и «C»:

[ENTER]
~C

Копировать

ssh>

You will be given an SSH command prompt, which has a very limited set of valid commands. To see the available options, you can type -h from this prompt. If nothing is returned, you may have to increase the verbosity of your SSH output by using ~v a few times:

[ENTER]
~v
~v
~v
~C
-h

Копировать

Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

Как вы можете видеть, вы можете легко реализовать любой из вариантов пересылки, используя соответствующие параметры (дополнительную информацию см. в разделе пересылки). Вы также можете уничтожить туннель с помощью связанной команды «kill», указанной с «K» перед буквой типа пересылки. Например, чтобы убить локальную пересылку (-L), вы можете использовать команду -KL. Вам нужно будет только предоставить порт для этого.

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

[ENTER]
~C
-L 8888:127.0.0.1:80

Копировать

Port 8888 on your local computer will now be able to communicate with the web server on the host you are connecting to. When you are finished, you can tear down that forward by typing:

[ENTER]
~C
-KL 8888

Копировать

Заключение

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

Related Posts
AllEscortAllEscort