Как настроить ssh для аутентификации с использованием ключей вместо имени пользователя / пароля?

34

Как настроить ssh для аутентификации пользователя, используя ключи вместо имени пользователя / пароля?

ScArcher2
источник

Ответы:

27

Для каждого пользователя: он должен сгенерировать (на своей локальной машине) свою пару ключей, используя ssh-keygen -t rsa( rsaможно заменить dsaили rsa1слишком, хотя эти опции не рекомендуются). Затем они должны поместить содержимое своего открытого ключа ( id_rsa.pub) ~/.ssh/authorized_keysна сервер, на котором выполняется вход.

Крис Шут-Янг
источник
Единственное, что я хотел бы добавить к этому, это посмотреть на разрешения для файла и каталога.
Трент
2
Не забывайте, что chmod 0700 .ssh chmod 0600 .ssh / authorized_keys
Дейв Чейни
3
Определенно сгенерируйте ключи таким образом, но затем проверьте сообщение @Chris Bunch относительно "ssh-copy-id". Это способ передать ваш 'id_rsa.pub'.
Гарет
@gyaresu: Спасибо! Я только что узнал что-то новое! :-D
Крис Шестер-Янг
23

Я на самом деле предпочитаю ssh-copy-id , скрипт, найденный в * nix по умолчанию (его также можно легко установить в Mac OS X ), который автоматически сделает это за вас. Со страницы руководства:

ssh-copy-id - это скрипт, который использует ssh для входа на удаленный компьютер (предположительно, с использованием пароля для входа в систему, поэтому аутентификация по паролю должна быть включена, если вы не сделали несколько умных попыток использовать несколько идентификаторов)

Он также изменяет права доступа к домашнему файлу удаленного пользователя, ~ / .ssh и ~ / .ssh / authorized_keys, чтобы удалить возможность записи группы (в противном случае вы не могли бы войти в систему, если в удаленной конфигурации sshd установлены StrictModes).

Если задана опция -i, то используется файл идентификации (по умолчанию ~ / .ssh / identity.pub), независимо от того, есть ли какие-либо ключи в вашем ssh-agent.

Крис Банч
источник
2
@Chris Bunch КАЖДЫЙ СМОТРЕТЬ ЗДЕСЬ! :) ssh-copy-id - это определенно способ поделиться своим id_rsa.pub
Гарет
1
Круто, я никогда не знал об этом ... Я написал свой собственный сценарий, чтобы сделать то же самое: - /
David Z
6

Хм, не понимаю. Просто создайте ключ и начните. :) HOWTO Кроме того, вы можете запретить вход через пароль. Например, в / etc / ssh / sshd_config:

PasswordAuthentication no
Узел
источник
2
И вам также нужно установить UsePAM no (или настроить PAM соответственно). Удивительно, сколько HOWTO пропускают эту часть. Невыполнение этого условия приведет к тому, что вы по-прежнему сможете войти в систему с помощью пароля.
Натан
3

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

Основными моментами являются:

  • Беги ssh-keygenна своей машине. Это сгенерирует для вас открытый и закрытый ключи.
  • Скопируйте и вставьте содержимое вашего открытого ключа (вероятно, в ~/.ssh/id_rsa.pub) ~/.ssh/authorized_keysна удаленный компьютер.

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

ConroyP
источник
Я рекомендую вырезать и вставить вместо копирования. Файл author_keys может содержать несколько ключей, и вы не хотите забивать другие ключи, которые уже есть.
Крис Джестер-Янг
Мое любимое прохождение было отправлено на Wayback Machine: web.archive.org/web/20061103161446/http://…
Филипп Дурбин
@ Крис ой - я хотел скопировать его в файл, а не перезаписать! Ответ обновлен, чтобы уточнить
ConroyP
1

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

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

claudius:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dinomite/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase): <PASSPHRASE>
Enter same passphrase again: <PASSPHRASE>
Your identification has been saved in /home/dinomite/.ssh/id_rsa.
Your public key has been saved in /home/dinomite/.ssh/id_rsa.pub.
The key fingerprint is:
a3:93:8c:27:15:67:fa:9f:5d:42:3a:bb:9d:db:93:db dinomite@claudius

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

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

claudius:~$ ssh-copy-id caligula.dinomite.net
Now try logging into the machine, with "ssh 'caligula.dinomite.net'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

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

