Как настроить аутентификацию на основе ключей SSH на сервере Linux

Вступление

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

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

Как работают ключи SSH?

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

Хотя пароли отправляются на сервер безопасным способом, они, как правило, не являются сложными или достаточно длинными, чтобы противостоять постоянным злоумышленникам. Современная вычислительная мощность в сочетании с автоматизированными сценариями делает возможным грубое форсирование защищенной паролем учетной записи. Хотя существуют и другие способы добавления дополнительной защиты (+ fail2ban + и т. Д.), Ключи SSH оказываются надежной и безопасной альтернативой.

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

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

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

Открытый ключ загружается на удаленный сервер, на который вы хотите войти с помощью SSH. Ключ добавляется в специальный файл в учетной записи пользователя, в который вы будете входить, с именем + ~ / .ssh / authorized_keys +.

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

Как создать SSH ключи

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

Для этого мы можем использовать специальную утилиту + ssh-keygen +, которая входит в стандартный набор инструментов OpenSSH. По умолчанию это создаст 2048-битную пару ключей RSA, что подходит для большинства применений.

На локальном компьютере сгенерируйте пару ключей SSH, набрав:

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home//.ssh/id_rsa):

Утилита предложит вам выбрать расположение для ключей, которые будут сгенерированы. По умолчанию ключи будут храниться в каталоге + ~ / .ssh + в домашнем каталоге вашего пользователя. Закрытый ключ будет называться + id_rsa +, а связанный с ним открытый ключ будет называться + id_rsa.pub +.

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

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

/home//.ssh/id_rsa already exists.
Overwrite (y/n)?

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

Created directory '/home//.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

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

Вам может быть интересно узнать, какие преимущества дает ключ SSH, если вам все еще нужно ввести кодовую фразу. Некоторые из преимуществ:

  • Закрытый ключ SSH (часть, которая может быть защищена парольной фразой), никогда не раскрывается в сети. Фраза-пароль используется только для расшифровки ключа на локальном компьютере. Это означает, что сетевое перебор не будет возможен против парольной фразы.

  • Закрытый ключ хранится в ограниченном каталоге. Клиент SSH не распознает закрытые ключи, которые не хранятся в ограниченных каталогах. Сам ключ также должен иметь ограниченные разрешения (чтение и запись доступны только для владельца). Это означает, что другие пользователи в системе не могут отслеживать.

  • Любой злоумышленник, надеющийся взломать секретную фразу-ключ SSH, должен уже иметь доступ к системе. Это означает, что у них уже будет доступ к вашей учетной записи пользователя или учетной записи root. Если вы находитесь в этом положении, фраза-пароль может помешать атакующему немедленно войти на другие ваши серверы. Надеемся, что это даст вам время для создания и реализации новой пары ключей SSH и удаления доступа из скомпрометированного ключа.

Поскольку закрытый ключ никогда не раскрывается в сети и защищен через права доступа к файлу, этот файл никогда не должен быть доступен никому, кроме вас (и пользователя root). Фраза-пароль служит дополнительным уровнем защиты в случае нарушения этих условий.

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

Your identification has been saved in /home//.ssh/id_rsa.
Your public key has been saved in /home//.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 @remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

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

Как встроить ваш открытый ключ при создании вашего сервера

Если вы запускаете новый сервер DigitalOcean, вы можете автоматически встраивать свой открытый ключ SSH в корневую учетную запись вашего нового сервера.

В нижней части страницы создания дроплета есть возможность добавить SSH-ключи на ваш сервер:

изображение: https: //assets.digitalocean.com/articles/ssh_key_overview/key_options.png [вставка ключа SSH]

Если вы уже добавили файл открытого ключа в свою учетную запись DigitalOcean, вы увидите его здесь как вариант выбора (в приведенном выше примере есть два существующих ключа: «Рабочий ключ» и «Домашний ключ»). Чтобы вставить существующий ключ, просто нажмите на него, и он будет выделен. Вы можете встроить несколько ключей на одном сервере:

изображение: https: //assets.digitalocean.com/articles/ssh_key_overview/key_selection.png [выбор ключа SSH]

Если у вас еще нет открытого ключа SSH, загруженного в вашу учетную запись, или если вы хотите добавить новый ключ в свою учетную запись, нажмите кнопку «+ Добавить ключ SSH». Это расширится до приглашения:

изображение: https: //assets.digitalocean.com/articles/ssh_key_overview/key_prompt.png [Подсказка ключа SSH]

В поле «Содержимое ключа SSH» вставьте содержимое вашего открытого ключа SSH. Предполагая, что вы сгенерировали ключи с помощью описанного выше метода, вы можете получить содержимое открытого ключа на локальном компьютере, набрав:

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]

Вставьте это значение целиком в большую рамку. В поле «Комментарий (необязательно)» вы можете выбрать метку для ключа. Это будет отображаться как имя ключа в интерфейсе DigitalOcean:

изображение: https: //assets.digitalocean.com/articles/ssh_key_overview/new_key.png [SSH новый ключ]

Когда вы создаете Droplet, выбранные вами открытые SSH-ключи будут помещены в файл + ~ / .ssh / authorized_keys + учетной записи пользователя root. Это позволит вам войти на сервер с компьютера с помощью вашего закрытого ключа.

Как скопировать открытый ключ на ваш сервер

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

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

Копирование вашего открытого ключа с использованием SSH-Copy-ID

Самый простой способ скопировать ваш открытый ключ на существующий сервер - использовать утилиту + ssh-copy-id +. Из-за своей простоты этот метод рекомендуется, если он доступен.

