Главная >> Сервер >> Авторизация по ключу SSH

Авторизация по ключу SSH

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

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


Содержание статьи

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

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

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

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

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

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

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

Итак, генерация ключей ssh выполняется командой:

ssh-keygen

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

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

  • Пароль никогда не попадет в сеть, он используется только на локальной машине для расшифровки ключа. Это значит что перебор по паролю больше невозможен.
  • Секретный ключ хранится в закрытом каталоге и у клиента ssh нет к нему доступа пока вы не введете пароль;
  • Если злоумышленник хочет взломать аутентификацию по ключу SSH, ему понадобится доступ к вашей системе. И даже тогда ключевая фраза может стать серьезной помехой на его пути.

Но все же, это необязательное дополнение и если не хотите, то вы можете просто нажать Enter. Тогда доступ по ключу ssh будет выполняться автоматически и вам не нужно будет что-либо вводить.

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

Загрузка ключа на сервер

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

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

ssh-copy-id username@remote_host

При первом подключении к серверу система может его не распознать, поэтому вам нужно ввести yes. Затем введите ваш пароль пользователя на удаленном сервере. Утилита подключится к удаленному серверу, а затем использует содержимое ключа id.rsa.pub для загрузки его на сервер в файл ~/.ssh/authorized_keys. Дальше вы можете выполнять аутентификацию с помощью этого ключа.

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

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

Здесь вам тоже нужно набрать yes, если вы подключаетесь к новому серверу, а затем ввести пароль. Теперь вы можете использовать созданный ключ для аутентификации на сервере:

 ssh username@remote_host

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

Отключение проверки пароля

Если пароль больше не будет использоваться, то для увеличения безопасности системы лучше его вовсе отключить. Но убедитесь, что ключ надежно сохранен и вы его не потеряете, потому что по паролю вы больше не войдете. Авторизуйтесь на сервере, затем откройте конфигурационный файл /etc/ssh/sshd_config и найдите там директиву PasswordAuthenticatin. Нужно установить ее значение в No:

sudo vi /etc/ssh/sshd_config

PasswordAuthentication no

Теперь сохраните файл и перезапустите службу ssh:

sudo service ssh restart

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

Выводы

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

