Как я могу настроить SSH-вход без пароля?


252

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

  • Как мне это настроить?
  • Требуется ли другая команда для выполнения сеанса без пароля?

Вы используете openssh? (если так, то это легко;))
Rinzwind

@Rinzwind, Зачем мне беспокоиться о том, чтобы получить проприетарную версию, когда OpenSSH уже предустановлен?
Oxwivi

15
Я стараюсь не делать предположений;)
Rinzwind

1
@ Кевин, уточни, пожалуйста. Мы говорим о ssh-е без пароля, что обычно является хорошей практикой . Вы имеете в виду ssh-ing в корневую оболочку? Это не охвачено этим вопросом.
Oxwivi

@Oxwivi: Извините, это должен был быть комментарий к ответу Равиндры, нацеленный на root-логин.
Кевин

Ответы:


266

Ответ

Выполните следующие команды:

ssh-keygen

Затем вам нужно будет скопировать новый ключ на ваш сервер :

ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"

После того, как ключ скопирован, ssh в машину как обычно:

ssh user@host

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

пример

not-marco@rinzwind-desktop:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa): 
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo.        |
|*B.+ . .         |
|*=o .   o .      |
| = .     =       |
|. o     S        |
|E.               |
| o               |
|  .              |
|                 |
+-----------------+

not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password: 
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:

  ~/.ssh/authorized_keys

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

объяснение

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

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

  1. Сначала создайте ваш SSH KeyPair, запустив ssh-keygenэто создаст id_rsaи id_rsa.pubфайл. pubФайл , что происходит на серверах, закрытый ключ ( id_rsa) является то , что остается с вами и как вы отождествляете себя.
  2. Затем скопируйте открытый ключ на сервер, ssh-copy-id user@serverзаменив пользователя удаленным пользователем, а на сервере - DNS-имя или IP-адрес компьютера. Он запросит ваш пароль SSH, введите его, и, если все будет успешно завершено, вы сможете получить доступ к компьютеру ssh user@serverбез пароля.

Рекомендации


11
@ Oxwivi, этот ответ - более правильный способ сделать это, но он кажется более длинным. Все, что вам нужно сделать, это набрать, ssh-keygenследуя инструкциям на экране, а затем набрать ssh-copy-id user@serverзамену пользователя на удаленного пользователя и сервер на удаленном компьютере
Marco Ceppi

3
У меня была ошибка «Агент признал невозможность подписи с помощью ключа». каждый раз при попытке входа в систему после выполнения этой процедуры. Решением было запустить «> ssh-add» на локальном компьютере, и теперь я могу войти на удаленный компьютер, как и ожидалось.
jmbouffard

1
Стоит отметить , что , если вам нужно использовать пользовательский порт для @server, что вам нужно сделать это с помощью : ssh-copy-id "not-marco@127.0.0.1 -p 1234".
s3m3n

@Rinzwind: Означает ли это, что я никогда не смогу аутентифицироваться с неизвестного клиента / машины на мой сервер, если я отключил аутентификацию passwd и разрешил только аутентификацию по ключу. Есть ли способ разрешить вход в систему с неизвестного компьютера, используя закрытый ключ, который был создан для известного / настроенного клиента для связи с сервером? Я имею в виду, является ли этот закрытый ключ переносимым и может быть использован для аутентификации себя на сервере с других компьютеров, в случае необходимости?
Раджат Гупта

4
Но сервер все еще спрашивает пароль ,,,
Лернер Чжан

34

Введите следующие команды:

  1. ssh-keygen

    Нажмите Enterклавишу, пока не получите подсказку

  2. ssh-copy-id -i root@ip_address

    (Однажды будет запрошен пароль от хост-системы)

  3. ssh root@ip_address

Теперь вы сможете войти без пароля.


25

Я обычно делаю это следующим образом:

ssh-keygen -t rsa

(При запросе пароля оставьте его пустым)

Затем: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

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

Конечно, замените имя пользователя на желаемое имя пользователя, а имя хоста на желаемое имя хоста или IP-адрес

После этого просто SSH к этой коробке, как вы привыкли.


А как насчет команды touchи chmodв ответе Ринзвинда?
Oxwivi

7
Вам нужно .ssh/authorized_keysбудет изменить файл до 0600, иначе это не сработает
Марко Чеппи

Это действительно помогло, потому что я не мог заставить ssh-copy-id работать для root на моем сервере. он должен быть root в ситуации, когда backuppc (или любой другой демон) должен подключиться по ssh к другому компьютеру.
Адам

18

Я обычно использую sshpassдля этого, установить его sudo apt-get install sshpassи использовать как это

sshpass -p 'password' ssh your_username@your_server

