Каковы лучшие практики для управления ключами SSH в команде?


42

Я работаю с небольшими командами (<10) разработчиков и администраторов со следующими характеристиками:

  • У большинства членов команды> 1 персональный компьютер, большинство из которых портативные
  • Члены команды имеют доступ к 10-50 серверам, обычно с sudo

Я думаю, что это довольно типично для большинства стартапов и малых и средних корпоративных ИТ-групп.

Каковы лучшие практики для управления ключами SSH в такой команде?

Должны ли вы поделиться одним ключом для всей команды?

Должен ли каждый человек иметь свой собственный ключ в общей учетной записи («ubuntu» на каждом сервере)?

Отдельные аккаунты?

Должен ли каждый член команды хранить отдельный ключ для каждого из своих ноутбуков или настольных компьютеров?

Ответы:


33

В моей компании мы используем LDAP для создания согласованного набора учетных записей на всех компьютерах, а затем используем инструмент управления конфигурацией (в нашем случае в настоящее время cfengine) для распределения authorized_keysфайлов для каждого пользователя по всем серверам. Сами файлы ключей хранятся (вместе с другой информацией о конфигурации системы) в репозитории git, чтобы мы могли видеть, когда ключи приходят и уходят. cfengine также распространяет sudoersфайл, который контролирует, кто имеет доступ для запуска от имени пользователя root на каждом хосте, используя пользователей и группы из каталога LDAP.

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

У нас также есть бастионный хост, который используется для доступа к хостам в производственной сети, что позволяет нам иметь очень строгие правила брандмауэра в этой сети. У большинства инженеров есть специальная конфигурация SSH, чтобы сделать это прозрачным:

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

Добавление нового ключа или удаление старого требует некоторой церемонии в этой настройке. Я бы сказал, что для добавления нового ключа желательно, чтобы он был операцией, которая оставляет контрольный журнал и видна всем. Однако из-за накладных расходов я думаю, что люди иногда забывают удалить старый ключ, когда он больше не нужен, и у нас нет реального способа отследить это, кроме как очистить, когда сотрудник уходит из компании. Это также создает некоторые дополнительные трения при подключении нового инженера, поскольку им необходимо сгенерировать новый ключ и распространить его среди всех хостов, прежде чем они станут полностью продуктивными.

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

При такой настройке утомительно иметь автоматизированные системы, которые принимают меры против рабочих хостов, поскольку их «хорошо известные» ключи SSH могут служить альтернативным путем доступа. До сих пор мы только что предоставили учетным записям пользователей этих автоматизированных систем только минимальный доступ, который им необходим для выполнения своей работы, и признали, что злонамеренный пользователь (который должен быть уже инженером с производственным доступом) также может выполнять те же самые действия на полпути. анонимно используя ключ приложения.


Это действительно хороший ответ! Дополнительный вопрос: вы используете cfengine для распространения .authorized_keys. Вы рассматривали какой-либо из способов хранения открытых ключей SSH непосредственно на вашем сервере LDAP? Они в основном требуют исправления sshd, который кажется хрупким.
Эван Продрому

Я сделал нечто подобное с шеф-поваром.
gWaldo

1
@EvanProdromou Я настроил открытые ключи SSH в LDAP, но это было намного сложнее, чем стоило, учитывая, что мне приходилось обновлять пакеты SSH самостоятельно, и это было во время нескольких уязвимостей SSH
Даниэль Лоусон

1
Правила Sudo и SSH-ключи также могут быть помещены в LDAP, SSSD может использоваться для настройки этого. Ссылки: sudo.ws/sudoers.ldap.man.html и access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/...
фуэрос

Мне нравится твой ProxyCommand ssh -qкусочек там! Никогда этого не видел. Я не решаюсь установить бастионный сервер, но если он может быть прозрачным для конечных пользователей, то я могу быть за это. Спасибо Мартин!
the0ther

6

Лично мне нравится идея, что каждый сотрудник имеет один ключ на выделенной машине ssh-бастиона, на которой у него есть базовая учетная запись пользователя. Эта учетная запись пользователя имеет 1 ключ SSH, который предоставляет доступ ко всем серверам, которые они должны использовать. (эти другие серверы также должны быть отключены брандмауэром, чтобы был включен только ssh-доступ с бастионного компьютера)

Затем на своих повседневных рабочих машинах, ноутбуках, планшетах и ​​т. Д. Они могут по своему выбору иметь один или несколько ключей между ними.

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


5

У меня была ситуация, когда мне нужно было обеспечить доступ по SSH-ключу для команды из 40 разработчиков на ~ 120 удаленных клиентских серверах.

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


2

Лично я согласился бы на каждого пользователя, тогда вы мгновенно получаете ответственность и гораздо легче устанавливаете ограничения - я не знаю, что думают другие?


2

Один из подходов, о котором я слышал, но не использовал сам, заключается в том, чтобы у каждого пользователя был пакет (например, .deb, .rpm), содержащий конфигурацию открытого ключа ssh, а также любые файлы точек, которые он хотел бы настроить (.bashrc). .profile, .vimrc и т. д.). Это подписано и хранится в хранилище компании. Этот пакет также может отвечать за создание учетной записи пользователя или дополнять создание учетной записи (cfengine / puppet и т. Д.) Или центральную систему аутентификации, такую ​​как LDAP.

Эти пакеты затем устанавливаются на хосты с помощью любого механизма, который вы предпочитаете (cfengine / puppet и т. Д., Cron job). Одним из подходов является создание метапакета, который зависит от пользовательских пакетов.

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

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

Как я уже сказал, я сам этого не делал. Преимущество этого подхода для меня заключается в том, что он дополняет центральную систему LDAP и центральное управление учетными записями пользователей, поскольку позволяет пользователю легко обновлять свой пакет, например, для включения его файла .vimrc, без необходимости управлять этим файлом. с помощью таких инструментов, как кукольный, к которым пользователь может не иметь доступа.


1

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

Если у вас есть общие ключи между пользователями - даже если вы небольшая команда - отзыв ключа является неудобством для всех остальных.

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


1

Несколько лет назад Envy Labs написала инструмент под названием Keymaster (в партнерстве с клиентским гейткипером), чтобы обрабатывать что-то подобное для команд разработчиков.

За последние два года у проекта не было особой любви, но, скорее всего, вы могли бы с ним что-то сделать и, возможно, вернуть к жизни?

Репо доступно в github: https://github.com/envylabs/keymaster


-4

Можно было бы настроить NIS-сервер с / home share через NFS. Это сочетается с sudo на серверах и позволяет только пользователям, которых вы хотите, на каждый сервер через конфигурацию ssh.

Таким образом, каждый член команды использует только одного пользователя и его ключ для доступа ко всем серверам. Sudo и один пароль для задач администратора.

С Уважением,

Рафаэль


1
1) Включение NIS - это дыра в безопасности. 2) Наличие одного пароля и учетной записи противоречит отслеживаемости и ответственности.
Охотник на оленей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.