Как пользоваться SSH

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

SSH (Secure Shell) — это протокол, позволяющий осуществлять удаленный доступ к устройствам с операционной системой Linux, таким как компьютеры, серверы, телефоны и др. Это набор правил, который позволяет установить безопасное соединение с устройством, расположенным в любой точке мира.

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

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

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

Вход в систему с помощью ключей

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

Самый безопасный способ входа в систему — использование пары ключей RSA.

Сначала ключи необходимо создать на локальном компьютере с помощью команды:

  • ssh-keygen -t rsa

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

Далее открытый ключ необходимо отправить на сервер. Открытый ключ обозначается суффиксом .pub и должен иметь права на чтение для всех пользователей:

  • ssh-copy-id -p 222 -i ~/.ssh/id_rsa.pub remote@example.com

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

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

  • PasswordAuthentication no — отключает вход по паролю.
  • PubkeyAuthentication yes — разрешает аутентификацию по ключу SSH.
  • ChallengeResponseAuthentication no — отключает аутентификацию PAM.

После обновления файла перезагрузите демон SSH:

  • sudo systemctl перезагрузить ssh

Настройка SSH

Для установления соединения на удаленном устройстве должен быть запущен сервер sshd, который запускается в Ubuntu с помощью диспетчера systemd:

  • sudo systemctl запустить ssh

Конфигурацию сервера sshd можно найти в файле /etc/ssh/sshd_config.

Порт. По умолчанию sshd прослушивает изменения на порту 22. Хакеры часто пытаются получить доступ к вашему устройству путем подбора паролей суперпользователя, таких как root, admin и т. д. Вы можете сделать это более сложным, изменив порт по умолчанию на любой другой с помощью директивы Port. Однако это не гарантирует полной безопасности, так как существуют скрипты, сканирующие порты устройства. Они обнаружат порт, который прослушивает демон sshd, и попытаются получить доступ. Для большей безопасности рекомендуется закрыть доступ по SSH для пользователя root.

Доступ суперпользователя. Поскольку SSH в основном используется для администрирования удаленных серверов Linux, удаленный доступ для суперпользователя root разрешен по умолчанию во всех современных системах. Однако это очень небезопасно, так как хакеры могут попытаться подобрать пароль и, если им удастся проникнуть в систему, получить полный контроль над устройством. Чтобы избежать таких сценариев, используйте директиву PermitRootLogin со значением «нет».

Протокол. SSH может работать с использованием двух версий протокола — 1 и 2. Вторая поддерживает больше методов шифрования и методов аутентификации. Если вы хотите использовать только одну из версий, используйте директиву Protocol: Protocol 2.

Доступ для конкретных пользователей. Для дальнейшего повышения безопасности вы можете разрешить удаленный доступ только для определенных пользователей и групп, используя директивы AllowUsers и AllowGroups соответственно. Например, вы можете запретить доступ к серверу всем, кроме администраторов:

Вы также можете запретить доступ определенным пользователям, используя DenyUsers и DenyGroups.

Протоколирование ошибок. Вы можете установить уровень ведения журнала с помощью директивы LogLevel, которая отвечает за уровень содержимого в системном журнале, т. е. насколько подробно sshd будет сохранять сообщения, которые он регистрирует. По умолчанию используется INFO, но в целях отладки вы можете установить для него значение VERBOSE или полностью отключить ведение журнала с помощью QUIET.

Доступ по паролю. Директива PasswordAuthentication отвечает за возможность доступа к удаленному устройству с помощью пароля со значением по умолчанию «да».

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

  • sudo systemctl перезагрузить ssh

SSH клиенты

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

  1. PuTTY
  2. WinSCP
  3. Termius
  4. FileZilla — для передачи данных по SFTP
  5. MobaXterm

Синтаксис

Для удаленного подключения к серверу необходимо использовать команду SSH, указав IP-адрес или доменное имя сервера:

  • ssh example.com

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

  • ssh remote@example.com

Сеанс можно завершить с помощью команды exit.

Если во время настройки удаленного сервера был задан порт, отличный от 22, то для подключения к серверу с локального устройства необходимо указать этот порт с помощью флага -p:

Передача файлов

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

Для передачи файла filename.txt на удаленное устройство с адресом example.com и размещения его в каталоге ~/trash/txt, нужно использовать следующую команду:

  • scp filename.txt remote@example.com:~/trash/txt

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

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

Допустим, нужно скопировать каталог images с сервера на локальный компьютер в папку documents:

  • scp -r remote@example.com:~/images ~/documents/

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

SSH-туннелирование

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

Для установки порт-туннеля через удаленный сервер используйте флаг -L. Рассмотрим пример использования, когда необходимо получить доступ к удаленной базе данных MySQL, которая доступна только на локальном порту 3306.

Для создания туннеля выполните следующую команду:

  • ssh -N -L 53306:127.0.0.1:3306 remote@example.com

В данной команде флаг -N указывает, что на удаленном сервере не нужно выполнять команды. 53306 — это локальный порт, который вы выбираете, и который будет использоваться для доступа к удаленному порту 3306. Адрес 127.0.0.1:3306 указывает на то, что MySQL работает на удаленном сервере на локальном адресе 127.0.0.1 (localhost) и на порту 3306.

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

SFTP

SFTP (Secure File Transfer Protocol) — это протокол передачи файлов, который работает по защищенному каналу и является частью OpenSSH, поэтому, если ваш демон SSH работает правильно, вы можете использовать SFTP без какой-либо дополнительной настройки. Основное различие между SFTP и стандартным FTP заключается в том, что SFTP шифрует всю информацию.

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

  • sftp -oPort=222 remote@example.com

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