Привет. Иногда мы подключаемся к удаленному компьютеру с помощью технологии ssh (secure shell). Сначала мы генерируем пару ключей: приватный и публичный. Публичный кладем на удаленный компьютер. Далее вбиваем в терминале что-то вроде ssh [email protected]
Соединение установлено и мы можем работать на удаленном компьютере как на собcтвенном.
Отлично, но что делать если вы хотите подключаться к нескольким удаленным компьютерам? Можно поступить глупо и положить на все удаленные сервера один и тот же публичный ключ. Это будет работать, но значительно снизит безопасность таких соединений. В идеальном мире, каждое соединение должно осуществляться с собственной парой приватного и публичного ключа. К примеру, если вам понадобится дать своему коллеге доступ к серверу, вы можете передать ему только один ключ (в идеале нужно сгенерировать новый) и коллега получит доступ только к одному компьютеру, а не ко всем сразу. К тому же, разные сервера имеют разные ip адреса, на них установлены разные пользователи, могут быть нестандартные порты и другие мелкие детали. Все это нужно помнить, либо где-то записывать. Все это отнимает наше драгоценное время.
Один из вариантов - создать псевдоним (bash alias) для каждого подключения к удаленному серверу. Однако есть другое, гораздо лучшее и более простое решение этой проблемы. SSH позволяет вам настроить файл конфигурации для каждого пользователя, в котором вы можете хранить различные параметры SSH для каждой удаленной машины, к которой вы подключаетесь.
Предполагается, что вы используете систему Linux или macOS с установленным клиентом SSH (В операционных системах Windows процедура может отличаться).
Файл конфигурации на стороне клиента называется config
и хранится в каталоге .ssh
в домашнем каталоге пользователя.
Каталог ~/.ssh
создается автоматически, когда пользователь запускает команду ssh в первый раз. Если каталог не существует в вашей системе, создайте его с помощью следующей команды:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
По умолчанию файл конфигурации SSH может не существовать, поэтому вам может потребоваться создать его с помощью команды touch:
touch ~/.ssh/config
Этот файл должен быть доступен для чтения и записи только пользователю и не должен быть доступен для других, поэтому установите следующий права командой chmod:
chmod 600 ~/.ssh/config
Файл конфигурации SSH имеет следующую структуру:
Host hostname1 SSH_OPTION value SSH_OPTION value Host hostname2 SSH_OPTION value Host * SSH_OPTION value
Содержимое файла конфигурации клиента SSH организовано с помощью разделов. Каждый раздел начинается с директивы Host
и содержит определенные параметры SSH, используемые при установлении соединения с удаленным SSH-сервером.
Директива Host
может содержать один паттерн или список паттернов, разделенных пробелами (в примере выше паттернами являются (hostname1, hostname2, *). Каждый паттерн (я их еще называю шаблоны) может содержать ноль или более не-пробельных символов или один из следующих спецификаторов шаблона:
* - соответствует нулю или любому количеству символов. Например, Host * соответствует всем хостам, а 192.168.0.* Соответствует хостам в подсети 192.168.0.0/24. ? - Соответствует ровно одному символу. Шаблон, Host 10.10.0.? соответствует всем хостам в диапазоне 10.10.0.[0–9]. !- При использовании в начале шаблона отменяет совпадение. Например, Host 10.10.0.* !10.10.0.5 соответствует любому хосту в подсети 10.10.0.0/24, кроме 10.10.0.5.
Немного похоже на регулярные выражения, верно?
Клиент (программа) SSH читает файл конфигурации раздел за разделом, и если совпадают несколько разделов их правила суммируются. Так же, если совпадают несколько правил, то правила из первого совпадающего раздела имеют наивысший приоритет. Поэтому более специфичные для хоста правила должны быть даны в начале файла, а более общие переопределения - в конце файла.
Вы можете найти полный список доступных опций ssh, набрав man ssh_config
в своем терминале или посетив страницу руководства ssh_config.
Файл конфигурации SSH также читается другими программами, такими как scp, sftp и rsync.
Теперь, когда мы рассмотрели основы файла конфигурации SSH, давайте рассмотрим следующий пример.
Обычно при подключении к удаленному серверу через SSH вы указываете имя удаленного пользователя, имя хоста и порт. Например, чтобы войти в систему как пользователь с именем john
на хост с именем dev.example.com
на порту 2322
из командной строки, вы должны ввести:
ssh [email protected] -p 2322
Все это нужно помнить. Фууух. Давайте упростим жизнь. Добавьте следующие строки в ваш файл конфигурации и сохраните файл:
Host dev HostName dev.example.com User john Port 2322
Теперь, когда вы вводите ssh dev
, клиент ssh будет читать файл конфигурации и использовать данные подключения, указанные для хоста dev:
ssh dev
Этот пример дает более подробную информацию о шаблонах хоста и приоритетах опций:
Host targaryen HostName 192.168.1.10 User daenerys Port 7654 IdentityFile ~/.ssh/targaryen.key Host tyrell HostName 192.168.10.20 Host martell HostName 192.168.10.50 Host *ell user oberyn Host * !martell LogLevel INFO Host * User root Compression yes
Когда вы вводите ssh targaryen
, клиент ssh читает файл конфигурации и применяет параметры из первого совпадения, то есть Host targaryen
. Затем он проверяет следующие разделы один за другим на соответствие шаблону. Следующим подходящим вариантом является Host *! Martell
(то есть все хосты, кроме martell
), и он применит параметр подключения из этого раздела тоже. Последнее определение Host *
также совпадает, но клиент ssh будет использовать только параметр Compression
, поскольку параметр User
уже определен в разделе Host targaryen
.
Вот список параметров, используемых при вводе ssh targaryen
:
HostName 192.168.1.10 User daenerys Port 7654 IdentityFile ~/.ssh/targaryen.key LogLevel INFO Compression yes
При вводе ssh tyrell
подходящими шаблонами хоста являются: Host tyrell, Host *ell, Host * !martell
и Host *
. В этом случае используются следующие параметры:
HostName 192.168.10.20 User oberyn LogLevel INFO Compression yes Если вы запустите ssh martell, шаблоны хостов будут следующими: Host martell, Host *ell и Host *. В этом случае используются следующие параметры: HostName 192.168.10.50 User oberyn Compression yes
Для всех остальных подключений клиент ssh будет использовать параметры, указанные в разделах Host * !martell и Host *
.
Клиент ssh считывает свою конфигурацию в следующем порядке приоритета:
~/.ssh/config
/etc/ssh/ssh_config
Если вы хотите переопределить один параметр, вы можете указать его в командной строке. Например, если у вас есть следующая конфигурация:
Host dev HostName dev.example.com User john Port 2322
и вы хотите использовать все те же параметры, но для подключения от имени пользователя root
вместо john
просто укажите пользователя в командной строке:
ssh -o "User=root" dev
Флаг -F
(configfile
) позволяет указать альтернативный файл конфигурации для каждого пользователя.
Чтобы указать ssh-клиенту игнорировать все параметры, указанные в файле конфигурации ssh, используйте:
ssh -F /dev/null [email protected]
Надеюсь эта статься немного облегчит вашу жизнь. Ниже я написал пару полезных заметок.
По умолчанию SSH прослушивает порт 22. Изменение порта SSH по умолчанию добавляет дополнительный уровень безопасности вашему серверу, снижая риск автоматических атак.
Если вам нужно добавить новые ключи, можете создать их следующей командой (флаг -С позволяет задать путь для новых ключей, а так же позволяет указать имя будущей пары ключей), но будьте осторожны, если вы создадите ключи в директории где уже есть ключи с теми же именами, новые перезапишут старые:
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f $HOME/.ssh/new_folder/id_rsa