Поиск по сайту:

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


Введение

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

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

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

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

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

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

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

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

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

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

Шаг 1 — Создание ключей SSH

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Output
Your identification has been saved in /home/username/.ssh/id_rsa. Your public key has been saved in /home/username/.ssh/id_rsa.pub. The key fingerprint is: SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname The key's randomart image is: +---[RSA 3072]----+ |o ..oo.++o .. | | o o +o.o.+... | |. . + oE.o.o . | | . . oo.B+ .o | | . .=S.+ + | | . o..* | | .+= o | | .=.+ | | .oo+ | +----[SHA256]-----+

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

Шаг 2 — Копирование открытого ключа SSH на ваш сервер

Примечание. В предыдущей версии этого руководства были инструкции по добавлению открытого ключа SSH в вашу учетную запись DigitalOcean. Эти инструкции теперь можно найти в разделе Ключи SSH нашей документации по продукту DigitalOcean.

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

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

Копирование открытого ключа с помощью ssh-copy-id

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

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

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

Синтаксис:

  1. ssh-copy-id username@remote_host

Вы можете увидеть такое сообщение:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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

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

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

Output
/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 username@203.0.113.1's password:

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

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

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'username@203.0.113.1'" 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. внутри этого каталога.

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

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

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

Вы можете увидеть такое сообщение:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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

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

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

Output
username@203.0.113.1's password:

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

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

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

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

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

  1. 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== username@hostname

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

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

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

  1. mkdir -p ~/.ssh

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

  1. echo public_key_string >> ~/.ssh/authorized_keys

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

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

Шаг 3 — Аутентификация на вашем сервере с использованием ключей SSH

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

Процесс в основном такой же:

  1. ssh username@remote_host

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

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' 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

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

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

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

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

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

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

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

  1. sudo nano /etc/ssh/sshd_config

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

PasswordAuthentication no

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

В большинстве дистрибутивов Linux для этого можно ввести следующую команду:

  1. sudo systemctl restart ssh

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

Заключение

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