Основы SSH: работа с SSH-серверами, клиентами и ключами
Введение
SSH — это безопасный протокол, используемый в качестве основного средства удаленного подключения к серверам Linux. Он предоставляет текстовый интерфейс, порождая удаленную оболочку. После подключения все команды, которые вы вводите в своем локальном терминале, отправляются на удаленный сервер и выполняются там.
В этом руководстве по стилю шпаргалки мы рассмотрим некоторые распространенные способы подключения к SSH для достижения ваших целей. Это можно использовать в качестве краткого справочника, когда вам нужно узнать, как подключиться к серверу или настроить его различными способами.
Как пользоваться этим руководством
- Сначала прочитайте раздел «Обзор SSH», если вы не знакомы с SSH в целом или только начинаете.
- Используйте последующие разделы в зависимости от того, чего вы пытаетесь достичь. Большинство разделов не основаны ни на каких других, поэтому следующие примеры можно использовать независимо друг от друга.
- Используйте меню Содержание в левой части этой страницы (при большой ширине страницы) или функцию поиска в браузере, чтобы найти нужные разделы.
- Скопируйте и вставьте приведенные примеры командной строки, заменив
выделенные
значения собственными значениями.
Обзор SSH
Наиболее распространенный способ подключения к удаленному серверу Linux — через SSH. SSH означает Secure Shell и обеспечивает безопасный и надежный способ удаленного выполнения команд, внесения изменений и настройки служб. Когда вы подключаетесь через SSH, вы входите в систему, используя учетную запись, которая существует на удаленном сервере.
Как работает SSH
Когда вы подключаетесь через SSH, вы попадете в сеанс оболочки, который представляет собой текстовый интерфейс, где вы можете взаимодействовать с вашим сервером. Во время сеанса SSH любые команды, которые вы вводите в свой локальный терминал, отправляются через зашифрованный туннель SSH и выполняются на вашем сервере.
Соединение SSH реализовано по модели клиент-сервер. Это означает, что для установки SSH-соединения на удаленной машине должна быть запущена часть программного обеспечения, называемая демоном SSH. Это программное обеспечение прослушивает подключения на определенном сетевом порту, аутентифицирует запросы на подключение и создает соответствующую среду, если пользователь предоставляет правильные учетные данные.
На компьютере пользователя должен быть установлен SSH-клиент. Это часть программного обеспечения, которое знает, как взаимодействовать с использованием протокола SSH, и может получить информацию об удаленном хосте для подключения, используемом имени пользователя и учетных данных, которые необходимо передать для аутентификации. Клиент также может указать определенные сведения о типе соединения, которое он хотел бы установить.
Как SSH аутентифицирует пользователей
Клиенты обычно аутентифицируются либо с помощью паролей (менее безопасно и не рекомендуется), либо с помощью ключей SSH, которые очень безопасны.
Пароли для входа в систему зашифрованы и понятны новым пользователям. Однако автоматические боты и злоумышленники часто неоднократно пытаются пройти аутентификацию в учетных записях, которые разрешают вход на основе пароля, что может привести к нарушению безопасности. По этой причине мы рекомендуем всегда настраивать аутентификацию на основе ключа SSH для большинства конфигураций.
Ключи SSH — это соответствующий набор криптографических ключей, которые можно использовать для аутентификации. Каждый набор содержит открытый и закрытый ключи. Открытый ключ можно свободно передавать без каких-либо опасений, в то время как закрытый ключ должен тщательно охраняться и никогда никому не раскрываться.
Для аутентификации с помощью ключей SSH у пользователя должна быть пара ключей SSH на локальном компьютере. На удаленном сервере открытый ключ необходимо скопировать в файл в домашнем каталоге пользователя по адресу ~/.ssh/authorized_keys
. Этот файл содержит список открытых ключей, по одному на строку, которым разрешен вход в эту учетную запись.
Когда клиент подключается к хосту, желая использовать аутентификацию по ключу SSH, он информирует сервер об этом намерении и сообщает серверу, какой открытый ключ использовать. Затем сервер проверяет свой файл authorized_keys
на наличие открытого ключа, генерирует случайную строку и шифрует ее с помощью открытого ключа. Это зашифрованное сообщение можно расшифровать только с помощью соответствующего закрытого ключа. Сервер отправит это зашифрованное сообщение клиенту, чтобы проверить, действительно ли у него есть связанный закрытый ключ.
Получив это сообщение, клиент расшифрует его с помощью закрытого ключа и объединит полученную случайную строку с ранее согласованным идентификатором сеанса. Затем он генерирует хэш MD5 этого значения и передает его обратно на сервер. У сервера уже было исходное сообщение и идентификатор сеанса, поэтому он может сравнить хэш MD5, сгенерированный этими значениями, и определить, что у клиента должен быть закрытый ключ.
Теперь, когда вы знаете, как работает SSH, мы можем приступить к обсуждению некоторых примеров, демонстрирующих различные способы работы с SSH.
Генерация и работа с ключами SSH
В этом разделе рассказывается, как генерировать SSH-ключи на клиентской машине и распространять открытый ключ на серверах, где они должны использоваться. Это хороший раздел для начала, если вы ранее не сгенерировали ключи из-за повышенной безопасности, которую он обеспечивает для будущих подключений.
Создание пары ключей SSH
Создание новой пары открытого и закрытого ключей SSH на локальном компьютере — это первый шаг к аутентификации на удаленном сервере без пароля. Если нет веской причины не делать этого, вы всегда должны аутентифицироваться с помощью ключей SSH.
Для генерации ключей SSH можно использовать ряд криптографических алгоритмов, включая RSA, DSA и ECDSA. Ключи RSA обычно предпочтительнее и являются типом ключа по умолчанию.
Чтобы сгенерировать пару ключей RSA на локальном компьютере, введите:
- ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
Это приглашение позволяет вам выбрать место для хранения вашего закрытого ключа RSA. Нажмите ENTER
, чтобы оставить это значение по умолчанию, которое сохранит их в скрытом каталоге .ssh
в домашнем каталоге вашего пользователя. Если оставить выбранным расположение по умолчанию, ваш SSH-клиент сможет автоматически находить ключи.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Следующее приглашение позволяет вам ввести парольную фразу произвольной длины для защиты вашего закрытого ключа. По умолчанию вам придется вводить любую парольную фразу, установленную здесь, каждый раз, когда вы используете закрытый ключ, в качестве дополнительной меры безопасности. Не стесняйтесь нажимать ENTER
, чтобы оставить это поле пустым, если вам не нужна кодовая фраза. Имейте в виду, что это позволит любому, кто получит контроль над вашим закрытым ключом, войти на ваши серверы.
Если вы решите ввести парольную фразу, при вводе ничего не будет отображаться. Это мера безопасности.
OutputYour identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
Эта процедура сгенерировала пару ключей SSH RSA, расположенную в скрытом каталоге .ssh
в домашнем каталоге вашего пользователя. Эти файлы:
~/.ssh/id_rsa
: закрытый ключ. НЕ ДЕЛИТЕСЬ ЭТИМ ФАЙЛОМ!~/.ssh/id_rsa.pub
: соответствующий открытый ключ. Этим можно свободно делиться без каких-либо последствий.
Создайте пару ключей SSH с большим количеством битов
Ключи SSH по умолчанию имеют длину 2048 бит. Обычно считается, что этого достаточно для безопасности, но вы можете указать большее количество битов для более надежного ключа.
Для этого включите аргумент -b
с нужным количеством битов. Большинство серверов поддерживают ключи длиной не менее 4096 бит. Более длинные ключи могут не приниматься в целях защиты от DDOS:
- ssh-keygen -b 4096
Если вы ранее создали другой ключ, вас спросят, хотите ли вы перезаписать предыдущий ключ:
Overwrite (y/n)?
Если вы выберете «да», ваш предыдущий ключ будет перезаписан, и вы больше не сможете входить на серверы, используя этот ключ. Из-за этого обязательно перезаписывайте ключи с осторожностью.
Удаление или изменение парольной фразы на закрытом ключе
Если вы создали парольную фразу для своего закрытого ключа и хотите изменить или удалить ее, вы можете легко это сделать.
Примечание. Чтобы изменить или удалить парольную фразу, вы должны знать исходную парольную фразу. Если вы потеряли кодовую фразу к ключу, средства правовой защиты не будет, и вам придется сгенерировать новую пару ключей.
Чтобы изменить или удалить парольную фразу, просто введите:
- ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
Вы можете ввести расположение ключа, который хотите изменить, или нажать ENTER
, чтобы принять значение по умолчанию:
Enter old passphrase:
Введите старый пароль, который вы хотите изменить. Затем вам будет предложено ввести новую парольную фразу:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Здесь введите новую парольную фразу или нажмите ENTER
, чтобы удалить парольную фразу.
Отображение отпечатка ключа SSH
Каждая пара ключей SSH использует один криптографический «отпечаток пальца», который можно использовать для уникальной идентификации ключей. Это может быть полезно в различных ситуациях.
Чтобы узнать отпечаток ключа SSH, введите:
- ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):
Вы можете нажать ENTER
, если это правильное расположение ключа, в противном случае введите измененное местоположение. Вам будет предоставлена строка, содержащая битовую длину ключа, отпечаток пальца, учетную запись и хост, для которого он был создан, а также используемый алгоритм:
Output4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)
Копирование открытого SSH-ключа на сервер с SSH-Copy-ID
Чтобы скопировать ваш открытый ключ на сервер, что позволит вам аутентифицироваться без пароля, можно использовать несколько подходов.
Если у вас в настоящее время настроен доступ к серверу по SSH на основе пароля и у вас установлена утилита ssh-copy-id
, это простой процесс. Инструмент ssh-copy-id
включен в пакеты OpenSSH многих дистрибутивов Linux, поэтому, скорее всего, он установлен по умолчанию.
Если у вас есть эта опция, вы можете легко передать свой открытый ключ, набрав:
- 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
учетной записи пользователя. :
OutputNumber of key(s) added: 1
Now try logging into the machine, with: "ssh 'demo@111.111.11.111'"
and check to make sure that only the key(s) you wanted were added.
Теперь вы можете войти в эту учетную запись без пароля:
- ssh username@remote_host
Копирование открытого SSH-ключа на сервер без SSH-Copy-ID
Если у вас нет доступной утилиты ssh-copy-id
, но у вас есть доступ к удаленному серверу по SSH на основе пароля, вы можете скопировать содержимое открытого ключа другим способом.
Вы можете вывести содержимое ключа и передать его команде ssh
. На удаленной стороне вы можете убедиться, что каталог ~/.ssh
существует, а затем добавить переданное содержимое в файл ~/.ssh/authorized_keys
:
- cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Вам будет предложено ввести пароль для удаленной учетной записи:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
demo@111.111.11.111's password:
После ввода пароля ваш ключ будет скопирован, что позволит вам войти без пароля:
- ssh username@remote_IP_host
Копирование открытого ключа SSH на сервер вручную
Если у вас нет доступа к SSH на основе пароля, вам придется добавить свой открытый ключ на удаленный сервер вручную.
На вашем локальном компьютере вы можете найти содержимое вашего файла открытого ключа, набрав:
- cat ~/.ssh/id_rsa.pub
Outputssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
Вы можете скопировать это значение и вручную вставить его в соответствующее место на удаленном сервере. Вам нужно будет войти на удаленный сервер с помощью других средств (например, веб-консоли DigitalOcean).
На удаленном сервере создайте каталог ~/.ssh
, если он еще не существует:
- mkdir -p ~/.ssh
После этого вы можете создать или добавить файл ~/.ssh/authorized_keys
, набрав:
- echo public_key_string >> ~/.ssh/authorized_keys
Теперь вы сможете войти на удаленный сервер без пароля.
Основные инструкции по подключению
В следующем разделе будут рассмотрены некоторые основы того, как подключиться к серверу с помощью SSH.
Подключение к удаленному серверу
Чтобы подключиться к удаленному серверу и открыть там сеанс оболочки, вы можете использовать команду ssh
.
Самая простая форма предполагает, что ваше имя пользователя на локальном компьютере такое же, как и на удаленном сервере. Если это так, вы можете подключиться, используя:
- ssh remote_host
Если ваше имя пользователя на удаленном сервере отличается, вам необходимо передать имя удаленного пользователя следующим образом:
- ssh username@remote_host
При первом подключении к новому хосту вы увидите сообщение, похожее на это:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Введите yes
, чтобы подтвердить подлинность удаленного хоста.
Если вы используете аутентификацию по паролю, здесь вам будет предложено ввести пароль для удаленной учетной записи. Если вы используете ключи SSH, вам будет предложено ввести парольную фразу вашего закрытого ключа, если она установлена, в противном случае вы войдете в систему автоматически.
Запуск одной команды на удаленном сервере
Чтобы запустить одну команду на удаленном сервере вместо создания сеанса оболочки, вы можете добавить команду после информации о соединении, например:
- ssh username@remote_host command_to_run
Это подключится к удаленному хосту, пройдет аутентификацию с вашими учетными данными и выполнит указанную вами команду. После этого соединение немедленно закроется.
Вход на сервер с другим портом
По умолчанию демон SSH на сервере работает на порту 22
. Ваш SSH-клиент предположит, что это так, при попытке подключения. Если ваш SSH-сервер прослушивает нестандартный порт (это продемонстрировано в следующем разделе), вам нужно будет указать новый номер порта при подключении к вашему клиенту.
Вы можете сделать это, указав номер порта с опцией -p
:
- ssh -p port_num username@remote_host
Чтобы не делать это каждый раз при входе на удаленный сервер, вы можете создать или отредактировать файл конфигурации в каталоге ~/.ssh
в домашнем каталоге вашего локального компьютера.
Отредактируйте или создайте файл сейчас, набрав:
- nano ~/.ssh/config
Здесь вы можете установить параметры конфигурации для конкретного хоста. Чтобы указать новый порт, используйте такой формат:
Host remote_alias
HostName remote_host
Port port_num
Это позволит вам войти в систему, не указывая конкретный номер порта в командной строке.
Добавление ключей SSH к агенту SSH, чтобы избежать ввода парольной фразы
Если у вас есть кодовая фраза для вашего личного SSH-ключа, вам будет предложено вводить парольную фразу каждый раз, когда вы используете ее для подключения к удаленному хосту.
Чтобы не повторять это несколько раз, вы можете запустить агент SSH. Эта небольшая утилита сохраняет ваш закрытый ключ после того, как вы впервые ввели парольную фразу. Он будет доступен на время сеанса вашего терминала, что позволит вам подключаться в будущем без повторного ввода парольной фразы.
Это также важно, если вам нужно переслать свои учетные данные SSH (показано позже).
Чтобы запустить агент SSH, введите в сеансе локального терминала следующее:
- eval $(ssh-agent)
OutputAgent pid 10891
Это запустит программу агента и поместит ее в фоновый режим. Теперь вам нужно добавить свой закрытый ключ в агент, чтобы он мог управлять вашим ключом:
- ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)
Вам нужно будет ввести кодовую фразу (если она установлена). После этого ваш идентификационный файл добавляется в агент, что позволяет вам использовать свой ключ для входа без повторного ввода парольной фразы.
Пересылка ваших учетных данных SSH для использования на сервере
Если вы хотите иметь возможность подключаться без пароля к одному серверу с другого сервера, вам нужно будет переслать информацию о вашем ключе SSH. Это позволит вам аутентифицироваться на другом сервере через сервер, к которому вы подключены, используя учетные данные на вашем локальном компьютере.
Для начала у вас должен быть запущен агент SSH и добавлен ключ SSH к агенту (см. ранее). После этого вам нужно подключиться к вашему первому серверу, используя опцию -A
. Это перенаправит ваши учетные данные на сервер для этого сеанса:
- ssh -A username@remote_host
Отсюда вы можете подключиться по SSH к любому другому хосту, к которому разрешен доступ с помощью вашего ключа SSH. Вы будете подключаться так, как если бы ваш закрытый SSH-ключ находился на этом сервере.
Параметры конфигурации на стороне сервера
Этот раздел содержит некоторые общие параметры конфигурации на стороне сервера, которые могут определить способ ответа вашего сервера и разрешенные типы подключений.
Отключение аутентификации по паролю
Если у вас есть настроенные, протестированные и работающие SSH-ключи, возможно, стоит отключить аутентификацию по паролю. Это предотвратит вход любого пользователя с помощью SSH с использованием пароля.
Для этого подключитесь к удаленному серверу и откройте файл /etc/ssh/sshd_config
с привилегиями root или sudo:
- sudo nano /etc/ssh/sshd_config
Внутри файла найдите директиву PasswordAuthentication
. Если он закомментирован, раскомментируйте его. Установите для него значение no
, чтобы отключить вход с паролем:
PasswordAuthentication no
После внесения изменений сохраните и закройте файл. Чтобы изменения вступили в силу, необходимо перезапустить службу SSH.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Теперь все учетные записи в системе не смогут войти в систему с помощью SSH с использованием паролей.
Изменение порта, на котором работает демон SSH
Некоторые администраторы предлагают изменить порт по умолчанию, на котором работает SSH. Это может помочь уменьшить количество попыток аутентификации вашего сервера от автоматических ботов.
Чтобы изменить порт, который прослушивает демон SSH, вам нужно будет войти на удаленный сервер. Откройте файл sshd_config
в удаленной системе с привилегиями root, либо войдя в систему с этим пользователем, либо с помощью sudo
:
- sudo nano /etc/ssh/sshd_config
Оказавшись внутри, вы можете изменить порт, на котором работает SSH, найдя спецификацию Порт 22
и изменив ее, чтобы отразить порт, который вы хотите использовать. Например, чтобы изменить порт на 4444
, поместите это в свой файл:
#Port 22
Port 4444
Сохраните и закройте файл, когда закончите. Чтобы изменения вступили в силу, необходимо перезапустить демон SSH.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
После перезапуска демона вам потребуется пройти аутентификацию, указав номер порта (как показано в предыдущем разделе).
Ограничение пользователей, которые могут подключаться через SSH
Чтобы явно ограничить учетные записи пользователей, которые могут входить в систему через SSH, вы можете использовать несколько разных подходов, каждый из которых включает редактирование файла конфигурации демона SSH.
На удаленном сервере откройте этот файл с правами root или sudo:
- sudo nano /etc/ssh/sshd_config
Первый способ указать учетные записи, которым разрешен вход, — использовать директиву AllowUsers
. Найдите директиву AllowUsers
в файле. Если такового нет, создайте его где угодно. После директивы перечислите учетные записи пользователей, которым следует разрешить вход через SSH:
AllowUsers user1 user2
Сохраните и закройте файл. Перезапустите демон, чтобы изменения вступили в силу.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Если вам удобнее управлять группами, вы можете вместо этого использовать директиву AllowGroups
. Если это так, просто добавьте одну группу, которой должен быть разрешен доступ по SSH (мы создадим эту группу и мгновенно добавим участников):
AllowGroups sshmembers
Сохраните и закройте файл.
Теперь вы можете создать системную группу (без домашнего каталога), соответствующую указанной вами группе, набрав:
- sudo groupadd -r sshmembers
Убедитесь, что вы добавили в эту группу все учетные записи пользователей, которые вам нужны. Это можно сделать, набрав:
- sudo usermod -a -G sshmembers user1
- sudo usermod -a -G sshmembers user2
Теперь перезапустите демон SSH, чтобы изменения вступили в силу.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Отключение корневого входа
Часто рекомендуется полностью отключить вход в систему root через SSH после того, как вы настроили учетную запись пользователя SSH с привилегиями sudo
.
Для этого откройте файл конфигурации демона SSH с правами root или sudo на удаленном сервере.
- sudo nano /etc/ssh/sshd_config
Внутри найдите директиву PermitRootLogin
. Если он закомментирован, раскомментируйте его. Измените значение на «нет»:
PermitRootLogin no
Сохраните и закройте файл. Чтобы изменения вступили в силу, перезапустите демон SSH.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Разрешение root-доступа для определенных команд
В некоторых случаях вы можете захотеть вообще отключить root-доступ, но включить его, чтобы определенные приложения могли работать правильно. Примером этого может быть процедура резервного копирования.
Это можно сделать с помощью файла authorized_keys
пользователя root, который содержит ключи SSH, которым разрешено использовать учетную запись.
Добавьте ключ со своего локального компьютера, который вы хотите использовать для этого процесса (мы рекомендуем создавать новый ключ для каждого автоматического процесса), в файл authorized_keys
пользователя root на сервере. Мы продемонстрируем здесь команду ssh-copy-id
, но вы можете использовать любой из методов копирования ключей, которые мы обсуждаем в других разделах:
- ssh-copy-id root@remote_host
Теперь войдите на удаленный сервер. Нам нужно будет изменить запись в файле authorized_keys
, поэтому откройте его с правами root или sudo:
- sudo nano /root/.ssh/authorized_keys
В начале строки с загруженным ключом добавьте список command=
, определяющий команду, для которой этот ключ действителен. Это должно включать полный путь к исполняемому файлу, а также любые аргументы:
command="/path/to/command arg1 arg2" ssh-rsa ...
Сохраните и закройте файл, когда закончите.
Теперь откройте файл sshd_config
с правами root или sudo:
- sudo nano /etc/ssh/sshd_config
Найдите директиву PermitRootLogin
и измените значение на forced-commands-only
. Это позволит входам с ключом SSH использовать root только в том случае, если для ключа была указана команда:
PermitRootLogin forced-commands-only
Сохраните и закройте файл. Перезапустите демон SSH, чтобы изменения вступили в силу.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Пересылка дисплеев приложения X клиенту
Демон SSH можно настроить для автоматической переадресации отображения X-приложений на сервере на клиентский компьютер. Чтобы это работало правильно, у клиента должна быть настроена и включена система X windows.
Чтобы включить эту функцию, войдите на удаленный сервер и отредактируйте файл sshd_config
как пользователь root или с правами sudo:
- sudo nano /etc/ssh/sshd_config
Найдите директиву X11Forwarding
. Если он закомментирован, раскомментируйте его. При необходимости создайте его и установите значение «да»:
X11Forwarding yes
Сохраните и закройте файл. Перезапустите демон SSH, чтобы применить эти изменения.
В Ubuntu/Debian:
- sudo service ssh restart
В CentOS/Fedora:
- sudo service sshd restart
Чтобы подключиться к серверу и перенаправить отображение приложения, вы должны передать параметр -X
от клиента при подключении:
- ssh -X username@remote_host
Графические приложения, запущенные на сервере через этот сеанс, должны отображаться на локальном компьютере. Производительность может быть немного медленной, но в крайнем случае это очень полезно.
Параметры конфигурации на стороне клиента
В следующем разделе мы сосредоточимся на некоторых настройках, которые вы можете сделать на клиентской стороне соединения.
Определение информации о соединении для конкретного сервера
На локальном компьютере вы можете определить индивидуальные конфигурации для некоторых или всех серверов, к которым вы подключаетесь. Их можно хранить в файле ~/.ssh/config
, который считывается вашим SSH-клиентом при каждом вызове.
Создайте или откройте этот файл в текстовом редакторе на локальном компьютере:
- nano ~/.ssh/config
Внутри вы можете определить отдельные параметры конфигурации, представив каждый из них ключевым словом Host
, за которым следует псевдоним. Под этим и с отступом вы можете определить любую из директив, которые можно найти на справочной странице ssh_config
:
- man ssh_config
Пример конфигурации:
Host testhost
HostName your_domain
Port 4444
User demo
Затем вы можете подключиться к your_domain
через порт 4444
, используя имя пользователя demo
, просто набрав:
- ssh testhost
Вы также можете использовать подстановочные знаки для соответствия более чем одному хосту. Имейте в виду, что более поздние совпадения могут переопределить более ранние. Из-за этого вы должны размещать наиболее общие совпадения вверху. Например, вы можете по умолчанию запретить переадресацию X для всех подключений с переопределением для your_domain
, добавив это в свой файл:
Host *
ForwardX11 no
Host testhost
HostName your_domain
ForwardX11 yes
Port 4444
User demo
Сохраните и закройте файл, когда закончите.
Поддержание соединений во избежание тайм-аута
Если вы обнаружите, что отключились от сеансов SSH до того, как были готовы, возможно, время ожидания вашего подключения истекло.
Вы можете настроить свой клиент так, чтобы он время от времени отправлял пакет на сервер, чтобы избежать этой ситуации:
На локальном компьютере вы можете настроить это для каждого подключения, отредактировав файл ~/.ssh/config
. Откройте его сейчас:
- nano ~/.ssh/config
Если его еще нет, в верхней части файла определите раздел, который будет соответствовать всем хостам. Установите для ServerAliveInterval
значение \120, чтобы отправлять пакет на сервер каждые две минуты. Этого должно быть достаточно, чтобы уведомить сервер не закрывать соединение:
Host *
ServerAliveInterval 120
Сохраните и закройте файл, когда закончите.
Отключение проверки хоста
По умолчанию всякий раз, когда вы подключаетесь к новому серверу, вам будет показан отпечаток ключа хоста удаленного демона SSH.
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это настроено так, чтобы вы могли проверить подлинность хоста, к которому вы пытаетесь подключиться, и обнаружить случаи, когда злоумышленник может пытаться маскироваться под удаленный хост.
В определенных обстоятельствах вы можете захотеть отключить эту функцию. Примечание. Это может быть большой риск для безопасности, поэтому убедитесь, что вы знаете, что делаете, если вы настроили свою систему таким образом.
Чтобы внести изменения, откройте файл ~/.ssh/config
на локальном компьютере:
- nano ~/.ssh/config
Если его еще нет, в верхней части файла определите раздел, который будет соответствовать всем хостам. Задайте для директивы StrictHostKeyChecking
значение no
, чтобы автоматически добавлять новые хосты в файл known_hosts
. Установите для UserKnownHostsFile
значение /dev/null
, чтобы не получать предупреждения о новых или измененных хостах:
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Вы можете включить проверку в каждом конкретном случае, обратив эти параметры для других хостов. По умолчанию для StrictHostKeyChecking
используется 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-клиента на локальном компьютере:
- nano ~/.ssh/config
Если у вас еще нет определения хоста с подстановочными знаками в начале файла, добавьте его сейчас (как Host *
). Мы будем устанавливать значения ControlMaster
, ControlPath
и ControlPersist
, чтобы установить нашу конфигурацию мультиплексирования.
Для параметра ControlMaster
должно быть установлено значение \auto, чтобы автоматически разрешать мультиплексирование, если это возможно. ControlPath
установит путь к управляющему сокету. Первый сеанс создаст этот сокет. и последующие сеансы смогут найти его, поскольку он помечен именем пользователя, хостом и портом.
Если для параметра ControlPersist
задано значение 1
, исходное основное соединение будет работать в фоновом режиме. 1
указывает, что TCP-соединение должно автоматически завершаться через одну секунду после закрытия последнего сеанса SSH:
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
Сохраните и закройте файл, когда закончите. Теперь нам нужно фактически создать каталог, который мы указали в пути управления:
- mkdir ~/.ssh/multiplex
Теперь любые сеансы, установленные с той же машиной, будут пытаться использовать существующий сокет и TCP-соединение. Когда существует последний сеанс, соединение будет разорвано через одну секунду.
Если по какой-то причине вам нужно временно обойти конфигурацию мультиплексирования, вы можете сделать это, передав флаг -S
с none
:
- ssh -S none username@remote_host
Настройка SSH-туннелей
Туннелирование другого трафика через безопасный туннель SSH — отличный способ обойти ограничительные настройки брандмауэра. Это также отличный способ зашифровать незашифрованный сетевой трафик.
Настройка локального туннелирования на сервер
Соединения SSH можно использовать для туннелирования трафика с портов на локальном хосте на порты на удаленном хосте.
Локальное подключение — это способ доступа к сетевому расположению с локального компьютера через удаленный хост. Сначала устанавливается SSH-соединение с вашим удаленным хостом. На удаленном сервере выполняется подключение к внешнему (или внутреннему) сетевому адресу, предоставленному пользователем, и трафик в это место туннелируется на ваш локальный компьютер через указанный порт.
Это часто используется для туннелирования в менее ограниченную сетевую среду в обход брандмауэра. Другое распространенное использование — доступ к веб-интерфейсу «только для локального хоста» из удаленного места.
Чтобы установить локальный туннель к вашему удаленному серверу, вам нужно использовать параметр -L
при подключении, и вы должны указать три части дополнительной информации:
- Локальный порт, через который вы хотите получить доступ к туннелируемому соединению.
- Хост, к которому вы хотите подключить удаленный хост.
- Порт, к которому вы хотите подключить удаленный хост.
Они задаются в указанном выше порядке (разделенные двоеточиями) в качестве аргументов флага -L
. Мы также будем использовать флаг -f
, который переводит SSH в фоновый режим перед выполнением, и флаг -N
, который не открывает оболочку и не выполняет программу на удаленная сторона.
Например, чтобы подключиться к your_domain
через порт 80 на удаленном хосте, сделав подключение доступным на локальном компьютере через порт 8888, вы можете ввести:
- ssh -f -N -L 8888:your_domain:80 username@remote_host
Теперь, если вы укажете в локальном веб-браузере адрес 127.0.0.1:8888
, вы должны увидеть любой контент в your_domain
через порт 80
.
Более общее руководство по синтаксису:
- ssh -L your_port:site_or_IP_to_access:site_port username@host
Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск порта, который вы перенаправили:
- ps aux | grep 8888
Output1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
Затем вы можете убить процесс, нацелившись на PID, который представляет собой число во втором столбце строки, соответствующей вашей команде SSH:
- kill 5965
Другой вариант — запустить соединение без флага -f
. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время переадресации. Преимущество этого в том, что вы можете легко закрыть туннель, набрав CTRL-C
.
Настройка удаленного туннелирования на сервер
Соединения SSH можно использовать для туннелирования трафика с портов на локальном хосте на порты на удаленном хосте.
В удаленном туннеле устанавливается соединение с удаленным хостом. При создании туннеля указывается удаленный порт. Затем этот порт на удаленном хосте будет туннелирован на комбинацию хоста и порта, к которой подключен локальный компьютер. Это позволит удаленному компьютеру получить доступ к хосту через ваш локальный компьютер.
Это может быть полезно, если вам нужно разрешить доступ к внутренней сети, которая заблокирована для внешних подключений. Если брандмауэр разрешает подключения вне из сети, это позволит вам подключаться к удаленному компьютеру и туннелировать трафик с этого компьютера во внутреннюю сеть.
Чтобы установить удаленный туннель к вашему удаленному серверу, вам необходимо использовать параметр -R
при подключении, и вы должны предоставить три дополнительных элемента информации:
- Порт, через который удаленный хост может получить доступ к туннелированному соединению.
- Хост, к которому вы хотите подключить локальный компьютер.
- Порт, к которому вы хотите подключить локальный компьютер.
Они задаются в указанном выше порядке (разделенные двоеточиями) в качестве аргументов флага -R
. Мы также будем использовать флаг -f
, который переводит SSH в фоновый режим перед выполнением, и флаг -N
, который не открывает оболочку и не выполняет программу на удаленная сторона.
Например, чтобы подключиться к your_domain
через порт 80 на нашем локальном компьютере, сделав подключение доступным на нашем удаленном хосте через порт 8888
, вы можете ввести:
- ssh -f -N -R 8888:your_domain:80 username@remote_host
Теперь на удаленном хосте открытие веб-браузера по адресу 127.0.0.1:8888
позволит вам увидеть любой контент, который находится в your_domain
через порт 80
.
Более общее руководство по синтаксису:
- ssh -R remote_port:site_or_IP_to_access:site_port username@host
Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск порта, который вы перенаправили:
- ps aux | grep 8888
Output1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
Затем вы можете убить процесс, указав PID (число во втором столбце) строки, соответствующей вашей SSH-команде:
- kill 5965
Другой вариант — запустить соединение без флага -f
. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время переадресации. Преимущество этого в том, что вы можете легко закрыть туннель, набрав CTRL-C
.
Настройка динамического туннелирования на удаленный сервер
Соединения SSH можно использовать для туннелирования трафика с портов на локальном хосте на порты на удаленном хосте.
Динамический туннель похож на локальный туннель тем, что позволяет локальному компьютеру подключаться к другим ресурсам через удаленный хост. Динамический туннель делает это, просто указывая один локальный порт. Приложения, которые хотят использовать этот порт для туннелирования, должны иметь возможность обмениваться данными с использованием протокола SOCKS, чтобы пакеты можно было правильно перенаправить на другую сторону туннеля.
Трафик, который передается на этот локальный порт, будет отправлен на удаленный хост. Оттуда протокол SOCKS будет интерпретирован для установления соединения с желаемым конечным местоположением. Эта настройка позволяет приложению с поддержкой SOCKS подключаться к любому количеству местоположений через удаленный сервер без использования нескольких статических туннелей.
Чтобы установить соединение, мы передаем флаг -D
вместе с локальным портом, через который мы хотим получить доступ к туннелю. Мы также будем использовать флаг -f
, который переводит SSH в фоновый режим перед выполнением, и флаг -N
, который не открывает оболочку и не выполняет программу на удаленная сторона.
Например, чтобы установить туннель на порту 7777
, вы можете ввести:
- ssh -f -N -D 7777 username@remote_host
Отсюда вы можете начать указывать вашему SOCKS-совместимому приложению (например, веб-браузеру) выбранный вами порт. Приложение отправит свою информацию в сокет, связанный с портом.
Способ направления трафика на SOCKS-порт зависит от приложения. Например, в Firefox общее расположение — «Настройки» > «Дополнительно» > «Настройки» > «Настройка прокси-сервера вручную». В Chrome вы можете запустить приложение с установленным флагом --proxy-server=
. Вы захотите использовать интерфейс localhost и порт, который вы переадресовали.
Поскольку соединение находится в фоновом режиме, вам нужно будет найти его PID, чтобы убить его. Вы можете сделать это, выполнив поиск порта, который вы перенаправили:
- ps aux | grep 8888
Output1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host
1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888
Затем вы можете убить процесс, указав PID (число во втором столбце) строки, соответствующей вашей SSH-команде:
- kill 5965
Другой вариант — запустить соединение без флага -f
. Это сохранит соединение на переднем плане, не позволяя вам использовать окно терминала на время переадресации. Преимущество этого в том, что вы можете легко закрыть туннель, набрав CTRL-C
.
Использование Escape-кодов SSH для управления соединениями
Даже после установления сеанса SSH можно осуществлять контроль над соединением из терминала. Мы можем сделать это с помощью чего-то, называемого escape-кодами SSH, которые позволяют нам взаимодействовать с нашим локальным программным обеспечением SSH из сеанса.
Принудительное отключение со стороны клиента (как выйти из зависшего или зависшего сеанса)
Одной из самых полезных функций OpenSSH, которая в значительной степени остается незамеченной, является возможность контролировать определенные аспекты сеанса изнутри.
Эти команды можно выполнять, начиная с управляющего символа ~
в сеансе SSH. Команды управления будут интерпретироваться только в том случае, если они вводятся первыми после новой строки, поэтому всегда нажимайте ENTER один или два раза перед их использованием.
Одним из наиболее полезных элементов управления является возможность инициировать отключение от клиента. Соединения SSH обычно закрываются сервером, но это может быть проблемой, если сервер страдает от проблем или если соединение было разорвано. Используя отключение на стороне клиента, соединение может быть полностью закрыто от клиента.
Чтобы закрыть соединение от клиента, используйте управляющий символ (~
) с точкой. Если у вас возникли проблемы с подключением, скорее всего, вы находитесь в зависшем сеансе терминала. Введите команды, несмотря на отсутствие обратной связи, чтобы выполнить отключение на стороне клиента:
- [ENTER]
- ~.
Соединение должно быть немедленно закрыто, и вы вернетесь в локальный сеанс оболочки.
Размещение сеанса SSH в фоновом режиме
Одной из наиболее полезных функций OpenSSH, которая в значительной степени остается незамеченной, является возможность управления определенными аспектами сеанса из соединения.
Эти команды можно выполнять, начиная с управляющего символа ~
из SSH-соединения. Команды управления будут интерпретироваться только в том случае, если они вводятся первыми после новой строки, поэтому всегда нажимайте ENTER
один или два раза перед их использованием.
Одной из возможностей, которую это предоставляет, является перевод сеанса SSH в фоновый режим. Для этого нам нужно указать управляющий символ (~
), а затем выполнить обычную комбинацию клавиш для фоновой задачи (CTRL-z):
- [ENTER]
- ~[CTRL-z]
Это поместит соединение в фоновый режим, вернув вас в локальный сеанс оболочки. Чтобы вернуться к сеансу SSH, вы можете использовать обычные механизмы управления заданиями.
Вы можете немедленно повторно активировать свою последнюю фоновую задачу, набрав:
- fg
Если у вас есть несколько фоновых задач, вы можете увидеть доступные задания, набрав:
- jobs
Output[1]+ Stopped ssh username@some_host
[2] Stopped ssh username@another_host
Затем вы можете вывести любую из задач на передний план, используя индекс в первом столбце со знаком процента:
- fg %2
Изменение параметров переадресации портов для существующего соединения SSH
Одной из наиболее полезных функций OpenSSH, которая в значительной степени остается незамеченной, является возможность управления определенными аспектами сеанса из соединения.
Эти команды можно выполнять, начиная с управляющего символа ~
из SSH-соединения. Команды управления будут интерпретироваться только в том случае, если они вводятся первыми после новой строки, поэтому всегда нажимайте ENTER один или два раза перед их использованием.
Это позволяет пользователю изменить конфигурацию переадресации портов после того, как соединение уже установлено. Это позволяет вам создавать или удалять правила переадресации портов на лету.
Эти возможности являются частью интерфейса командной строки SSH, доступ к которому можно получить во время сеанса с помощью управляющего символа (~
) и \C:
- [ENTER]
- ~C
ssh>
Вам будет предоставлена командная строка SSH с очень ограниченным набором допустимых команд. Чтобы увидеть доступные параметры, вы можете ввести -h
в этом приглашении. Если ничего не возвращается, вам, возможно, придется увеличить уровень детализации вашего вывода SSH, используя ~v
несколько раз:
- [ENTER]
- ~v
- ~v
- ~v
- ~C
- -h
Commands:
-L[bind_address:]port:host:hostport Request local forward
-R[bind_address:]port:host:hostport Request remote forward
-D[bind_address:]port Request dynamic forward
-KL[bind_address:]port Cancel local forward
-KR[bind_address:]port Cancel remote forward
-KD[bind_address:]port Cancel dynamic forward
Как видите, любой из вариантов переадресации можно легко реализовать с помощью соответствующих опций (дополнительную информацию см. в разделе переадресация). Вы также можете уничтожить туннель с помощью соответствующей команды \kill, указанной с помощью \K перед буквой типа переадресации. Например, чтобы уничтожить локальную переадресацию (-L
), вы можете использовать команду -KL
. Вам нужно будет только предоставить порт для этого.
Итак, чтобы настроить переадресацию локального порта, вы можете ввести:
- [ENTER]
- ~C
- -L 8888:127.0.0.1:80
Порт 8888
на вашем локальном компьютере теперь сможет взаимодействовать с веб-сервером на хосте, к которому вы подключаетесь. Когда вы закончите, вы можете разорвать это вперед, набрав:
- [ENTER]
- ~C
- -KL 8888
Заключение
Приведенные выше инструкции должны охватывать большую часть информации о SSH, которая потребуется большинству пользователей в повседневной работе. Если у вас есть другие советы или вы хотите поделиться своими любимыми конфигурациями и методами, не стесняйтесь использовать комментарии ниже.