# 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`
Перевод man - Конфигурационный файл клиента распологается в домашнем каталоге пользователя - `~/.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)