Назад | Перейти на главную страницу

Безопасный совместный доступ по SSH в команде с SSH bastion

Мне нужно поделиться 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