29 комментариев к “Авторизация по ключу SSH”

  1. Вы создаёте ключи под пользователем Sergiy? А подключаетесь потом на удалённый сервер под root. Это правильно? Я например, хочу сделать у себя так: отключить вход root на сервер (PermitRootLogin no), и подключаться под своей локальной УЗ на все серверы. После того, как я захожу на сервер, я повышаю свои права до root. Как мне настроить аутентификацию по ключам в таком случае?

    Ответить
    • нужно в папке home/.ssh создать файл authorized_keys
      туда кинуть ключ
      поменять права на папку
      # mkdir ~/.ssh
      # chmod 0700 ~/.ssh
      # touch ~/.ssh/authorized_keys
      # chmod 0644 ~/.ssh/authorized_keys

      Ответить
    • ssh-keygen затем ssh-copy-id username@remote_host далее проверяем работает ли всё как нужно ssh username@remote_host и если пустил сервер не запрашивая пароля то sudo nano /etc/ssh/sshd_config включаем параметр PasswordAuthentication yes (удалив перед ним #) и меняем yes на no сохраняемся и всё,доступ к серверу только по ключу пользователя ,как root`a и как либо ещё уже не пустит ,для получения супер прав,после того как вошли на сервер sudo -i и ввод пароля юзера ну или su и его пароль

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

    Ответить
  3. Теж спочатку не зрозумів, бо автор вказав ім'я файлу "у", натомість не треба ні чого писати, якщо все робити за статтею, то після вводу "ssh-keygen" просто 3 рази Enter.

    Ответить
  4. Сразу видно "программист" писал... не понятно куда что копировать и как вручную добавить ключ в какой файл на какой машине

    Ответить
  5. Проверял несколько раз, через некоторое количество удачных сеансов потом при попытке подключиться к серверу по команде ssh username@remote_host - сервер не пускает.
    Надо указывать ключ: ssh -i ~/.ssh/id_rsa username@remote_host, что не очень удобно.
    Проще создать создать конфигурационный файл ~/.ssh/config такого формата:
    ========================
    Host host1 #"имя по желанию"#
    HostName x.x.x.x #"Здесь IP или доменное имя сервера, без разницы"
    User root #"Или другой пользователь, который есть на сервере"
    Port 60000 #"Указываем порт. Лучше, как советовал автор, 22 не использовать"
    IdentityFile ~/.ssh/id_rsa #"Его закрытый ключ"#

    Host host2
    HostName ...............................
    User .....................
    Port 61000
    IdentityFile ~/.ssh/................

    Host host3
    .......................................................
    ==============================
    Теперь подключаться можно простой командой, например к первому хосту:
    ssh host1
    Важно только, чтобы конфиг назывался именно config и находился в папке ~/.ssh/

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

    Ответить
    • SFTP точно также будет работать.
      Только подключаться через утилиту sshfs надо немножко не так, как через ssh. Для указания приватного ключа, нужно указывать опцию не -i, а -o IdentityFile= Пример:
      sshfs -C -p 9087 -o IdentityFile=~/.ssh/id_rsa_root root@195.95.171.2:/ /media/vds

      Ответить
  7. а так?

    mkdir ~/.ssh # это делаем только первый раз)
    ssh-keygen -t rsa -b 4096 -q -N 'вашаУжастнаяПарольнаяФраза' -f ~/.ssh/id_rsa
    ssh-copy-id -i ~/.ssh/id_rsa.pub логин@вашСервер

    далее
    Are you sure you want to continue connecting (yes/no)? yes

    и
    входим по паролю

    и
    вуаля:
    Number of key(s) added: 1

    Ответить
  8. Парни, как должен выглядеть копируемый текст публичного ключа?
    Если я генерирую ключ в Линуксе, то файл .pub содержит такой текст:

    ssh-rsa AAAAB3NzaC1yc2......0iP2JqKNoyn valerygl@UBUNTU-530
    (все в одну строку без переносов, заканчивается на имя компа)

    если я генерирую ключ в Винде (PUTTY), то файл содержит

    ---- BEGIN SSH2 PUBLIC KEY ----
    Comment: "rsa-key-20200730"
    AAAAB3NzaC1yc2EAAAABJQAAAQEA48AQWGzfdPrO6UZw8EYH2svNsNKntj1T/CDa
    .....
    9ZmUakRYMjQBJ9okIPGsJRC0Z+z0uUpwh+9RPfZ0GtSiTZZ7+w==
    ---- END SSH2 PUBLIC KEY ----

    вопрос - что из виндового файла нужно перенести в authorized_keys? целиком или вырезать, начиная от "ААА"? Переносы оставлять или вырезать? Провел десяток экспериментов, но пока всё неудачно

    Ответить
  9. "Сначала необходимо создать ключи ssh для аутентификации на локальном сервере."
    Вот надо же так написать! Что за локальный сервер и чем он отличается от глобального?
    У автора каша в голове!

    Ответить
  10. Как подключится через ssh к своему андройд телефону? там есть пара не понятных моментов, типо имя юзера, куда класть ключ? и еще по мелочи...

    Ответить
  11. У менять есть одна пара ключей для одного сервера и я генерирую вторую пару для другого. Как мне на указать ssh-copy-id ключ, который я хочу передать на второй сервер? Если ничего не указывать - передается два и не совсем понятно, каким ключом я в итоге авторизуюсь

    Ответить
  12. Приветствую! Создал ВМ на ORACLE Cloud на образе ОС Canonical-Ubuntu-20.04-2020.11.11-0 с общедоступным IP-адресом. Не получается подключиться к ВМ через PuTTY (64-bit). IP вписываю, а вот куда ключи SSH вписывать не пойму, может из-за этого не работает. Пишет "Unable to open connection to http. Host does not exist.". Пожалуйста подскажите где подробно описано как пользоваться SSH-клиентами.

    Ответить
  13. Там при создании ВМ ключик для авторизации предлагают скачать. Ещё на ВМ нужно настраивать iptables. И для Putty нужно конвертировать ключи, вроде бы так

    openssl rsa -in MyKey.key -out MyKey4PuttyGen.key

    Ответить
  14. Добрый день, а что, если я прописал:

    PasswordAuthentication no

    И по какой-то причине потерял ключи.

    То я больше никак не попаду на сервак?

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

    Ответить
  16. Добрый день, спасибо за статью, очень интересно, еще бы дополнить ее тем что после того как файл authorized_keys необходимо поменять права на папки и сам файл а то можно много времени потратить на поиск проблемы:
    chmod go-w ~/
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    Ответить
  17. Получается, как предложил Ахмед, если на локальной машине несколько ключей для разных серверов с разными пользователями на серверах, то лучше дополничельно создать ~/.ssh/config с указанием на каком сервере для какого пользователя какой ключ использовать.
    Если ключи создаются на сервере, то хранятся в тех же местах, только теперь от сервера нужно пользователю передать приватный ключ.

    Ответить

Оставьте комментарий