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

Введение

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

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

Разверните свои фронтенд-приложения из GitHub, используя Платформу приложений DigitalOcean. Позвольте DigitalOcean масштабировать ваше приложение.

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

  • Сначала прочтите раздел Обзор 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, всегда следует аутентифицироваться с их помощью.

A number of cryptographic algorithms can be used to generate SSH keys, including RSA, DSA, and ECDSA. RSA keys are generally preferred and are the default key type.

Чтобы сгенерировать пару ключей 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
[email protected]'s password:

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

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

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

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

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

~/.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, чтобы отключить вход по паролю:

/etc/ssh/sshd_config
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, найдя строку Port 22 и измените ее на тот порт, который вы хотите использовать. Например, чтобы изменить порт на 4444, добавьте эту строку в файл:

/etc/ssh/sshd_config
#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:

/etc/ssh/sshd_config
AllowUsers user1 user2

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

На Ubuntu/Debian:

  1. sudo service ssh restart

На CentOS/Fedora:

  1. sudo service sshd restart

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

/etc/ssh/sshd_config
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

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

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

  1. sudo nano /etc/ssh/sshd_config

Внутри найдите директиву под названием PermitRootLogin. Если она закомментирована, раскомментируйте её. Измените значение на “no”:

/etc/ssh/sshd_config
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=, перечислив команду, для которой этот ключ действителен. Это должно включать полный путь к исполняемому файлу, а также любые аргументы:

/root/.ssh/authorized_keys
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, когда для ключа указана команда:

/etc/ssh/sshd_config
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. Если она закомментирована, раскомментируйте ее. Создайте ее при необходимости и установите значение «yes»:

/etc/ssh/sshd_config
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

Пример конфигурации выглядел бы следующим образом:

~/.ssh/config
Host testhost
    HostName your_domain
    Port 4444
    User demo

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

  1. ssh testhost

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

~/.ssh/config
Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

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

Поддержание активных подключений для избежания отключения

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

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

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

  1. nano ~/.ssh/config

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

~/.ssh/config
Host *
    ServerAliveInterval 120

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

Отключение проверки хоста

По умолчанию, при подключении к новому серверу вы увидите отпечаток цифрового ключа удаленного демона SSH.

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

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

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

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

  1. nano ~/.ssh/config

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

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

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

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

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

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

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

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

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

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

  1. nano ~/.ssh/config

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

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

Установка опции ControlPersist в 1 позволит исходному основному соединению работать в фоновом режиме. Значение 1 указывает, что TCP-соединение должно автоматически завершиться через одну секунду после закрытия последней сеансовой сессии SSH:

/.ssh/config
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-соединения могут быть использованы для туннелирования трафика с портов на локальном хосте на порты удаленного хоста.

A local connection is a way of accessing a network location from your local computer through your remote host. First, an SSH connection is established to your remote host. On the remote server, a connection is made to an external (or internal) network address provided by the user and traffic to this location is tunneled to your local computer on a specified port.

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

Для установки локального туннеля к вашему удаленному серверу, вам нужно использовать параметр -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.

A more general guide to the syntax is:

  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, который не открывает оболочку или не выполняет программу на удаленной стороне.

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

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

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

A more general guide to the syntax is:

  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-соединения могут быть использованы для туннелирования трафика с портов локального хоста на порты удаленного хоста.

A dynamic tunnel is similar to a local tunnel in that it allows the local computer to connect to other resources through a remote host. A dynamic tunnel does this by simply specifying a single local port. Applications that wish to take advantage of this port for tunneling must be able to communicate using the SOCKS protocol so that the packets can be correctly redirected at the other side of the tunnel.

Трафик, который проходит через этот локальный порт, будет отправлен на удаленный хост. Оттуда протокол 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”, указанной перед буквой типа перенаправления. Например, чтобы завершить локальное перенаправление (-L), вы можете использовать команду -KL. Вам нужно будет указать только порт для этого.

Таким образом, для настройки локального перенаправления портов вы можете ввести:

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

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

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

Вывод

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

Source:
https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys