Видео "Настройка SSH - Аутентификация по ключу"
Ассиметричное шифрование. На своем компьютере вы должны создать публичный и приватный ключи, например, для алгоритма RSA.
Затем копируете публичный ключ на удаленный сервер (к которому нужно получать доступ) в скрытую папку ~/.ssh в файл authorized_keys, папка должна находиться в домашнем каталоге той учетной записи под которой будет осуществляться вход на удаленный сервер.
При подключении по SSH вы должны указать какой приватный ключ использовать для аутентификации.
У каждого пользователя должна быть своя пара приватного и публичного ключа.
Создаем пару ключей:
Минимальный размер ключа - 2048
admin1@host1:~$ ssh-keygen
------------------------------------
Enter file in which to save the key (/home/admin1/.ssh/id_rsa):
указываем свой путь хранения ключа (полный путь) или оставляем путь по умолчанию
------------------------------------
Enter passphrase (empty for no passphrase):
Указать парольную фразу или не указывать, она является защитой созданного ключа
-------------------------------------
admin1@host1:~$ cd .ssh
admin1@host1:~/.ssh$ ls -l
итого 12
-rw------- 1 admin1 admin1 1766 янв 6 17:27 admin1
-rw-r--r-- 1 admin1 admin1 394 янв 6 17:27 admin1.pub
-rw-r--r-- 1 admin1 admin1 444 янв 6 17:14 known_hosts
-------------------------------------------------------
Копируем публичный ключ на удаленный сервер host2 в домашний каталог пользователя user1:
admin1@host1:~/.ssh$ ssh-copy-id -i admin1.pub user1@host2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "admin1.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user1@host2's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user1@host2'"
and check to make sure that only the key(s) you wanted were added.
----------------------------------------------------------------------------
Подключаемся к удаленному серверу host2:
admin1@host1:~/.ssh$ ssh -i admin1 user1@host2
Enter passphrase for key 'admin1':
Last login: Sat Jan 6 17:32:32 2024
--------------------------------------------------------------------
Можно выполнять команды на удаленном сервере не подключаясь к нему:
admin1@host1:~/.ssh$ ssh -i admin1 user1@host2 "ip a"
Enter passphrase for key 'admin1':
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:79:65:2a brd ff:ff:ff:ff:ff:ff
inet 10.28.0.156/24 brd 10.28.0.255 scope global dynamic noprefixroute eth0
valid_lft 1511sec preferred_lft 1511sec
inet6 fe80::5f51:141f:4276:75c8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
--------------------------------------------------------------------------------
SSH agent нужен чтобы запомнить парольную фразу пока вы работаете в интерактивной сессии на компьютере. Это менеджер ключей для SSH.
Он хранит ваши ключи и сертификаты в памяти, они там хранятся незашифрованные и готовые к использованию в ssh. Это избавляет вас от необходимости вводить пароль каждый раз, когда вы подключаетесь к серверу. Когда вы выйдите из сеанса, запомненная парольная фраза будет уничтожена.
admin1@host1:~/.ssh$ eval `ssh-agent -s` - запустить агент
admin1@host1:~/.ssh$ ssh-add admin1 - агент запоминает парольную фразу
Enter passphrase for admin1:
Identity added: admin1 (admin1)
Проверяем, что ключ добавлен в агент ssh
admin1@host1:~/.ssh$ ssh-add -l
2048 SHA256:fOC8za4ESr8CZimN3SOfQMHmzrIKuL3oy6kq0BLdThE admin1 (RSA)
ssh -i admin1 user1@host2 - подключение должно произойти без запроса парольной фразы
Удаление всех ключей из агента ssh
admin1@host1:~/.ssh$ ssh-add -D
All identities removed.
-----------------------------------------------------
Запрещаем на стороне сервера host2 аутентификацию по паролю:
admin1@host2:~/.ssh$ sudo vim /etc/ssh/sshd_config
в строке
#PasswordAuthentication yes
убираете "#" и "yes" меняете на "no"
Перечитываете конфиг sshd:
admin1@host2:sudo systemctl reload sshd
Пробуем войти по паролю на удаленный сервер host2
admin1@host1:~/.ssh$ ssh user1@host2
Permission denied (publickey).
-----------------------------------------------------------------------
Если нужен некий аналог путти с сохранением подключений:
Создаем файл config в папке ~/.ssh и описываем свои подключения к разным серверам
admin1@host1:~/.ssh$ vim config
Host Server_WEB
HostName 10.28.0.156
User admin1
Port 22
IdentityFile ~/.ssh/admin1
admin1@host1:~/.ssh$ ssh Server_WEB
Enter passphrase for key '/home/admin1/.ssh/admin1':
Last login: Sat Jan 6 18:14:12 2024
--------------------------------------------------------------------------
Копирование файлов по ssh на удаленный хост:
С аутентификацией по ключам
admin1@host1:~/.ssh$ scp -i admin1 config admin1@host2:/home/admin1
С аутентификацией по паролю
admin1@host1:~/.ssh$ scp admin1.pub admin1@host2:/home/admin1
admin1@host2's password:
admin1.pub
С использованием config
admin1@host1:~/.ssh$ scp known_hosts Server_WEB:/home/admin1
Enter passphrase for key '/home/admin1/.ssh/admin1':
known_hosts
Копирование каталога на удаленный хост:
admin1@host1:~/.ssh$ scp -r ~/Загрузки/ admin1@host2:/tmp
admin1@host2's password:
--------------------------------------------------------------------
Запуск графического приложения на удаленном хосте с перенаправлением вывода на локальный хост
admin1@host1:~/.ssh$ ssh -X admin1@host2 kcalc