Как системный администратор, вы постоянно взаимодействуете с несколькими удалёнными системами. В процессе работы вам необходимо многократно устанавливать SSH-соединения с этими системами. У многих удалённых серверов на Linux доступ осуществляется через пароль, в то время как у других — с использованием приватного ключа. Поэтому управление всеми этими системами может оказаться достаточно непростым.

В данной статье мы рассмотрим, как правильно настроить ваш ssh-сервер и управлять файлами ключей.
Первым шагом в управлении SSH-хостами является настройка аутентификации с использованием публичных и приватных ключей. Это не только повышает уровень безопасности, но и упрощает процесс подключения к серверам. Для этого вам необходимо сгенерировать пару ключей с помощью команды ssh-keygen и скопировать публичный ключ на удалённый сервер с помощью ssh-copy-id.
Также важно правильно организовать хранение приватных ключей. Рекомендуется использовать менеджеры SSH-ключей, такие как ssh-agent, который позволяет загружать ваши ключи в память и использовать их без необходимости вводить пароль каждый раз.
Чтобы избежать путаницы между различными ключами, создавайте уникальные имена для них и используйте файл ~/.ssh/config для настройки конфигурации SSH. Это позволит вам быстро подключаться к разным хостам с использованием разных ключей и параметров подключения.
Не забывайте про безопасность. Настройте права доступа к вашим ключам, установив для приватного ключа режим 600, чтобы ограничить доступ к нему только для вас. Также рекомендуется регулярно обновлять ключи и удалять неиспользуемые из ~/.ssh/authorized_keys на удалённых серверах.
Следуя этим рекомендациям, вы сможете значительно упростить процесс управления SSH-хостами и повысить уровень безопасности вашего окружения.
Содержание статьи
Структура конфигурационного файла:
Вы можете добавить различные параметры для SSH-хостов в файл ~/.ssh/config. Отредактируйте конфигурационный файл с помощью любимого текстового редактора, например, vi, vim или nano.
$ vi ~/.ssh/config
Структура будет выглядеть следующим образом.
Хост HostName Файл идентификации Пользователь Порт Локальная переадресация
Вот пример конфигурации для SSH:
Host myserver
HostName example.com
User myusername
IdentityFile ~/.ssh/id_rsa
Port 22
LocalForward 8080 localhost:80
Каждый параметр имеет свое значение:
- Host — имя хоста, которое будет использоваться для подключения.
- HostName — фактический адрес сервера.
- User — имя пользователя для входа на сервер.
- IdentityFile — путь к файлу с закрытым ключом для аутентификации.
- Port — номер порта для подключения (по умолчанию 22).
- LocalForward — настройка для переадресации портов, которая позволяет вам перенаправлять локальные порты на удаленные адреса.
Дополнительные параметры, которые могут быть полезны:
- ForwardAgent — позволяет передавать агента SSH на удаленный сервер, что может быть полезно для использования других ключей.
- ProxyCommand — позволяет настроить команду прокси для соединения через другой сервер.
- StrictHostKeyChecking — задает, следует ли проверять ключи хоста, при подключении к новому хосту (можно установить на «no» для удобства, но это небезопасно).
Не забудьте сохранить изменения в файле после редактирования, чтобы они вступили в силу. Для этого в vi используйте команду :wq, чтобы выйти и сохранить файл.
Добавление первого SSH-хоста
Предположим, у нас есть первый SSH-хост, который обслуживает веб-сервер для разработки на PHP. Его параметры: никнейм php-web1, пользователь root, порт 22 и доступ через пароль. Добавьте следующее содержимое в конфигурацию.
Host php-web1 HostName 192.168.1.100 User root
Теперь выполните SSH с помощью следующей команды.
$ ssh php-web1
Если вы хотите использовать SSH-ключ для аутентификации, вам нужно будет создать пару ключей с помощью команды ssh-keygen и добавить публичный ключ в файл ~/.ssh/authorized_keys на сервере. Это обеспечит более безопасный доступ без необходимости вводить пароль.
Не забывайте проверять статус вашего SSH-соединения. Если возникнут проблемы, убедитесь, что служба SSH запущена на сервере и что ваш брандмауэр разрешает доступ к порту 22.
Для удобства, вы можете также указать порт в конфигурации, если он отличается от стандартного. Например, если ваш сервер использует порт 2222, то запись будет выглядеть так:
Host php-web1 HostName 192.168.1.100 User root Port 2222
В этом случае для подключения используйте команду $ ssh -p 2222 php-web1.
Храните конфигурационные файлы в безопасности и следите за обновлениями для повышения уровня безопасности вашего сервера.
Добавление второго SSH-хоста
Второй сервер (php-web2) доступен по SSH с использованием ключа, пользователь root, порт по умолчанию 2Внесите следующий текст в конфигурационный файл.
Host php-web2 HostName 192.168.1.101 IdentityFile ~/.ssh/php-web2.pem User root
Теперь попробуйте выполнить SSH с помощью следующей команды.
$ ssh php-web2
После успешного выполнения команды, вы будете подключены к серверу php-webУбедитесь, что файл ключа имеет правильные права доступа. Для этого выполните команду:
$ chmod 600 ~/.ssh/php-web2.pem
Это обеспечит безопасность вашего приватного ключа. Если у вас возникнут проблемы с подключением, проверьте настройки вашего SSH-клиента и наличие доступа к серверу php-web2.
Также вы можете добавить дополнительные параметры к конфигурации хоста, например, указать используемый порт, если он отличается от 22:
Host php-web2 HostName 192.168.1.101 IdentityFile ~/.ssh/php-web2.pem User root Port 2222
После внесения изменений не забудьте сохранить файл и повторно проверить соединение.
Добавление третьего SSH-хоста
Третий сервер (php-db1) работает на порту 2222 и доступен через ключ с пользователем ubuntu. Добавьте следующее содержимое в файл конфигурации.
Host php-db1
HostName 192.168.1.110
Port 2222
IdentityFile ~/.ssh/php-db1.pem
User ubuntu
Теперь выполните SSH с помощью следующей команды.
$ ssh php-db1
Если вы столкнетесь с проблемами подключения, убедитесь, что ключ имеет правильные права доступа, выполнив команду chmod 600 ~/.ssh/php-db1.pem. Также проверьте, что сервер доступен по указанному IP-адресу и порту, выполнив команду telnet 192.168.1.110 2222. Если соединение установлено, вы увидите сообщение о подключении; если нет — проверьте настройки брандмауэра и сетевые правила. Чтобы избежать ввода пароля при каждом подключении, убедитесь, что SSH-агент запущен и ключ добавлен с помощью ssh-add ~/.ssh/php-db1.pem.
Дополнительно, рекомендуется периодически проверять конфигурацию SSH для повышения безопасности. Вы можете использовать опции, такие как ForwardAgent yes для передачи SSH-агента на удаленный сервер, или Compression yes для уменьшения объема передаваемых данных. Не забудьте, что для управления доступом к серверу вы также можете настроить файл /etc/ssh/sshd_config, чтобы ограничить доступ по IP-адресам или включить аутентификацию по ключам, если это еще не сделано.
Для удобства работы можно создать alias для команды SSH, добавив строку Host php-db1-alias в ваш файл конфигурации SSH. Теперь вы сможете подключаться к серверу, просто используя команду
HostName 192.168.1.110
Port 2222
User ubuntussh php-db1-alias.
Настройка перенаправления через SSH
В этой конфигурации нам нужно перенаправить локальный порт 3306 на удаленный сервер (php-db1) на тот же порт. Добавьте следующий текст в конфигурацию.
Host php-db1-mysql-tunnel
HostName 192.168.1.110
Port 2222
IdentityFile ~/.ssh/php-db1.pem
LocalForward 3306 127.0.0.1:3306
Теперь выполните SSH с помощью следующей команды.
$ ssh php-db1-mysql-tunnel
После выполнения этой команды вы сможете подключаться к удаленной базе данных MySQL на php-db1, используя локальный порт 330Убедитесь, что на удаленном сервере MySQL настроен для прослушивания на 127.0.0.1, иначе перенаправление не сработает.
Также проверьте, что файл ключа (php-db1.pem) имеет правильные права доступа (например, chmod 600 ~/.ssh/php-db1.pem), чтобы избежать ошибок при подключении.
Если вы хотите перенаправить другой локальный порт или подключиться к другому сервису на удаленном сервере, просто измените номера портов в строке LocalForward.
Чтобы завершить сессию SSH и остановить перенаправление, просто введите exit в терминале.
Финальный файл конфигурации
Ваш окончательный файл конфигурации .ssh/config будет выглядеть следующим образом.
Host php-web1
HostName 192.168.1.100
User rootHost php-web2
HostName 192.168.1.101
IdentityFile ~/.ssh/php-web2.pem
User rootHost php-db1
HostName 192.168.1.110
Port 2222
IdentityFile ~/.ssh/php-db1.pem
User ubuntuHost php-db1-mysql-tunnel
HostName 192.168.1.110
Port 2222
IdentityFile ~/.ssh/php-db1.pem
LocalForward 3306 127.0.0.1:3306
Этот файл позволяет удобно управлять подключениями к серверам, избавляя от необходимости вводить полные команды для SSH. Вы можете добавлять дополнительные параметры, такие как ForwardAgent для проксирования SSH-агента или ServerAliveInterval для поддержания активного соединения.
Не забывайте устанавливать правильные права доступа к файлу .ssh/config: используйте команду chmod 600 ~/.ssh/config, чтобы защитить его от несанкционированного доступа.
Также стоит отметить, что при использовании IdentityFile важно, чтобы соответствующий приватный ключ имел правильные права доступа (chmod 400 ~/.ssh/php-db1.pem), иначе SSH может отклонить его использование.
Настройка LocalForward позволяет перенаправлять локальные порты на удаленные, что особенно полезно для работы с базами данных или веб-приложениями, требующими доступа к сервисам за фаерволом.
Автоматизация управления ключами и хостами
Эффективное администрирование удалённых серверов требует применения современных методов, которые позволяют снизить ручной труд и минимизировать вероятность ошибок. Автоматизация процессов становится ключевым элементом, позволяющим системным администраторам сосредоточиться на более важных задачах.
Существует несколько инструментов и технологий, которые могут значительно упростить взаимодействие с удалёнными ресурсами и их аутентификацию:
- Использование конфигурационных менеджеров, таких как Ansible, Puppet или Chef, для автоматизации развертывания и настройки серверов.
- Применение системы управления секретами, например HashiCorp Vault, для безопасного хранения и распределения аутентификационных данных.
- Интеграция с CI/CD пайплайнами для автоматизации процессов развертывания и обновления приложений на удалённых машинах.
Ключевыми аспектами автоматизации являются:
- Упрощение рутинных задач.
- Снижение рисков, связанных с человеческим фактором.
- Обеспечение единого подхода к управлению доступом и аутентификацией.
Инструменты автоматизации позволяют настраивать безопасный доступ к ресурсам, а также предоставляют возможности для масштабируемости и гибкости в управлении инфраструктурой.

