Поиск по сайту:

Основы 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 на локальном компьютере, введите:

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

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

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

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

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

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

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

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

  1. ssh-keygen -b 4096

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

Overwrite (y/n)?

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

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

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

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

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

  1. 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, введите:

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

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

Output
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, поэтому, скорее всего, он установлен по умолчанию.

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

  1. 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:

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

Output
Number 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.

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

  1. ssh username@remote_host

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

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

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

  1. 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:

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

  1. ssh username@remote_IP_host

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

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

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

  1. cat ~/.ssh/id_rsa.pub
Output
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, если он еще не существует:

  1. mkdir -p ~/.ssh

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

  1. echo public_key_string >> ~/.ssh/authorized_keys

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

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

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

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

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

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

  1. ssh remote_host

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

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

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

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

  1. ssh username@remote_host command_to_run

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

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

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

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

  1. ssh -p port_num username@remote_host

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

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

  1. nano ~/.ssh/config

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

Host remote_alias
    HostName remote_host
    Port port_num

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

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

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

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

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

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

  1. eval $(ssh-agent)
Output
Agent pid 10891

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

  1. 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. Это перенаправит ваши учетные данные на сервер для этого сеанса:

  1. ssh -A username@remote_host

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

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

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

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

PasswordAuthentication no

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

#Port 22
Port 4444

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

AllowUsers user1 user2

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

AllowGroups sshmembers

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

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

  1. sudo groupadd -r sshmembers

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

  1. sudo usermod -a -G sshmembers user1
  2. sudo usermod -a -G sshmembers user2

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

PermitRootLogin no

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

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

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

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

  1. ssh-copy-id root@remote_host

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

  1. sudo nano /root/.ssh/authorized_keys

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

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

PermitRootLogin forced-commands-only

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

X11Forwarding yes

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

В Ubuntu/Debian:

  1. sudo service ssh restart

В CentOS/Fedora:

  1. sudo service sshd restart

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

  1. ssh -X username@remote_host

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

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

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

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

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

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

  1. nano ~/.ssh/config

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

  1. man ssh_config

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

Host testhost
    HostName your_domain
    Port 4444
    User demo

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

  1. ssh testhost

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

Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

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

Поддержание соединений во избежание тайм-аута

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

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

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

  1. 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 на локальном компьютере:

  1. nano ~/.ssh/config

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

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

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

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-клиента на локальном компьютере:

  1. 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

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

  1. mkdir ~/.ssh/multiplex

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

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

  1. ssh -S none username@remote_host

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. ssh -L your_port:site_or_IP_to_access:site_port username@host

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

  1. ps aux | grep 8888
Output
1001 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:

  1. kill 5965

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

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

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

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

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

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

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

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

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

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

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

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

  1. ssh -R remote_port:site_or_IP_to_access:site_port username@host

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

  1. ps aux | grep 8888
Output
1001 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-команде:

  1. kill 5965

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

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

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

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

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

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

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

  1. ssh -f -N -D 7777 username@remote_host

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

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

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

  1. ps aux | grep 8888
Output
1001 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-команде:

  1. kill 5965

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

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

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

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

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

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

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

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

  1. [ENTER]
  2. ~.

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

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

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

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

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

  1. [ENTER]
  2. ~[CTRL-z]

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

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

  1. fg

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

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

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

  1. fg %2

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

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

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

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

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

  1. [ENTER]
  2. ~C
ssh>

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

  1. [ENTER]
  2. ~v
  3. ~v
  4. ~v
  5. ~C
  6. -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. Вам нужно будет только предоставить порт для этого.

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

  1. [ENTER]
  2. ~C
  3. -L 8888:127.0.0.1:80

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

  1. [ENTER]
  2. ~C
  3. -KL 8888

Заключение

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