Безопасное совместное использование доступа SSH в команде с SSH бастион

Мне нужно поделиться SSH-доступом к нескольким серверам с моими товарищами по команде и искать безопасный способ сделать это. Я придумал конфигурацию, включающую бастионный сервер SSH, но не уверен, как (и если) это можно сделать.

Я хочу, чтобы на каждом сервере был разрешен только один ключ SSH, а не один на пользователя, поэтому мне не нужно постоянно обновлять их. Каждый пользователь должен иметь доступ к бастионному серверу с помощью своего собственного ключа ssh. Все закрытые ключи сервера должны быть размещены на бастионном сервере. Каким-то образом они должны использоваться всеми пользователями для входа на серверы, но не для чтения или копирования.

Поэтому мой вопрос: можно ли это сделать и как?

2 ответа

Я согласен с комментарием, что это плохая идея.

Когда вы пишете "Все личные ключи сервера должны быть размещены на бастионном сервере", я предполагаю, что вы ссылаетесь не на фактические личные ключи сервера, а на личные ключи, которые разрешены для серверов в allow_keys.

В любом случае, чтобы ответить на ваш вопрос, вы можете запустить на своем бастионном сервере агент ssh от имени какого-либо пользователя и загрузить все ключи в агент. Обычно сокет для доступа к агенту доступен только пользователю, запускающему агент, но его можно изменить позже с помощью chmod или chown. Вы можете автоматизировать это при запуске сервера. Более поздние пользователи могут получить доступ к сокету для агента, и агент обеспечит аутентификацию на сервере, но не позволит скопировать ключ. Одна из проблем заключается в том, что сервер SSH разрешает только ограниченное количество попыток с ключом. Если у вас больше серверов, чем разрешенных попыток, вам понадобится один агент для каждого сервера (или по одному агенту для каждой достаточно небольшой группы серверов).

Ansible был предложен. Ansible - отличный инструмент для управления конфигурацией, но вы можете счесть его излишним использовать его только для ключей. В любом случае, посмотрите, если у вас большое количество серверов, вы можете найти его полезным и для других задач.

Поскольку каждый пользователь должен иметь доступ к бастионному серверу со своим собственным ключом ssh, это означает, что на вашем бастионном сервере имеется обновленный файл авторизованные_коды. Поэтому существует простое решение: создайте такой скрипт и запускайте его всякий раз, когда этот файл изменяется. Недостатки в том, что он должен быть запущен от имени пользователя 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 и запросить его у серверов.

Если это невозможно, и вам не нравится сценарий, который копирует файл author_keys каждого пользователя, вы можете создать один файл, в котором перечислены имена пользователей и ключи SSH. Настройте автоматическое распространение этого файла на серверы. Файл не должен принадлежать пользователю root, поэтому для этого будет достаточно отдельной учетной записи пользователя. На всех серверах один раз настройте в sshd_config запись AuthorizedKeysCommand с именем скрипта, который читает этот файл со всеми ключами и возвращает ключ для пользователя, пытающегося войти в систему. Этот скрипт должен запускаться как пользователь, который должен иметь доступ к файлу, содержащему ключи SSH. Вы можете сделать этот файл нечитаемым для ваших пользователей, но в этом нет необходимости, поскольку он содержит только открытые ключи и не является конфиденциальным.

Если вы хотите использовать отдельные ключи SSH для каждого пользователя, но только одну учетную запись, просто настройте автоматическое распределение авторизованных ключей для этой учетной записи.

for host in $HOST_LIST; do
    scp -p authorized_keys account@$host:.ssh/authorized_keys
done

Проект CLD подходит для этих целей https://github.com/classicdevops/cld

если у вас есть вопросы, задавайте в комментариях, я обновлю пост

Другие вопросы по тегам