264 lines
8.9 KiB
Markdown
264 lines
8.9 KiB
Markdown
# 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)
|