Securely sharing SSH access in a team with SSH bastion

I need to share SSH access to a number of servers with my teammates and looking for a secure way to do it. I came up with a configuration involving a SSH bastion server, but not sure how (and if) it could be done.

I want to have only one SSH key allowed per server, not one per user, so I do not have to update them all the time. Every user should have an access to the bastion server with his own ssh key. All the server private keys should be placed on a bastion server. Somehow they should be usable by all the users to login to servers, but not to read or copy.

So my question is can this be done and how?

0
задан 25 July 2018 в 20:26
1 ответ

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

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

for host in $HOST_LIST; do
    scp -p authorized_keys account@$host:.ssh/authorized_keys
done
0
ответ дан 24 November 2019 в 02:14

Теги

Похожие вопросы