Инструмент + ssh-copy-id + включен в пакеты OpenSSH во многих дистрибутивах, поэтому он может быть доступен в вашей локальной системе. Чтобы этот метод работал, у вас уже должен быть SSH-доступ на основе пароля к вашему серверу.

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

Синтаксис:

ssh-copy-id @

Вы можете увидеть сообщение, подобное этому:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это просто означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите «да» и нажмите клавишу ВВОД, чтобы продолжить.

Затем утилита просканирует вашу локальную учетную запись на ключ + id_rsa.pub, который мы создали ранее. Когда он находит ключ, он запрашивает пароль учетной записи удаленного пользователя:

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Введите пароль (ваш ввод не будет отображаться в целях безопасности) и нажмите клавишу ВВОД. Утилита подключится к учетной записи на удаленном хосте, используя предоставленный вами пароль. Затем он скопирует содержимое вашего ключа + ~ / .ssh / id_rsa.pub + в файл в домашней директории + ~ / .ssh + удаленной учетной записи, называемый + authorized_keys +.

Вы увидите вывод, который выглядит следующим образом:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

На этом этапе ваш ключ + id_rsa.pub + был загружен в удаленную учетную запись. Вы можете перейти к следующему разделу.

Копирование вашего открытого ключа с использованием SSH

Если у вас нет + ssh-copy-id +, но у вас есть SSH-доступ на основе пароля к учетной записи на вашем сервере, вы можете загрузить свои ключи, используя обычный метод SSH.

Мы можем сделать это путем вывода содержимого нашего открытого ключа SSH на наш локальный компьютер и передачи по SSH-соединению с удаленным сервером. С другой стороны, мы можем убедиться, что каталог + ~ / .ssh + существует под используемой нами учетной записью, и затем вывести содержимое, которое мы передали, в файл с именем + authorized_keys + внутри этого каталога.

Мы будем использовать символ перенаправления + >> + для добавления содержимого вместо его перезаписи. Это позволит нам добавлять ключи без уничтожения ранее добавленных ключей.

Полная команда будет выглядеть так:

cat ~/.ssh/id_rsa.pub | ssh @ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Вы можете увидеть сообщение, подобное этому:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это просто означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите «да» и нажмите клавишу ВВОД, чтобы продолжить.

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

[email protected]'s password:

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

Копирование вашего открытого ключа вручную

Если у вас нет доступа по SSH к вашему серверу по паролю, вам придется выполнить описанный выше процесс вручную.

Содержимое вашего файла + id_rsa.pub + должно быть каким-то образом добавлено в файл с именем + ~ / .ssh / authorized_keys + на вашей удаленной машине.

Чтобы отобразить содержимое вашего ключа + id_rsa.pub +, введите его на свой локальный компьютер:

cat ~/.ssh/id_rsa.pub

Вы увидите содержимое ключа, которое может выглядеть примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

Получите доступ к удаленному хосту любым доступным вам способом. Например, если ваш сервер представляет собой дроплет DigitalOcean, вы можете войти в систему с помощью веб-консоли на панели управления:

изображение: https: //assets.digitalocean.com/articles/ssh_key_overview/console_access.png [доступ к консоли DigitalOcean]

Получив доступ к своей учетной записи на удаленном сервере, вы должны убедиться, что каталог + ~ / .ssh + создан. Эта команда создаст каталог при необходимости или ничего не сделает, если он уже существует:

mkdir -p ~/.ssh

Теперь вы можете создать или изменить файл + authorized_keys + в этом каталоге. Вы можете добавить содержимое вашего файла + id_rsa.pub + в конец файла + authorized_keys +, создав его при необходимости, используя это:

echo  >> ~/.ssh/authorized_keys

В приведенной выше команде замените ++ выводом команды + cat ~ / .ssh / id_rsa.pub, которую вы выполнили в локальной системе. Он должен начинаться с + ssh-rsa AAAA …​ +.

Если это работает, вы можете перейти к аутентификации без пароля.

Выполните аутентификацию на вашем сервере с помощью ключей SSH

Если вы успешно выполнили одну из вышеуказанных процедур, вы сможете войти на удаленный хост без пароля удаленной учетной записи.

Основной процесс такой же:

ssh @

Если вы впервые подключаетесь к этому хосту (если вы использовали последний метод выше), вы можете увидеть что-то вроде этого:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это просто означает, что ваш локальный компьютер не распознает удаленный хост. Введите «да», а затем нажмите клавишу ВВОД, чтобы продолжить.

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

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

Отключение аутентификации по паролю на вашем сервере

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

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

Если вышеприведенные условия выполнены, войдите на удаленный сервер с ключами SSH, либо с правами root, либо с учетной записью с привилегиями + sudo +. Откройте файл конфигурации демона SSH:

sudo nano /etc/ssh/sshd_config

Внутри файла найдите директиву + PasswordAuthentication +. Это может быть закомментировано. Раскомментируйте строку и установите значение «нет». Это отключит вашу возможность входа через SSH с использованием паролей учетных записей:

PasswordAuthentication no

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

На машинах с Ubuntu или Debian вы можете выполнить эту команду:

sudo service ssh restart

На машинах CentOS / Fedora демон называется + sshd +:

sudo service sshd restart

Выполнив этот шаг, вы успешно перенесли своего SSH-демона, чтобы он отвечал только на SSH-ключи.

Заключение

Теперь на вашем сервере должна быть настроена и запущена аутентификация на основе ключей SSH, что позволяет вам входить без предоставления пароля учетной записи. Отсюда есть много направлений, по которым можно идти. Если вы хотите узнать больше о работе с SSH, взгляните на наш https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys [ Руководство по основам SSH.

Related