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

Вступление

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

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

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

  • Сначала прочтите раздел «Обзор SSH», если вы не знакомы с SSH в целом или только начинаете.

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

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

  • Скопируйте и вставьте приведенные примеры командной строки, заменив значения в «++» собственными значениями.

Обзор 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 +. Этот файл содержит список открытых ключей, по одному на строку, которым разрешено входить в эту учетную запись.

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

После получения этого сообщения клиент расшифрует его с помощью закрытого ключа и объединит случайную строку, которая обнаруживается, с ранее согласованным идентификатором сеанса. Затем он генерирует 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):

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

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

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

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

Your 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+    |
+-----------------+

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

  • + ~ / .ssh / id_rsa +: закрытый ключ. НЕ ПОДЕЛИТЬСЯ ЭТИМ ФАЙЛОМ!

  • + ~ / .ssh / id_rsa.pub +: связанный открытый ключ. Этим можно свободно поделиться без последствий.

Генерация пары ключей SSH с большим количеством битов

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

Для этого включите аргумент + -b + с количеством битов, которое вы хотите. Большинство серверов поддерживают ключи длиной не менее 4096 бит. Более длинные ключи не могут быть приняты в целях защиты DDOS:

ssh-keygen -b 4096

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

Overwrite (y/n)?

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

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

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

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

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

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

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

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, если это правильное местоположение клавиши, иначе введите исправленное местоположение. Вам будет предоставлена ​​строка, которая содержит битовую длину ключа, отпечаток пальца, учетную запись и хост, для которого он был создан, и используемый алгоритм:

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

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

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

Если у вас в настоящее время настроен SSH-доступ на основе пароля к вашему серверу, и у вас установлена ​​утилита + ssh-copy-id +, это простой процесс. Инструмент + ssh-copy-id + входит в состав пакетов OpenSSH многих дистрибутивов Linux, поэтому он, скорее всего, может быть установлен по умолчанию.

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

ssh-copy-id @

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

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
[email protected]'s password:

После ввода пароля содержимое вашего ключа + ~ / .ssh / id_rsa.pub + будет добавлено в конец файла + ~ / .ssh / authorized_keys + учетной записи пользователя:

Number of key(s) added: 1

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

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

ssh @

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

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

Вы можете вывести содержимое ключа и передать его в команду + ssh +. На удаленной стороне вы можете убедиться, что каталог + ~ / .ssh + существует, а затем добавить содержимое по конвейеру в файл + ~ / .ssh / authorized_keys +:

cat ~/.ssh/id_rsa.pub | ssh @ "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
[email protected]'s password:

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

ssh @

Копирование вашего публичного ключа SSH на сервер вручную

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

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

cat ~/.ssh/id_rsa.pub
ssh-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  >> ~/.ssh/authorized_keys

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

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

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

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

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

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

ssh

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

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

Введите «yes» для подтверждения подлинности удаленного хоста.

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

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

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

ssh @

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

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

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

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

ssh -p  @

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

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

nano ~/.ssh/config

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

Host
   HostName
   Port

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

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

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

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

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

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

eval $(ssh-agent)
Agent 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 @

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

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

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

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

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

Для этого подключитесь к удаленному серверу и откройте файл + / etc / ssh / sshd_config + с привилегиями root или sudo:

sudo nano /etc/ssh/sshd_config

Внутри файла найдите директиву + PasswordAuthentication +. Если оно закомментировано, раскомментируйте его. Установите значение «нет», чтобы отключить пароль для входа в систему:

PasswordAuthentication no

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

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

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

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

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

Чтобы изменить порт, который слушает демон SSH, вам необходимо войти на удаленный сервер. Откройте файл + sshd_config + в удаленной системе с правами суперпользователя, либо войдя в систему с этим пользователем, либо используя + sudo +:

sudo nano /etc/ssh/sshd_config

Как только вы окажетесь внутри, вы можете изменить порт, на котором работает SSH, найдя спецификацию + Port 22 + и изменив ее так, чтобы она отражала порт, который вы хотите использовать. Например, чтобы изменить порт на 4444, поместите это в свой файл:

Port 22
Port

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

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

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

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

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

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

sudo nano /etc/ssh/sshd_config

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

AllowUsers

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

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

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

AllowGroups

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

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

sudo groupadd -r

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

sudo usermod -a -G
sudo usermod -a -G

Теперь перезапустите демон 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. Если это закомментировано, раскомментируйте его. Измените значение на «нет»:

PermitRootLogin no

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

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

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

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

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

Добавьте ключ с локального компьютера, который вы хотите использовать для этого процесса (мы рекомендуем создавать новый ключ для каждого автоматического процесса), в файл корневого пользователя + authorized_keys + на сервере. Мы продемонстрируем здесь команду + ssh-copy-id +, но вы можете использовать любой из методов копирования ключей, которые мы обсудим в других разделах:

ssh-copy-id root@

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

sudo nano /root/.ssh/authorized_keys

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

command="" ssh-rsa ...

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

Теперь откройте файл + sshd_config + с привилегиями root или sudo:

sudo nano /etc/ssh/sshd_config

