Введение
Если вы регулярно ежедневно подключаетесь к нескольким удаленным системам через SSH, вы обнаружите, что запомнить все удаленные IP-адреса, разные имена пользователей, нестандартные порты и различные параметры командной строки сложно, если вообще возможно.
Одним из вариантов может быть создание псевдонима bash для каждого подключения к удаленному серверу. Однако есть другое лучшее и простое решение этой проблемы. OpenSSH позволяет вам настроить один файл конфигурации для каждого пользователя, где вы можете хранить различные параметры SSH для каждой удаленной машины, к которой вы подключаетесь.
В этом руководстве рассматриваются основы файла конфигурации клиента SSH и объясняются некоторые из наиболее распространенных параметров конфигурации.
Предпосылки
Допустим, вы используете систему Linux или macOS с установленным клиентом OpenSSH.
Расположение файла конфигурации SSH
Файл конфигурации OpenSSH на стороне клиента называется config
и хранится в каталоге .ssh
в домашнем каталоге пользователя. Каталог ~/.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.
Отступ не обязателен, но рекомендуется, так как это облегчит чтение файла.
Директива 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
:
man ssh_config
Или посетив справочную страницу ssh_config.
Файл конфигурации SSH также читается другими программами, такими как scp
, sftp
и rsync
.
Пример базового файла конфигурации SSH
Теперь, когда мы рассмотрели базовый файл конфигурации SSH, давайте рассмотрим следующий пример.
Обычно при подключении к удаленному серверу по SSH необходимо указать имя удаленного пользователя, имя хоста и порт. Например, чтобы подключиться как пользователь с именем alice
к хосту с именем dev.example.it
порт 2322
из командной строки, введите:
ssh [email protected] -p 2322
Если вы предпочитаете подключаться к серверу, используя те же параметры, что и в приведенной выше команде, просто набрав ssh dev
, вам нужно будет поместить следующие строки в файл ~/.ssh/config
, а затем открыть файл:
nano ~/.ssh/config
Host dev
HostName dev.example.it
User alice
Port 2322
Теперь, если вы наберете:
ssh dev
клиент ssh прочитает файл конфигурации и будет использовать сведения о соединении, указанные для хоста dev
.
Пример общего файла конфигурации 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
. Полный список опций, используемых в этом случае, выглядит следующим образом:
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
- Все остальные соединения будут использовать параметры, указанные в разделах
Host *!martell
иHost *
.
Перезаписать параметры файла конфигурации SSH
Клиент ssh получает свою конфигурацию в следующем порядке приоритета:
- Параметры, указанные в командной строке
- Параметры определены в
~/.ssh/config
- Параметры определены в
/etc/ssh/ssh_config
Если вы хотите переопределить один параметр, вы можете указать его в командной строке. Например, если у вас есть следующее определение:
Host dev
HostName dev.example.it
User john
Port 2322
и вы хотите использовать все остальные параметры, но подключиться как пользователь root
вместо alice
, просто укажите пользователя из командной строки:
ssh -o "User=root" dev
Параметр -F
( configfile
) позволяет указать альтернативный файл конфигурации пользователя.
Если вы хотите, чтобы ваш клиент ssh игнорировал все параметры, указанные в вашем файле конфигурации ssh, вы можете использовать:
ssh -F /dev/null [email protected]
Вывод
Вы узнали, как настроить пользовательский файл конфигурации ssh. Вы также можете настроить аутентификацию на основе ключей SSH и подключаться к серверам Linux без ввода пароля.
По умолчанию SSH прослушивает порт 22. Изменение порта SSH по умолчанию добавляет серверу дополнительный уровень безопасности, снижая риск автоматических атак.