notes/ssh.md

264 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# SSH
- [SSH](#ssh)
- [Подключение](#подключение)
- [SSH аутентификация по ключам](#ssh-аутентификация-по-ключам)
- [Для дополнительной безопасности можно отключить доступ по паролю](#для-дополнительной-безопасности-можно-отключить-доступ-по-паролю)
- [Подключение через промежуточный хост](#подключение-через-промежуточный-хост)
- [SCP](#scp)
- [Не стандартный порт](#не-стандартный-порт)
- [ssh\_config](#ssh_config)
- [Общие параметры](#общие-параметры)
- [Пример конфигурации](#пример-конфигурации)
- [Проброс SSH ключа](#проброс-ssh-ключа)
## Подключение
```bash
ssh admin@192.168.5.3
```
если имя пользователя не указывать, соединение произойдет от имени локального пользователя
```bash
ssh 192.168.5.3
```
не стандартный порт при подключении
```bash
ssh pi@da2001.ru -p 227
```
не добавлять публичный ключ удаленного хоста в локальный файл _**known_hosts**_, при этом будет запрошено подтверждение подключения
```bash
ssh -o UserKnownHostsFile=/dev/null admin@192.168.1.2
```
не проверять публичный ключ удаленного хоста
```bash
ssh -o StrictHostKeyChecking=no admin@192.168.1.2
```
не добавлять публичный ключ и не проверять удаленный хост
```bash
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.1.2
```
выполнить команду на сервере без подключения
```bash
ssh user@host ls
```
выполнить локальный скрипт
```bash
ssh da2001@192.168.1.2 'python3' < test.py
```
[вверх](#ssh)
### SSH аутентификация по ключам
На локальном хосте linux сгенерировать пару ключей
```bash
ssh-keygen
```
парольную фразу можно оставить пустой, чтобы не вводить пароль каждый раз при обращении к ключу
_По умолчанию ключи будут храниться в каталоге `~/.ssh` в домашнем каталоге текущего пользователя. Закрытый ключ будет называться `id_rsa`, а связанный с ним открытый ключ `id_rsa.pub`_
Теперь необходимо скопировать публичный ключ на сервер, доступ к которому настраиваем
```bash
ssh-copy-id login@example.com
```
или
```bash
cat ~/.ssh/id_rsa.pub | ssh login@example.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
[вверх](#ssh)
### Для дополнительной безопасности можно отключить доступ по паролю
```bash
sudo nano /etc/ssh/sshd_config
```
`PasswordAuthentication no`
Перезагрузить сервис
```bash
sudo systemctl restart ssh
```
[вверх](#ssh)
### Подключение через промежуточный хост
если нужно подключиться по ssh на host2, при этом прямого подключения нет, но есть возможность подключиться через host1, можно такое подключение выполнить одной командой
```bash
ssh -J user1@host1:22 user2@host2
```
но в таком случае придется вводить пароль от host1 и от host2. Чтобы этого избежать можно добавить на хосты публичный ключ клиента
если добавить к подключению опции:
```bash
-o UserKnownHostsFile=/dev/null
-o StrictHostKeyChecking=no
```
удаленный сервер не будет проверять и не будет добавлять хеш удаленного хоста в файл _**known_hosts**_
это может быть полезно на тестовых стендах, когда узлы часто меняются и хеш изменяется.
Таким образом, полная команда может выглядеть так:
```bash
ssh -J pi@da2001.ru:227 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.5.3
```
[вверх](#ssh)
## SCP
```bash
scp ./wlt.py pi@da2001.ru:/home/pi
```
### Не стандартный порт
```bash
scp -P 227 ./wlt.py pi@da2001.ru:/home/pi
```
[вверх](#ssh)
## ssh_config
Документация - `man 5 ssh_config`</br>
Перевод man - <https://www.opennet.ru/man.shtml?topic=ssh_config&category=5&russian=0>
Конфигурационный файл клиента распологается в домашнем каталоге пользователя - `~/.ssh/config`
Для изменения значений клиента по-умолчанию, можно задать свои значения. Также можно задать шаблоны для подключения к определённым хостам с указанием отличных значений для каждого подключения или группы подключений.
В общем виде подобная настройка может выглядеть подобным образом:
```bash
Host firsthost
SSH_OPTION_1 custom_value
SSH_OPTION_2 custom_value
SSH_OPTION_3 custom_value
Host secondhost
ANOTHER_OPTION custom_value
Host 192.168.13.24
ANOTHER_OPTION custom_value
Host 192.168.13.*
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
```
Стоит иметь ввиду - анализ файла осуществляется сверху вниз до соответствия параметрам. Таким образом, если вверху будет указана директива `Host *`, для всех хостов будут применены значения определённые для этой директивы и анализ файла будет остановлен, т.к. `*` подходит для любого хоста.
### Общие параметры
Параметры определяются в порядке ключ-значение, при этом нет чёткого требования для разделения между ключом и значением, одинаково будут распознаны подобные определения:
```bash
Port 4567
Port=4567
Port = 4567
```
### Пример конфигурации
```bash
Host home
User da2001
VisualHostKey yes
PasswordAuthentication no
IdentityFile ~/.ssh/personal_id_rsa
Host test*
User testuser
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel QUIET
Host srv1 srv2 srv3
User jorn
Host *
User anotheruaser
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
LogLevel INFO
ServerAliveInterval 120
```
- отступы не обязательны, просто для удобочитаемости
[вверх](#ssh)
## Проброс SSH ключа
1. Создать `~/.ssh/config`
2. Заполните ее (адрес хоста - это адрес хоста, на который вы хотите разрешить пересылку cred'ов):
```shell
Host jumphost.local
ForwardAgent yes
```
3. Если вы еще не запустили ssh-agent, запустите его:
```shell
ssh-agent
```
4. Возьмите выходные данные этой команды и вставьте их в терминал. Это настроит переменные среды, которые необходимо установить для работы переадресации агента. При желании вы можете заменить это и шаг 3 на:
```shell
eval "$(ssh-agent)"
```
5. Добавьте ключ, который вы хотите переслать ssh-агенту:
```shell
ssh-add [path to key if there is one]/[key_name]
```
6. Войдите на удаленный хост:
```shell
ssh -A [user]@[jumphost.local]
```
7. Отсюда, если вы войдете на другой хост, который принимает этот ключ, это просто сработает:
```shell
ssh [user]@[hostname]
```
[вверх](#ssh)