Как настроить аутентификацию на основе ключей 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. По умолчанию она создает пару ключей RSA длиной 3072 бита.

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

ssh-keygen -b 4096

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Синтаксис следующий:

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

Вывод

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

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

Вывод

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

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

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

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

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

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

Полная команда будет выглядеть следующим образом:

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

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

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

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

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

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

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

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

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

ssh-rsa AAAAB3NzaC1yc2EABFABJQAAAQEAlfAjYXFLpLDDMyK0tLAZrIqbHhgQOdLPXfqZX9XFuQMRG99EjGFM4+hbs51e62iZoumibZzUuXDuI39pUjkzh7oKHM4VWy0li56BWNc0q+gMCCzNIoskb2ENsiRyoM4oGUR+Da8X2Tp5LI03EP2k5RCaKqdmX4Wn1fVK+N+VNw2TBd8UJlVB3GGzHeC1BXBfAlW42NOuRE3HBboyCV5JPXlfTdbzDYLwfoo59tstnuL47OWB2Txht9nnotEPqd8ntBSH+DyJFf9h8zMbBhR8NkC8tj7CgPxDslae5UcKYXHF/C7BAy2DAWxUYwyZkVhrJtf0TR81Zlro6DOhSOxCZw== rsa-key-20210908

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий