Памятка по пользованию SSH

Перевод статьи «Things I want to remember about SSH».

SSH-соединение

SSH расшифровывается как Secure Shell — «защищенная/безопасная оболочка». Это протокол для защищенных сетевых соединений. Он широко используется для выполнения команд на удаленных серверах, а также для загрузки и скачивания файлов. Если вы работаете с Django, используете систему контроля версий Git или занимаетесь администрированием серверов, вы наверняка пользуетесь SSH. В этом посте я хочу поделиться некоторыми техническими деталями использования этого протокола.

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

Создание пары SSH-ключей вручную

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

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

$ ssh-keygen
$ ssh-agent /usr/local/bin/bash
$ ssh-add ~/.ssh/id_rsa

id_rsa это дефолтное название файла с закрытым ключом SSH. Файл открытого ключа будет называться id_rsa.pub. По умолчанию оба файла размещены в директории ~/.ssh/.

При запуске команды ssh-keygen можно выбрать другие названия файлов ключей и даже добавить пароль. Например, у вас могут быть специальные ключи github_id_rsa и github_id_rsa.pub — для коммуникации с GitHub. Я рекомендую для каждого отдельного сервиса создавать отдельную пару ключей. Таким образом, если случится переносить данные на другую машину, вы сможете выбрать, к каким удаленным серверам предоставить доступ на этой новой машине.

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

Создание доступа к удаленному серверу при помощи SSH-ключа

В случае с GitHub, Bitbucket и подобными им онлайн-сервисами для установления SSH-соединений вам нужно скопировать содержимое файла с открытым ключом (собственно, открытый ключ) и вставить его в текстовое поле веб-формы.

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

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

$ cat ~/.ssh/id_rsa.pub

После этого просто скопируйте вывод команды.

На macOS воспользуйтесь pbcopy:

$ pbcopy < ~/.ssh/id_rsa.pub 

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

$  echo "…вставленный_открытый_ключ…">>~/.ssh/authorized_keys
SSH-соединение при помощи ключей

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

Если вы хотите сделать так, чтобы пользователь мог устанавливать SSH-соединение при помощи пароля, а открытый и закрытый ключи генерировались автоматически, нужно отредактировать файл /etc/ssh/sshd_config и установить следующие настройки:

PasswordAuthentication yes
PermitEmptyPasswords no

После сохранения изменений нужно перезапустить ssh-сервер при помощи следующей команды:

$ sudo service ssh restart

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

$ sudo passwd имя_пользователя

Соединение с удаленным сервером

Чтобы подсоединиться через SSH к удаленному серверу (в нашем случае — example.com) при помощи пароля, выполните в терминале следующую команду:

$ ssh имя_пользователя@example.com

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

$ ssh -i ~/.ssh/examplecom_id_rsa имя_пользователя@example.com

А теперь давайте посмотрим, как можно упростить процедуру подсоединения при помощи кое-каких локальных настроек SSH.

Настройка локального SSH-клиента

Отредактируйте файл ~/.ssh/config, добавив следующие строки для каждого нужного вам SSH-соединения:

Host examplecom
     HostName example.com
     User имя_пользователя
     IdentityFile ~/.ssh/examplecom_id_rsa

Если доменное имя сайта еще не указывает на IP-адрес сервера, вы также можете коннектиться по IP-адресу:

Host examplecom
     HostName 1.2.3.4
     User имя_пользователя
     IdentityFile ~/.ssh/examplecom_id_rsa

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

$ ssh examplecom

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

Host examplecom
     HostName example.com
     User имя_пользователя
     PubkeyAuthentication=no

Когда вы устанавливаете SSH-соединение и ничего не вводите около 30 минут, соединение обрывается. Но вы можете сделать так, чтобы ваш клиент коннектился к серверу, скажем, каждые 4 минуты. Для этого добавьте следующие строки в начало файла ~/.ssh/config на вашем локальном компьютере:

Host *
     ServerAliveInterval 240
SSH-соединение при помощи пароля

Загрузка и скачивание файлов по SSH

Обычно SSH используется для выполнения команд на сервере. Но часто возникает необходимость защищенной передачи файлов на сервер и обратно. Для этого есть следующие варианты: команды scp и rsync или FTP-клиент с поддержкой SFTP.

scp

Название команды scp расшифровывается как Secure Copy («защищенное/безопасное копирование»).

Ниже вы видите пример, как при помощи этой команды можно скопировать файл secrets.json с удаленного сервера в вашу локальную среду разработки:

$ scp имя_пользователя@example.com:~/src/myproject/myproject/settings/secrets.json ./myproject/settings/secrets.json

А в этом примере мы делаем то же самое, но с пользовательскими настройками в файле ~/.ssh/config:

$ scp examplecom:~/src/myproject/myproject/settings/secrets.json ./myproject/settings/secrets.json

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

$ scp ./myproject/settings/secrets.json examplecom:~/src/myproject/myproject/settings/secrets.json

rsync

Для синхронизации директорий на компьютере и сервере можно использовать команду rsync. Вот пример для директории media/ (обратите внимание, что слэш в конце важен):

$ rsync --archive --compress --partial --progress имя_пользователя@example.com:~/src/myproject/myproject/media/ ./myproject/media/

Вот тот же пример, но с пользовательскими настройками в файле ~/.ssh/config:

$ rsync --archive --compress --partial --progress examplecom:~/src/myproject/myproject/media/ ./myproject/media/

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

$ rsync --archive --compress --partial --progress ./myproject/media/ examplecom:~/src/myproject/myproject/media/

sftp

FTP-клиенты вроде Transmit дают вам возможность устанавливать SFTP-соединения или при помощи имени и пароля, или при помощи имени и закрытого ключа. Вы даже можете сгенерировать пару ключей прямо в приложении.

SFTP работает так же, как FTP, но здесь соединение шифруется.

Заключение

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

[customscript]techrocks_custom_after_post_html[/customscript]

[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх