Перевод статьи «Things I want to remember about 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-соединение при помощи пароля, а открытый и закрытый ключи генерировались автоматически, нужно отредактировать файл /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 используется для выполнения команд на сервере. Но часто возникает необходимость защищенной передачи файлов на сервер и обратно. Для этого есть следующие варианты: команды 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]