Как использовать файл конфигурации SSH
Если вы регулярно подключаетесь к нескольким удаленным системам по SSH, запомнить все эти IP-адреса, различные имена пользователей, нестандартные порты и другие параметры командной строки будет крайне сложно, а то и вообще невозможно.
Одним из вариантов может быть создание алиасов (псевдонимов) bash для каждого подключения к удаленному серверу. Однако есть и другое, гораздо лучшее и более простое решение этой проблемы. OpenSSH позволяет создать файл конфигурации для каждого пользователя, в котором можно хранить различные параметры SSH для каждой удаленной машины, к которой вы подключаетесь.
В этой статье я рассмотрю основы конфигурационного файла SSH-клиента и объясню некоторые наиболее распространенные параметры конфигурации.
Необходимые условия
Мы предполагаем, что вы используете систему Linux или macOS с установленным клиентом OpenSSH.
Расположение файла конфигурации SSH
Файл конфигурации клиентской части OpenSSH называется config
и хранится в каталоге .ssh
в домашней директории пользователя.
Каталог ~/.ssh
создается автоматически при первом выполнении пользователем команды ssh
. Если в вашей системе этот каталог не существует, создайте его с помощью следующей команды:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
По умолчанию файл конфигурации SSH может не существовать, поэтому вам может потребоваться создать его с помощью команды touch
:
touch ~/.ssh/config
Этот файл должен быть доступен для чтения и записи только пользователю и недоступен другим:
chmod 600 ~/.ssh/config
Структура файла конфигурации SSH и шаблоны
Конфигурационный файл SSH имеет следующую структуру:
Host hostname1
SSH_OPTION value
SSH_OPTION value
Host hostname2
SSH_OPTION value
Host *
SSH_OPTION value
Содержимое файла конфигурации SSH-клиента организовано в виде секций. Каждая строфа начинается с директивы Host
и содержит определенные опции SSH, используемые при установлении соединения с удаленным SSH-сервером.
Строфа (секция) в файле конфигурации SSH — это раздел, который начинается с директивы
Host
и содержит определенные параметры SSH, используемые при установлении соединения с удаленным SSH-сервером.
Отступы не обязательны, но рекомендуются, так как облегчают чтение файла.
Директива Host
может содержать один шаблон или список шаблонов, разделенных пробелами. Каждый шаблон может содержать ноль или более символов, не разделенных пробелами, или один из следующих спецификаторов шаблона:
*
— Сопоставляет ноль или более символов. Например,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, давайте посмотрим следующий пример.
Обычно при подключении к удаленному серверу по SSH вы указываете имя удаленного пользователя, имя хоста и порт. Например, чтобы войти в систему от имени пользователя mikhail
на хост kobzarev.com
с портом 2322
в командной строке нужно набрать:
ssh mikhail@kobzarev.com -p 2322
Чтобы подключиться к серверу, используя те же опции, что и в команде выше, просто набрав ssh mihdan
, добавьте следующие строки в ваш файл ~/.ssh/config
:
Host mihdan
HostName kobzarev.com
User mikhail
Port 2322
Теперь при вводе ssh mihdan
SSH-клиент будет читать файл конфигурации и использовать данные подключения, указанные для хоста mihdan
:
ssh mihdan
Пример общего файла конфигурации SSH
Этот пример даёт более подробную информацию о шаблонах хоста и приоритете опций.
Возьм`м следующий пример файла:
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-клиент считывает свою конфигурацию в следующем порядке по старшинству:
- Параметры, заданные из командной строки.
- Параметры, определенные в файле
~/.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 user@example.com
Полезные опции конфигурации SSH
Ниже предлагаю некоторые полезные опции конфигурации SSH, которые можно настроить в файле конфигурации ~/.ssh/config
:
Опция | Значение | Описание |
---|---|---|
TCPKeepAlive | no | Опция для поддержания соединения, предотвращая его закрытие из-за неактивности. |
AddKeysToAgent | yes | Опция, которая указывает, следует ли автоматически добавлять ключи в запущенный ssh-agent |
ServerAliveInterval | 20 | Опция, которая определяет интервал времени в секундах, через который SSH-клиент будет отправлять зашифрованное сообщение на сервер для проверки активности соединения |
UseKeychain | yes | Опция, которая указывает, следует ли системе искать парольные фразы в связке ключей (MacOS, Linux) |
IdentitiesOnly | yes | Опция, которая указывает SSH-клиенту использовать только указанный ключ для аутентификации и игнорировать другие ключи, предлагаемые ssh-agent или находящиеся в каталоге ~/.ssh |
Заключение
Я показал вам, как настроить пользовательский файл конфигурации SSH. Возможно, вы также захотите настроить аутентификацию на основе ключей SSH и подключаться к вашим серверам Linux без ввода пароля.
По умолчанию SSH прослушивает порт 22. Изменение порта SSH по умолчанию добавляет дополнительный уровень безопасности вашему серверу, снижая риск автоматических атак.
Если у вас возникли вопросы, пожалуйста, оставьте комментарий ниже.