6
Почему бы не использовать ключи SSH?
энзотиб

1
Это не ситуация «почему бы и нет», она все равно прекрасно работает без добавления ключей, это просто еще один метод, который я бы сказал.
Бруно Перейра

Спасибо за информацию о sshpass, никогда не слышал об этом раньше.
Пантера

7
Ключи SSH являются «правильным» ответом на вопрос, но sshpassочень полезны в тех случаях, когда вы не можете изменить метод аутентификации на удаленном сервере!
Джейкоб Кралл

9
Это очень опасно, вы будете хранить в bash_history или в любом другом виде простые пароли для хостов, к которым вы подключаетесь ..
kappa

10

Отключить аутентификацию по паролю

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

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

Рекомендуется отключить аутентификацию по паролю, если у вас нет особых причин не делать этого.

Чтобы отключить аутентификацию по паролю, найдите следующую строку в файле sshd_config:

#PasswordAuthentication yes

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

PasswordAuthentication no

После того, как вы сохранили файл и перезапустили свой SSH-сервер, вам даже не нужно запрашивать пароль при входе в систему.

https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication


2
Это самый простой правильный ответ, но он полезен для безопасности! Также отключите вход в систему root еще один хороший
вариант

Влияет ли PasswordAuthentication noна всех пользователей? Если нет, то как отключить его для обычных пользователей, но оставить его неизменным для root, пока я его тестирую? Я на самом деле не хочу, чтобы foobar это и заблокировать себя полностью.
Адам

Оставьте сеанс SSH открытым, чтобы вы могли изменить его обратно. Вы хотите отключить пароли И root. Да, вы можете fubar это. Не;)
Thufir

Во время ssh у меня ошибка Permission denied (publickey).с PasswordAuthentication no. Что мне делать? Я изменяю PasswordAuthentication noна другом хосте?
ParisaN

9

Это решение специально для пользователей, использующих Windows для подключения к своим удаленным компьютерам, включая облачные образы в AWS Cloud и GCE Cloud.

отказ

Недавно использовал это решение для удаленного входа в систему новых развернутых образов VM на GCE.


Используемые инструменты:

  1. puttygen замазка скачать
  2. winscp Winscp скачать

Шаги для выполнения:

  1. Создайте пару открытый / закрытый ключ, используя puttygen.
  2. Загрузите открытый ключ на ваш сервер в облаке или в удаленном месте.

Как это сделать:

1. Сгенерируйте ключ / пару или используйте существующий закрытый ключ

Если у вас есть личный ключ:

Откройте puttygen, нажмите кнопку загрузки и выберите файл с секретным ключом ( *.pem).


Если у вас нет личного ключа:

  • Открыть puttygen,
  • Выберите нужный тип ключа SSH2 DSA (вы можете использовать RSA или DSA) в разделе « Параметры ». Важно, чтобы вы оставили поле пароля незаполненным.
  • Нажмите generateи следуйте инструкциям, чтобы создать (открытый / закрытый) пару ключей.

Пример генерации ключей

(из источника 1, ссылка приведена ниже)

2. Создайте новый файл authorized_keys (с notepad)

Скопируйте данные вашего открытого ключа из раздела «Открытый ключ для вставки в OpenSSH файл авторизованных ключей» в генераторе ключей PuTTY и вставьте данные ключа в authorized_keysфайл.


Убедитесь, что в этом файле только одна строка текста.


3. Загрузите ключ на сервер Linux

  • Откройте WinSCP,
  • Выберите протокол файла SFTP и войдите под своими учетными данными ssh.
  • В случае успеха вы видите структуру домашнего каталога на вашем удаленном компьютере.

Загрузите файл author_keys в домашнюю директорию на удаленном компьютере.


4. Установите правильные разрешения

Сделать .sshкаталог (если не существует)


Скопируйте authorized_keysфайл в .sshкаталог.
(это заменит любой существующий authorized_keysфайл, обратите внимание на это).

Если файл существует, просто добавьте содержимое этого файла в существующий файл.


Запустите команды для установки разрешений:

sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys

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

Дальнейшее чтение:


4

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

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

Эта команда генерирует достаточно сильный ключ в ~/.ssh/:

ssh-keygen -b 4096

В нем ~/.ssh/вы найдете свой открытый ключ как id_rsa.pub. Его содержимое должно быть добавлено в authorized_keysфайл вашего сервера путем его переноса через переносной носитель (флеш-накопитель) или путем кратковременного включения аутентификации по паролю на сервере, затем с использованием ssh-copy-id ~/.ssh/id_rsa.pub username@serverи последующим отключением.

Если вы решили защитить свой ключ парольной фразой (на первом шаге), вы можете использовать ssh-agentили Ubuntu keyring, чтобы защитить этот код локально, чтобы вам не приходилось вводить его все время.


