Як я можу налаштувати вхід із SSH без пароля?


252

Я хочу мати змогу увійти до віддаленого через ssh, не маючи весь час вводити пароль.

  • Як це налаштувати?
  • Чи потрібна інша команда для виконання сеансу без пароля?

Ви використовуєте openssh? (якщо так, то просто;))
Rinzwind

@Rinzwind, Чому я б заважав отримувати власну версію, коли OpenSSH вже встановлений?
Oxwivi

15
Я намагаюся не робити припущень;)
Rinzwind

1
@ Кевін, уточнюйте, будь ласка. Ми говоримо про ssh-ing без пароля, що, як правило, є хорошою практикою . Ви маєте на увазі ssh-ing в кореневу оболонку? Це не охоплене цим питанням.
Oxwivi

@Oxwivi: На жаль, це мав бути коментарем до відповіді Равіндри, яка спрямована на кореневий вхід.
Кевін

Відповіді:


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
Вам потрібно буде chmod .ssh/authorized_keysфайл до 0600, або це не вийде
Marco Ceppi

Це дійсно допомогло, тому що я не зміг заставити ssh-copy-id працювати для root на моєму сервері. він повинен мати корінь у ситуації, коли backuppc (або будь-який інший демон) потребує ssh на іншу машину.
Адам

18

Я зазвичай використовую sshpassдля цього, встановлюю його sudo apt-get install sshpassі використовую так

sshpass -p 'password' ssh your_username@your_server

6
Чому б не використовувати ключі ssh?
enzotib

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
Це найпростіша правильна відповідь, але корисна для безпеки! Також відключити кореневий логін - ще один хороший
FreeSoftwareServers

Чи PasswordAuthentication noвпливає на всіх користувачів? Якщо ні, то як вимкнути його для звичайних користувачів, але залишити його незмінним для root під час тестування? Мені не дуже хочеться його обробляти і повністю замкнути.
Адам

Тримайте сеанс ssh відкритим, щоб ви могли його змінити. Ви хочете відключити паролі І root. Так, ви можете його фубару. Не;)
Туфір

Під час ssh у мене помилка Permission denied (publickey).із PasswordAuthentication no. Що мені робити? Чи потрібно змінити PasswordAuthentication noна іншого хоста?
ParisaN

9

Це рішення призначене спеціально для користувачів, які використовують Windows, щоб запустити ssh на віддалені машини, включаючи зображення хмари на AWS Cloud та GCE Cloud

Відмова від відповідальності

Нещодавно використовується це рішення для віддаленого входу в систему нових розгорнутих зображень vm на GCE.


Використовувані інструменти:

  1. puttygen завантажити завантаження
  2. winscp wincp завантажити

Кроки до виконання:

  1. Створення пари відкритих / приватних ключів за допомогою puttygen.
  2. Завантажте відкритий ключ на свій сервер у хмарному чи віддаленому місці.

Як це зробити:

1. Створіть ключ / пару або використовуйте наявний приватний ключ

Якщо у вас є приватний ключ:

Відкрийте puttygen, натисніть кнопку завантаження та виберіть файл приватного ключа ( *.pem).


Якщо у вас немає приватного ключа:

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

Рис

(від джерела 1, посилання, наведене нижче)

2. Створіть новий файл «авторизовані_ ключі» (з notepad)

Скопіюйте дані свого відкритого ключа з розділу "Публічний ключ для вставки у файл OpenSSH-авторизованих ключів" у генераторі ключів PuTTY та вставте ключові дані у authorized_keysфайл.


Переконайтеся, що в цьому файлі є лише один рядок тексту.


3. Завантажте ключ на сервер Linux

  • Відкрити WinSCP,
  • Виберіть протокол SFTP-файлів та увійдіть у систему за допомогою своїх ssh-даних.
  • Після успіху ви бачите структуру домашнього каталогу на віддаленій машині.

Завантажте файл дозволених ключів у домашній каталог на віддаленій машині.


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, щоб захистити цю локальну фіксацію, тому вам не доведеться весь час вводити її.


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бути впевнений, що цей файл не читається для інших) та ident.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 . Додаткову інформацію див. У сторінках для цих програм.

Сценарій автоматизації без паролів: 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.