Представим, что вы арендовали облачный сервер на timeweb.cloud для того, чтобы разместить на нем сайт. После покупки вы получите чистую систему, которую предстоит настраивать — устанавливать веб-сервер, загружать файлы и так далее. Для этого не нужно ехать в дата-центр с флешкой, в таких случаях используется протокол SSH.
SSH (от английского secure shell — защищённая оболочка) — это протокол для удалённого доступа к любым устройствам с операционной системой Linux: компьютерам, серверам, телефонам и так далее. Иными словами, это некий набор правил, позволяющий устанавливать соединение с устройством, которое физически расположено в любой точке мира.
Слово secure в названии протокола значит, что обмен данными между устройствами шифруется, а значит вы можете работать с чувствительной информацией — паролями, кодами доступа и так далее.
Информация передаётся в зашифрованном виде, таким образом повышается безопасность обмена данными, с которыми вы работаете. Соединение и аутентификация осуществляются одним из двух способов:
В статье рассмотрим возможности протокола, синтаксис SSH-команд и настройки демона SSH.
Использовать пароль входа на сервер по протоколу SSH — небезопасно и неудобно. Во-первых, пароль можно подобрать перебором. Во-вторых, может произойти случайная утечка, ведь устройств может быть несколько, а значит и пароли разные, все не запомнить. А в-третьих, это утомительно — каждый раз вводить кодовое слово перед началом сеанса.
Самый надёжный способ — входить в систему с помощью пары ключей RSA.
Сначала нужно создать ключи на локальном компьютере:
ssh-keygen -t rsa
В процессе создания вам нужно будет выбрать расположение файлов ключей и кодовое слово. Если хотите подключаться без пароля, оставляйте поле Passphrase пустым. Passphrase — это кодовое слово, которым дополнительно защищается ключ. Так, если ваш приватный ключ будет скомпрометирован, злоумышленники не смогут им воспользоваться без кодового слова.
Затем нужно отправить на сервер публичный ключ; на его публичность указывает суффикс .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 reload ssh
Чтобы выполнить подключение, на удалённом устройстве должен быть запущен сервер sshd, в Ubuntu он запускается с помощью диспетчера systemd:
sudo systemctl start ssh
Конфигурация сервера sshd находится в файле /etc/ssh/sshd_config
. Рассмотрим основные параметры настройки SSH, которые вы можете использовать.
Порт. По умолчанию sshd отслеживает изменения на 22 порту. Часто злоумышленники пытаются получить доступ к вашему устройству перебором паролей от суперпользователей — root, admin и так далее. Можно усложнить эту задачу и изменить стандартный порт на любой другой с помощью директивы Port.
Однако это не гарантирует полную безопасность, так как существуют скрипты, сканирующие порты устройства. Они определят порт, который «слушает» демон sshd, и всё равно попытаются заполучить доступ. Для большей безопасности рекомендуем закрыть SSH для root-пользователя.
Доступ суперпользователя. Поскольку в основном SSH используется для администрирования удаленных серверов Linux, по умолчанию во всех современных системах удалённый доступ суперпользователя root разрешён. Но это очень небезопасно, так как злоумышленники могут попытаться подобрать пароль и, если смогут попасть в систему, получат полный контроль над устройством. Для того, чтобы избежать таких сценариев, используйте директиву PermitRootLogin
со значением no
.
Протокол. SSH может работать по двум версиям протокола — 1 и 2. Вторая поддерживает больше методов шифрования и способов аутентификации. Если вы хотите использовать только одну из версий, используйте директиву Protocol: Protocol 2
.
Доступ только нескольким пользователям. Ещё больше увеличивает безопасность разрешение удалённого доступа только для определённых пользователей и групп — директивы AllowUsers
и AllowGroups
соответственно. Так, мы можем запретить доступ к серверу всем, кроме администраторов:
AllowUsers adm1, adm2
или
AllowGroups admin, infrastructure
Вы также можете запретить доступ конкретным пользователям с помощью DenyUsers
и DenyGroups
.
Сохранение ошибок. Уровень логгирования можно задать с помощью директивы LogLevel. Она отвечает за уровень наполнения системного журнала, то есть насколько подробно sshd будет будет сохранять сообщения, которые регистрирует. По умолчанию используется INFO
, но в отладочных целях можно поставить VERBOSE
или вовсе отключить журналирование QUIET
.
Доступ по паролю. За возможность попасть на удалённое устройство с помощью пароля отвечает директива PasswordAuthentication
со значениями yes
(по умолчанию) или no
.
После того, как вы внесли изменения и сохранили файл, нужно перезапустить сервер sshd, чтобы новая конфигурация вступила в силу. Перед этим убедитесь, что вы сохранили на сервер файл ключей или оставили доступ по паролю — иначе существует риск остаться без доступа к серверу.
sudo systemctl reload ssh
На Windows-системах вы также можете использовать SSH для подключения к удалённому серверу с помощью специальных приложений. Они удобны тем, что позволяют запомнить данные для подключения или указать разные цветовые схемы для разных сеансов (полезно, когда вы администрируете несколько серверов). Среди наиболее популярных:
Если вы работаете в unix-системах, можно использовать простой терминал или командную строку.
Для удалённого подключения нужно использовать команду SSH с указанием IP-адреса или доменного имени сервера:
ssh example.com
В примере выше предполагается, что имена пользователей в локальной и удалённой системах совпадают. Чаще всего это не так, поэтому приходится отдельно указывать, какое имя использовать при подключении:
ssh remote@example.com
Завершить сеанс можно с помощью команды exit
.
Если при настройке удалённого сервера вы указали порт отличный от 22, то на локальном устройстве вам нужно указать его при подключении, сделать это можно с помощью флага -p
:
ssh -p 222 remote@example.com
Ниже рассмотрим частые и наиболее интересные сценарии использования протокола SSH.
Если на вашем сервере настроен демон 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 позволяют устанавливать безопасный удалённый доступ и передавать файлы по защищённой сети. Чаще всего всего они применяются в случае, когда нужно получить доступ в частную сеть или создать зашифрованный канал.
Для того, чтобы пробросить порт с удалённого сервера, используйте флаг -L
. Для примера рассмотрим случай, когда нам нужно разрешить работу с удалённой базой данных, которая доступна только на локальной машине, порт 3306.
Для этого выполним следующую команду:
ssh -N 53306:127.0.0.1:3306 remote@example.com
В этой команде флаг -N
означает, что на удалённой машине не нужно выполнять команду, 53306
— локальный порт, 127.0.0.1:3306
— адрес, на котором работает сервис MySQL на удалённом сервере.
Подробнее об SSH-туннелях читайте в нашей статье.
SFTP (Secure File Transfer Protocol) — протокол передачи файлов, который работает поверх безопасного канала и является частью OpenSSH, поэтому если у вас корректно работает демон SSH, вы можете использовать SFTP без дополнительной настройки. Главное отличие SFTP от стандартного протокола FTP — шифрование абсолютно любой информации.
Создать сеанс SFTP можно с теми же доступами — логином и паролем или ключом — что и SSH. Кроме этого можно указать порт, если вы меняли его со стандартного 22 на какой-либо другой. Сделайте это с помощью команды:
sftp -oPort=222 remote@example.com
После успешной аутентификации вы окажетесь на удалённом сервере и сможете работать с файлами.
В статье мы разобрали, что такое протокол удалённого управления компьютером и как работает SSH. Знание основ работы этого протокола — незаменимый навык в работе системного администратора и программиста. SSH позволяет подключиться к устройству в любой точке мира и при этом иметь те же самые права и возможности, что и при физической работе с компьютером.
Если вы размещаете в интернете сайт, при этом используете для этого выделенный сервер, то неправильная конфигурация SSH — угроза проникновения злоумышленников в систему, что может привести к непоправимым последствиям.
Любой сервер, который вы арендуете на timeweb.cloud, будет доступен по SSH по умолчанию. А если вам необходимо дополнительно его настроить, наши специалисты всегда на связи.