3

Чтобы сделать некоторые дополнения:

  • Mac по умолчанию не имеет ssh-copy-id, вам придется установить его самостоятельно:

    curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
    chmod +x /usr/local/bin/ssh-copy-id
    

найти больше здесь: https://github.com/beautifulcode/ssh-copy-id-for-OSX

  • если вы сделали переадресацию портов, команда должна выглядеть следующим образом:

    ssh-copy-id "not-marco@127.0.0.1 -p 2222"
    

обратите внимание, что цитаты необходимы.


3

Удаленный вход / копирование без ввода пароля

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

  1. Запустите ssh-keygen для генерации закрытых и открытых ключей, если это еще не сделано на вашем компьютере. Они хранятся в файлах в $HOME/.ssh.
  2. Добавьте содержимое файла открытого ключа в файл $HOME/.ssh/authorized_keysили $HOME/.ssh/authorized_keys2на сервер.

Существует три разных типа протоколов аутентификации. Вы указываете тип при запуске ssh-keygen:

  1. Протокол SSH версии 1, RSA1: это выбор по умолчанию, который приводит к идентификации файлов (закрытый ключ должен chmod 0700быть гарантированно недоступен для чтения другим пользователям) и identity.pub (открытый ключ).
  2. Протокол SSH версии 1, RSA : это получается при запуске ssh-keygen -t rsaи приводит к файлам id_rsa(закрытый ключ) и id_rsa.pub(открытый ключ)
  3. Протокол SSH версии 1, DSA : это получается при запуске ssh-keygen -t dsaи приводит к файлам id_dsa(закрытый ключ) и id_dsa.pub(открытый ключ)

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

Вы можете указать тип ключей, которые будут использоваться опцией ssh ; ssh -1Использование силы RSA1 ключей (протокол версии 1), в то время как ssh -2силы SSH , чтобы попытаться RSA или DSA только ключи (протокол версии 2). В приведенных ниже примерах мы генерируем и устанавливаем ключи RSA1 и DSA на удаленном хосте, чтобы обеспечить большую гибкость. Вы можете сделать файл конфигурации в вашем .sshкаталоге с помощью строки

Protocol 1,2

Это заставляет ssh попробовать установить соединение RSA1 (версия протокола 1) перед RSA / DSA (версия протокола 2).

Использование ключей RSA1

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"

Использование ключей DSA

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy DSA key: 
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"

Это все, что вам нужно сделать, если вы не использовали ключевую фразу при генерации ключей. Вы можете проверить соединение, запустив ssh $ remote и посмотреть, сможете ли вы войти в систему без ввода пароля (вам может потребоваться использовать -1или в -2качестве опции ssh ). Конечно, эту процедуру можно повторить для любой машины, на которую вы хотите войти.

Если вы использовали фразу-пароль, вам нужно будет запустить программу, ssh-agentчтобы запустить специальную оболочку, а затем ssh-addзарегистрировать комбинацию ключ / фраза-парольsshd . Смотрите man-страницы для этих программ для получения дополнительной информации.

Скрипт для автоматизации беспарольных соединений: ssh-no-password.sh

#!/bin/sh

# create ssh connections without giving a password

if [ $# -lt 1 ]; then
  echo Usage: $0 username@remotehost
  exit
fi
remote="$1"  # 1st command-line argument is the user@remotehost address
this=$HOST   # name of client host

# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
  echo "just type RETURN for each question:" # no passphrase - unsecure!!
  # generate RSA1, RSA and DSA keys:
  echo; echo; echo
  ssh-keygen
  echo; echo; echo
  ssh-keygen -t rsa
  echo; echo; echo
  ssh-keygen -t dsa
else
  # we have $HOME/.ssh, but check that we have all types of
  # keys (RSA1, RSA, DSA):
  if [ ! -f $HOME/.ssh/identity ]; then
     # generate RSA1 keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate RSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t rsa
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate DSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t dsa
  fi
fi


cd $HOME/.ssh

if [ ! -f config ]; then
  # make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
  echo "Protocol 1,2" > config
fi

# copy public keys (all three types) to the destination host:

echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:

echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"

echo; echo; echo
echo "try an ssh $remote"

скопировано с: http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html


1

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

После того, как я сгенерировал ключ и скопировал его на сервер:

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub lerner@192.168.20.160

Я обнаружил, что это не сработало.

Затем я пошел, чтобы проверить ~/.ssh/configфайл на клиенте, я увидел это внизу:

Host *
IdentitiesOnly yes

Тогда я добавлю это выше:

Host somename
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/something

Я могу просто войти, введя ssh somename.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.