Пересылка доступа к подмножеству идентификаторов ssh-agent

Вопрос или проблема

Я работаю на две компании (назовем их RedCorp и BlueCorp). Обе компании доверяют мне, но не доверяют друг другу, и я не хочу раскрывать секреты одной другой.

У моего ноутбука есть ssh-агент с двумя закрытыми ключами, по одному для доступа к каждой компании. Я могу запустить:

ssh -A redcorp-server1

и получить доступ ко всем другим серверам RedCorp оттуда, благодаря подключенному агенту.

Аналогично, я могу запустить:

ssh -A bluecorp-server1

и получить доступ ко всем другим серверам BlueCorp оттуда.

Проблема в том, что всякий раз, когда я залогинен на redcorp-server1, тамошний пользователь root может установить переменную $SSH_AUTH_SOCK на мою соединение с перенаправленным агентом, и злоупотребить моей другой идентичностью, чтобы получить доступ к BlueCorp.

Как я могу этого предотвратить?

Опция IdentitiesOnly в ssh не решает мою проблему. Она лишь контролирует, какой ключ я предлагаю при аутентификации на redcorp-server1; это не изменяет тот факт, что моё соединение с перенаправленным агентом позволяет ssh-процессу на redcorp-server1 аутентифицироваться, используя любую из моих идентичностей.

Единственным решением, которое я нашёл, является запуск двух отдельных ssh-агентов и загрузка по одному ключу в каждый из них. Но это крайне неудобно: нет способа в конфигурации ssh_config указать, какой из моих агентов я должен использовать при подключении к конкретному хосту. Вместо этого мне пришлось создать алиасы командной оболочки на моем ноутбуке для каждой из двух компаний, которые указывают на правильный $SSH_AUTH_SOCK перед запуском ssh. Также я использую rsync и дюжину других инструментов, которые используют ssh как транспорт, и каждый из них нужно настраивать с помощью разного синтаксиса, чтобы заставить их вызывать ssh таким особым образом.

Существует ли лучший способ сделать это?

Теперь вы можете использовать несколько агентов и конкретно указывать каждый из них с помощью IdentityAgent и добавлять необходимые ключи с помощью IdentityFile и устанавливать AddKeysToAgent на yes. Вам также нужно будет указать unix-сокет для каждого ssh-agent, к которому нужно привязаться, с помощью опции -a. Вы также можете, конечно, добавить ключи вручную с помощью ssh-add после их создания.

Сначала создайте ваш агент:

ssh-agent -a ~/.ssh/redcorp-agent

Затем в вашем .ssh/config должно быть что-то вроде этого:

Host redcorp* *.redcorp.com
IdentityFile ~/.ssh/redcorp.pem
IdentityAgent ~/.ssh/redcorp-agent
AddKeysToAgent yes
ForwardAgent yes

Я реализовал ssh-agent-filter для себя, используйте его следующим образом:

$ afssh -c id_bluecorp -- server1.bluecorp.com
$ afssh -c id_bluecorp -- server2.bluecorp.com
$ afssh -c id_redcorp -- server42.redcorp.com

Он уже в Debian (и Ubuntu).

Существует патч для openssh, который будет перенаправлять ssh-агент, указанный переменной окружения SSH_AUTH_SOCK_FORWARD, на удаленный хост и использовать обычную переменную окружения SSH_AUTH_SOCK для аутентификации на хосте.

Это означает, что вы можете использовать фильтр ssh-agent, чтобы фильтровать только тот ключ, который вам нужен на удаленной машине, и изменить переменную окружения из фильтра ssh-agent на SSH_AUTH_SOCK_FORWARD, оставив все ваши ключи в агенте SSH_AUTH_SOCK.

Вы можете найти патч здесь:

https://bugzilla.mindrot.org/show_bug.cgi?id=1937

Надеюсь, его применят к openssh.

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

Ответ или решение

Решение для управления доступом к идентификационным данным ssh-agent для нескольких служб

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

Проблема с переадресацией идентификационных данных

Когда вы подключаетесь к серверу, используя ssh -A для переадресации агента, существует риск расшатывания безопасности: пользователь на сервере может установить переменную окружения $SSH_AUTH_SOCK, которая указывает на ваш локальный ssh-agent. Это позволяет этому пользователю использовать все ваши ключи, в том числе ключи из таблицы другой компании, что вызывает серьезные проблемы с безопасностью.

Решения проблемы

  1. Использование нескольких ssh-агентов
    Создание отдельных ssh-агентов для каждой компании – это один из наиболее безопасных, хотя и хлопотных методов. Вам следует запускать ssh-agent для каждой компании и загружать в него только соответствующий ключ.

    Пример:

    ssh-agent -a ~/.ssh/redcorp-agent
    ssh-add ~/.ssh/redcorp.pem

    Затем в вашем файле конфигурации .ssh/config следует прописать:

    Host redcorp* *.redcorp.com
       IdentityFile ~/.ssh/redcorp.pem
       IdentityAgent ~/.ssh/redcorp-agent
       AddKeysToAgent yes
       ForwardAgent yes
  2. Использование ssh-agent-filter
    Вариант с использованием ssh-agent-filter позволяет получать доступ к ключам из вашего основного агента на основании контекста. Это избавляет от необходимости ручной смены агентов. Используя команду afssh, вы можете выбирать, какой из ключей будет доступен на удаленном сервере.

    $ afssh -c id_bluecorp -- server1.bluecorp.com
    $ afssh -c id_redcorp -- server42.redcorp.com
  3. Патч для OpenSSH
    Существует патч для OpenSSH, который позволяет использовать переменную окружения SSH_AUTH_SOCK_FORWARD для управления ключами, доступными на удаленных серверах. Это позволяет вам оставить все ключи в вашем основном ssh-agent и лишь временно через SSH_AUTH_SOCK_FORWARD предоставить нужный ключ для использования на удаленных серверах. Вы можете ознакомиться с патчем здесь.

Рекомендации по безопасности

  • Регулярно обновляйте ваши ключи и агенты: Убедитесь, что ваши ключи защищены и обновляются по мере необходимости, особенно в среде с несколькими уровнями доступа.
  • Ограничьте доступ к вашему компьютеру: Убедитесь, что ваши рабочие устройства надёжно защищены от несанкционированного доступа.
  • Мониторинг доступа: Используйте системы мониторинга для отслеживания доступа к вашим ключам и ssh-агентам.

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

Оцените материал
Добавить комментарий

Капча загружается...