Мне нужно поделиться SSH-доступом к нескольким серверам с моими товарищами по команде, и я ищу безопасный способ сделать это. Я придумал конфигурацию, включающую сервер-бастион SSH, но не уверен, как (и если) это можно сделать.
Я хочу, чтобы для каждого сервера был разрешен только один SSH-ключ, а не один для каждого пользователя, поэтому мне не нужно постоянно их обновлять. Каждый пользователь должен иметь доступ к серверу-бастиону со своим ssh-ключом. Все закрытые ключи сервера должны быть размещены на сервере-бастионе. Каким-то образом они должны быть доступны всем пользователям для входа на серверы, но не для чтения или копирования.
Итак, мой вопрос: можно ли это сделать и как?
Я согласен с комментарием, что это плохая идея.
Когда вы пишете «Все закрытые ключи сервера должны быть помещены на сервер-бастион», я предполагаю, что вы ссылаетесь не на фактические закрытые ключи сервера, а на закрытые ключи, которые разрешены для серверов в allowed_keys.
В любом случае, чтобы ответить на ваш вопрос, вы можете запустить ssh-агент на своем бастионном хосте как некоторый пользователь и загрузить все ключи в агент. Обычно сокет для доступа к агенту доступен только пользователю, запускающему агент, но это можно изменить позже с помощью chmod или chown. Вы можете автоматизировать это при запуске сервера. Позже пользователи могут получить доступ к сокету для агента, и агент предоставит аутентификацию серверу, но не разрешит копирование ключа. Одна из проблем заключается в том, что SSH-сервер разрешает только ограниченное количество попыток с ключом. Если у вас больше серверов, чем разрешено попыток, вам понадобится по одному агенту для каждого сервера (или по одному агенту для достаточно небольшой группы серверов).
Был предложен Ansible. Ansible - отличный инструмент для управления конфигурацией, но вы можете счесть излишним использовать его только для ключей. В любом случае поищите его, если у вас большое количество серверов, вы можете найти его полезным и для других задач.
Поскольку каждый пользователь должен иметь доступ к серверу бастиона со своим собственным ключом ssh, это означает, что на вашем сервере бастиона есть актуальный файл authorized_keys. Итак, есть простое решение: создать такой сценарий и запускать его при каждом изменении файла. Недостатки в том, что он должен запускаться от имени пользователя root для доступа к файлам от всех пользователей, а для удаления доступа для пользователя вы должны обрезать файл, но не удалять его.
for host in $HOST_LIST; do
for user in $USER_LIST; do
eval scp -p ~$user/.ssh/authorized_keys $host:~$user/.ssh/authorized_keys
done
done
Если вы можете подключить все серверы к одному серверу LDAP (или к вторичным серверам вашего первичного сервера LDAP), просто попросите каждого пользователя поместить свой открытый ключ SSH в каталог LDAP и запросить его с серверов.
Если это невозможно, и вам не нравится сценарий, который копирует файл authorized_keys каждого пользователя, вы можете создать один файл, в котором перечислены имена пользователей и ключи SSH. Настройте автоматическое распространение этого файла на серверы. Файл не обязательно должен принадлежать пользователю root, поэтому для этого будет достаточно специальной учетной записи. На всех серверах однажды сконфигурируйте в sshd_config запись AuthorizedKeysCommand с именем сценария, который читает этот файл со всеми ключами и возвращает ключ для пользователя, пытающегося войти в систему. Этот сценарий должен запускаться от имени пользователя, который должен иметь доступ к файлу, содержащему ключи SSH. Вы можете сделать этот файл нечитаемым для ваших пользователей, но в этом нет необходимости, поскольку он содержит только открытые ключи, и они не являются конфиденциальными.
Если вам нужны отдельные SSH-ключи для каждого пользователя, но только одна учетная запись, просто настройте автоматическое распределение authorized_keys для этой одной учетной записи.
for host in $HOST_LIST; do
scp -p authorized_keys account@$host:.ssh/authorized_keys
done