claudius:~$ scp .ssh/id_dsa.pub caligula.dinomite.net:
id_dsa.pub                                    100% 1119     1.1KB/s   00:00
claudius:~$ ssh caligula.dinomite.net
Last login: Sat May  9 10:32:30 2009 from claudius.csh.rit.edu
Caligula:~$ cat id_dsa.pub >> .ssh/authorized_keys

Наконец, чтобы получить максимальную выгоду от ключей SSH, вам нужно запустить агент SSH. Если вы используете среду рабочего стола (Gnome, KDE и т. Д.), То просто выйдите из системы и войдите снова, чтобы запустить для вас SSH-агент. Если нет, вы можете добавить следующее в RC-файл оболочки ( .bashrc, .profileи т. Д.):

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi
Дрю Стивенс
источник
1

Это задумано как контрольный список. Если следовать ему поэтапно, следует охватить наиболее распространенные ошибки, связанные с входом без пароля. Большинство из этих пунктов упоминаются в другом месте; это совокупность.

На каждой машине должен быть ~/.sshкаталог chmod 700под учетной записью, которая будет отправлять или получать соединения.

(Закрытый) ключ должен быть создан без ключевой фразы, или может быть запущен агент, который будет содержать дешифрованную версию ключа, содержащего ключевую фразу, для использования клиентами. Начать агент с ssh-agent $SHELL. Это $SHELLчасть, которая заняла у меня некоторое время, чтобы найти. Посмотрите справочную страницу, так как есть много разных деталей, если вы хотите использовать агента.

Не забывайте, что по умолчанию слабые (<2048 бит DSA) ключи не принимаются в последних версиях sshd.

Далее должны быть сделано на стороне клиента машине происходит соединение.

  1. Ваш закрытый ключ должен быть помещен в ~/.ssh/id_rsaили ~/.ssh/id_dsaкак нужно . Вы можете использовать другое имя, но затем оно должно быть включено в опцию -i команды ssh на исходной машине, чтобы явно указать закрытый ключ.

  2. Ваш закрытый ключ должен быть chmod 600.

  3. Проверьте, что ваша домашняя папка chmod 700.

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

  1. Ваш открытый ключ должен быть помещен в файл, который называется ~/.ssh/authorized_keysпод учетной записью, которая будет получать соединения. Здесь вы также можете разместить другие ключи, которым разрешено подключаться через эту учетную запись. Особенно сложно, если вы находитесь в vi и вставляете ключ в файл из буфера вставки в PuTTY, это то, что ключ начинается с «ssh-». Если вы не находитесь в режиме вставки, первые "s" переведут vi в режим вставки, а остальная часть ключа будет выглядеть просто отлично. Но в начале ключа вам будет не хватать «s». Мне потребовались дни, чтобы найти это.
  2. Мне нравится chmod 600 ~/.ssh/authorized_keys. Это должно быть как минимум gw.
  3. Теперь вы должны добавить отпечаток хоста в кеш. Перейдите к машине A, и ssh к машине B вручную. В первый раз вы получите запрос типа «Хотите добавить ... в кеш ключей хоста?». Если вы пытаетесь настроить автоматизацию (например, скрипт) для использования этого имени входа, вы должны убедиться, что клиент ssh, используемый автоматизацией, не получит это приглашение.
Вик К
источник
0

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

Для более подробной информации я настоятельно рекомендую SSH, Secure Shell .

Neall
источник
0

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

remote=server1 server2 server3 server4
for r in $remote; do echo connecting to $r; tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh $r "tar zxf -; chmod 700 .ssh" ; done

Просто перейдите в ваш домашний каталог, определите переменную remote как одно или несколько имен серверов и сделайте кучу сразу. Пароль, который он запрашивает, будет вашим ssh-паролем для удаленного сервера. Конечно, вы можете использовать упрощенную версию без цикла for:

tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh YOUR_SERVER_NAME_HERE "tar ztvf -; chmod 700 .ssh"

ПОМНИТЕ: Скопируйте только свои открытые ключи. Вы не хотите, чтобы ваши закрытые ключи находились на каком-то сервере, где любой, кто имеет sudo, может скопировать их и перебрать вашу парольную фразу.

Бруно Броноски
источник