Найдите директиву + PermitRootLogin и измените значение на` + принудительные команды-только`. Это позволит только при входе в систему через SSH-ключ использовать root, если для ключа была указана команда:

PermitRootLogin forced-commands-only

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

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

Пересылка дисплеев приложений X клиенту

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

Чтобы включить эту функцию, войдите на удаленный сервер и отредактируйте файл + sshd_config + от имени пользователя root или с правами sudo:

sudo nano /etc/ssh/sshd_config

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

X11Forwarding yes

Сохраните и закройте файл. Перезапустите ваш демон SSH для реализации этих изменений.

В Ubuntu / Debian:

sudo service ssh restart

На CentOS / Fedora:

sudo service sshd restart

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

ssh -X @

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

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

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

Определение серверной информации о соединении

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

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

nano ~/.ssh/config

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

man ssh_config

Пример конфигурации будет:

Host testhost
   HostName
   Port
   User

Затем вы можете подключиться к + example.com + через порт 4444, используя имя пользователя «demo», просто набрав:

ssh testhost

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

Host *
   ForwardX11 no

Host testhost
   HostName
   ForwardX11 yes
   Port
   User

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

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

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

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

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

nano ~/.ssh/config

Если он еще не существует, в верхней части файла определите раздел, который будет соответствовать всем хостам. Установите для «+ ServerAliveInterval +» значение «120», чтобы отправлять пакет на сервер каждые две минуты. Этого должно быть достаточно, чтобы уведомить сервер не закрывать соединение:

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

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

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

Чтобы внести изменения, откройте файл + ~ / .ssh / config на вашем локальном компьютере:

nano ~/.ssh/config

Если он еще не существует, в верхней части файла определите раздел, который будет соответствовать всем хостам. Установите для директивы + StrictHostKeyChecking + значение «no», чтобы автоматически добавлять новые хосты в файл «+ known_hosts ». Установите ` UserKnownHostsFile ` в ` / dev / null +`, чтобы не предупреждать о новых или измененных хостах:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null

Вы можете включить проверку в каждом конкретном случае, изменив эти параметры для других хостов. Значение по умолчанию для + StrictHostKeyChecking + - «спросить»:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null

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

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

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

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

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

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

nano ~/.ssh/config

Если у вас еще нет определения хоста с подстановочными символами в верхней части файла, добавьте его сейчас (как + Host * +). Мы установим значения + ControlMaster +, + ControlPath + и + ControlPersist +, чтобы установить нашу конфигурацию мультиплексирования.

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

Если для опции + ControlPersist + установлено значение «1», исходное мастер-соединение будет фоновым. «1» указывает, что TCP-соединение должно автоматически завершаться через одну секунду после закрытия последнего сеанса SSH:

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

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

mkdir ~/.ssh/multiplex

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

Если по какой-то причине вам необходимо временно обойти конфигурацию мультиплексирования, вы можете сделать это, передав флаг + -S + с «none»:

ssh -S none @

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

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

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

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

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

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

Чтобы установить локальный туннель к вашему удаленному серверу, вам нужно использовать параметр + -L + при подключении, и вы должны предоставить три части дополнительной информации:

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

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

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

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

Например, чтобы подключиться к + example.com + через порт 80 на удаленном хосте, сделав соединение доступным на локальном компьютере через порт 8888, вы можете набрать:

ssh -f -N -L 8888:example.com:80 @

Теперь, если вы укажете вашему локальному веб-браузеру +127.0.0.1: 8888 +, вы должны увидеть любой контент на + example.com + на порте 80.

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

ssh -L :: @

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

ps aux | grep
1001        0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:example.com: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

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

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

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

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

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

Чтобы установить удаленный туннель к вашему удаленному серверу, вам нужно использовать параметр + -R + при подключении, и вы должны предоставить три части дополнительной информации:

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

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

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

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

Например, чтобы подключиться к + example.com + через порт 80 на нашем локальном компьютере и сделать подключение доступным на нашем удаленном хосте через порт 8888, вы можете набрать:

ssh -f -N -R 8888:example.com:80 @

Теперь на удаленном хосте, открыв веб-браузер для +127.0.0.1: 8888 +, вы сможете увидеть любой контент на + example.com + на порте 80.

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

ssh -R :: @

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

ps aux | grep
1001        0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:example.com: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

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

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

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

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

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

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

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

ssh -f -N -D  @

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

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

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

ps aux | grep
1001        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

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

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

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

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

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

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

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

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

[ENTER]
~.

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

Помещение сессии SSH на задний план

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

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

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

[ENTER]
~[CTRL-z]

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

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

fg

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

jobs
[1]+  Stopped                 ssh @
[2]   Stopped                 ssh @

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

fg %2

Изменение параметров переадресации портов в существующем соединении SSH

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

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

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

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

[ENTER]
~C
ssh>

Вам будет предоставлена ​​командная строка SSH с очень ограниченным набором допустимых команд. Чтобы увидеть доступные опции, вы можете набрать + -h + из этой подсказки. Если ничего не возвращается, вам, возможно, придется увеличить многословность вывода SSH, используя несколько раз + ~ v +:

[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

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

[ENTER]
~C
-KL 8888

Заключение

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

Related