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

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

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

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

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 особым образом.

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

Я реализовал ssh-агент-фильтр для себя, использую с:

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

Это уже есть в Debian (и Ubuntu).

Вы можете использовать несколько агентов и указать каждого отдельно, используя 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

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

Это означает, что вы можете использовать фильтр ssh-agent, чтобы отфильтровать только тот ключ, который вы хотите получить на удаленном компьютере, и изменить env. var из фильтра 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-agent.