По умолчанию для подключения к серверу через Secure Shell (SSH) используется пароль. Однако это не самый высокий уровень безопасности. Чтобы защитить систему от несанкционированного доступа, необходимо настроить ключи SSH.
В статье ниже рассмотрим, что такое SSH-ключи и как их использовать для подключения к удаленному серверу — например, серверу Timeweb Cloud.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Secure Shell обеспечивает безопасное удалённое подключение к операционной системе. С его помощью можно получить доступ к оболочке и передавать данные.
Базовая конфигурация состоит из клиента и сервера.
Важное преимущество — кроссплатформенность. Например, вы можете использовать клиент, работающий на Linux, Windows или macOS, для подключения к серверу, работающему на Ubuntu. Это позволит вам получить доступ к командной строке оболочки или выполнить передачу файлов. Все коммуникации между клиентом и сервером зашифрованы, чтобы предотвратить перехват данных посторонними лицами.
Слабость базовой реализации заключается в том, что она полностью зависит от надёжности парольных фраз, которые назначены учётным записям. Если злоумышленник узнает пароль от учётной записи, то система станет уязвимой. Устранить эту слабость помогает аутентификация на основе ключей.
Аутентификация на основе ключей использует асимметричное шифрование, чтобы добавить дополнительный уровень безопасности к удалённому доступу к системе. Концепция шифрования с открытым ключом была разработана в 1975 году Уитфилдом Диффи и Мартином Хеллманом и основана на концепции использования пары ключей — одного приватного (private key) и одного открытого (public key).
Публичная часть этой пары используется для шифрования данных, которые может расшифровать только владелец закрытой части пары.
При настройке аутентификации на основе SSH-ключей приватная часть хранится на хосте, на котором расположен клиент, а соответствующий открытый ключ находится в системе, в которой работает сервер SSH. Важно защитить private key, так как владение им позволит любому войти в удаленную систему. В качестве дополнительного уровня защиты закрытый ключ также может быть зашифрован и защищен паролем, который необходимо вводить каждый раз при установлении соединения с сервером.
Этот подход можно сравнить с пазлом. Представьте, что у вас есть картинка. Вы взяли и разорвали её на две части — сгенерировали уникальную пару. Даже если вы распечатаете такую же картинку еще раз и снова её порвёте, повторить пару не получится.
Одну часть вы отдаёте хосту, а другую храните у себя. При встрече вы показываете свой фрагмент, а хост — свой. Если они совпадают, то вы пожимаете друг другу руки и обмениваетесь данными. Попытаетесь обмануть и подсунуть другой фрагмент — хост ничего не отдаст.
Например, у вас есть сервер на Timeweb Cloud. Необходимо организовать безопасное удалённое управление с помощью SSH. Парольная проверка не подходит. Не только по причине недостаточной безопасности, а ещё и потому, что лень каждый раз вводить длинную фразу.
Логичное решение — настроить аутентификацию по ключу SSH. Для этого нужно сгенерировать пару. Посмотрим, как это делается в разных операционных системах.
Самый простой способ создать пару для аутентификации на Linux и macOS — использовать встроенную утилиту ssh-keygen.
Запустите терминал и выполните команду:
ssh-keygen
Мастер создания предложит выбрать место хранения файлов с аутентификационными данными. Если хотите оставить директорию и имя файла по умолчанию (.ssh/id_rsa), нажмите Enter. Если хотите задать специфическое место хранения, введите путь к нему и нажмите Enter.
Затем мастер предложит добавить парольную фразу для дополнительной защиты. Если не хотите добавлять её, нажмите Enter.
В результате работы ssh-keygen вы получите два файла — с открытым и закрытым ключами. По умолчанию закрытая часть хранится в id_rsa, а открытая — в id_rsa.pub. Но вы можете задавать любые другие имена. Это полезно, если вы с одного компьютера подключаетесь к разным серверам, на которых используются разные данные для аутентификации.
На Windows сгенерировать ключи можно через командную строку PowerShell. В последних версиях она поддерживает утилиту ssh-keygen. Порядок такой же, как на Linux и macOS.
Есть и альтернативный способ — использование набора приложений PuTTY. В него входит также генератор PuTTYgen.
После завершения процесса сохраните файлы в подходящих местах с помощью кнопок Save public key и Save private key.
vds
Закрытый ключ должен храниться на компьютере, с которого вы будете подключаться к серверу. Открытый ключ SSH необходимо перенести на хост, к которому вы хотите подключаться.
Если openssh-server еще не установлен и не запущен на хосте, его можно добавить с помощью следующих команд.
apt install openssh-server
systemctl start sshd.service
systemctl enable sshd.service
Перенести public key можно несколькими способами.
Автоматически перенести значение public key помогает встроенная утилита ssh-copy-id. Этот способ доступен на Linux и macOS.
В терминале выполните команду:
ssh-copy-id имя_пользователя@адрес_сервера
При первом подключении может появиться сообщение о том, что локальный компьютер не распознал удалённый хост. Чтобы запомнить сервер, введите ‘yes’ и нажмите Enter. После этого утилита самостоятельно проверит локальный компьютер и public key. Затем вам будет предложено ввести пароль. Это нужно для того, чтобы установить соединение и перенести открытый ключ.
Содержимое файла с локального компьютера скопируется в ~/.ssh/authorized_keys. Здесь хранятся данные обо всех открытых ключах, которые добавлены на сервер. В ответ в терминале должно отобразиться подобное сообщение:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'username@remote-host'"
and check to make sure that only the key(s) you wanted were added.
Если утилиты ssh-copy-id нет, можно скопировать содержимое файла через Secure Shell, подключенный по паролю. Для этого достаточно выполнить команду:
cat ~/.ssh/id_rsa.pub | ssh имя_пользователя@адрес_сервера "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod go= ~/.ssh/authorized_keys"
Выглядит сложно, но на самом деле это простая операция.
cat ~/.ssh/id_rsa.pub
ssh имя_пользователя@адрес_сервера
В этом примере используется символ перенаправления ‘>>’. Он позволяет не перезаписывать содержимое файла, а дополнять его. Это удобно, если вы добавляете несколько ключей.
Если у вас нет ssh-copy-id (например, вы используете Windows), вы можете подключиться через Secure Shell по паролю, вручную создать файл .ssh/authorized_keys и затем добавить в него public key.
Отобразите содержимое public key на локальной машине командой:
cat ~/.ssh/id_rsa.pub
Скопируйте то, что отобразится в ответе. Формат должен выглядеть так:
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDC4OSYUK5tAsjYMI4mLWDQleLz1d0IBz7G1cfsC9xnMMNYfFUSVzjZzsPVnNKzNwcO6dFs8WiE37gUI8p/ekHghcxWzgEybtAY6LleLJh53LPB1D8YEh92s21p7U0a8rQnGq1LCRQ0y8JFaf9PbmLWJM7llUKhc0YiOIJsQDZxX8g6KYSAaLH+z9Vj8Ag5Hw4BHi0uWL03tX3jImC3DfU2JnzMAuA+EqGjO5eCkGvD5V2fVbpqscig2G2dmjg5E4I2Q7VDlEkBMxG7PJSM3O/l8LnS4a2vICFj2am2Zk1jsGFi66/6yBDQZDsZ+SrCvkTRw0ZikxaRVwCmkF6cgBJn rsa-key-20220602
Затем подключитесь к серверу и создайте каталог ~/.ssh командой:
mkdir -p ~/.ssh
Добавьте public key:
echo public_key_string >> ~/.ssh/authorized_keys
Вместо public_key_string укажите содержимое id_rsa.pub, которое получили на одном из предыдущих шагов. Если authorized_keys нет, система создаст его самостоятельно. Если такой файл уже есть, то вы просто вставите в него новую строку.
Напоследок настройте права доступа к директории ~/.ssh и файлу authorized_keys. Удалите все разрешения «group» и «other» для директории ~/.ssh/:
chmod -R go= ~/.ssh
Установите владельцем директории своего пользователя вместо root:
chown -R username:username ~/.ssh
Если к серверу будут подключаться с разных клиентов, потребуется дополнительная настройка ключей SSH. Используйте ssh-copy-id или вручную отредактируйте .ssh/authorized_keys, чтобы вставить дополнительные ключи. На каждой строке должно храниться только одно значение. Других требований нет.
Всё готово к тому, чтобы подключиться через SSH в Ubuntu.
Запустите командную строку и выполните команду:
ssh имя_пользователя@адрес_сервера
При первом подключении может появиться предупреждение о том, что локальный компьютер не распознаёт удалённый хост. Чтобы запомнить его, введите ‘yes’ и нажмите Enter.
Если вы установили пароль для private key, появится предложение его ввести. Если пароля нет, то вы сразу попадёте в систему.
Если вы создавали ключи с помощью PuTTY, то и устанавливать соединение можете через эту программу.
При успешном подключении PuTTY запустит собственный терминал, через который вы получите доступ к серверу.
При использовании SSH-ключей в Ubuntu становится возможным отключение парольной проверки. Это сделает подключение безопаснее: нет пароля — никто не может его украсть и получить доступ к вашему серверу
Важно: прежде чем отключать пароль, убедитесь, что private key надёжно сохранён и имеет резервную копию. Если вы отключите пароль и затем потеряете закрытый ключ, то не сможете удалённо подключиться к серверу.
В Ubuntu откройте настройки ключей SSH, которые хранятся в sshd_config:
sudo nano /etc/ssh/sshd_config
Найдите строку ‘PasswordAuthentication’ и измените значение ‘yes’ на ‘no’.
Перезапустите службу, чтобы применить конфигурацию:
sudo service ssh restart
Сильный ход с точки зрения безопасности. Злоумышленники могут сколько угодно пытаться подобрать парольную фразу. Этот способ аутентификации больше не работает. Подключиться может только тот пользователь, у которого на компьютере хранится сгенерированный ранее private key.
Подготовили для вас выгодные тарифы на VDS/VPS
По умолчанию Secure Shell разрешает удалённый доступ с использованием аутентификации на основе пароля. Это делает систему уязвимой для любого, кто может угадать пароль или узнать его другими способами.
Для максимальной защиты доступа к системе рекомендуется применять аутентификацию на основе ключей. Она основана на концепции шифрования с использованием открытого и закрытого ключей. Пользователи могут подключиться к серверу только в том случае, если они используют клиент, у которого есть private key, соответствующий public key на сервере. В качестве дополнительного уровня безопасности закрытый ключ также может быть зашифрован и защищён паролем.