Вопрос или проблема
Рассмотрим следующий сценарий:
Я вхожу на серверA как пользователь ‘common’. Основное в пользователе common — это то, что множество людей имеют к нему доступ — он изначально неограничен и небезопасен.
Допустим, мне периодически нужно входить с этого пользователя/сервера на serverB как пользователь secure — т.е., мне нужно передавать файлы, принадлежащие secure@serverB.
Хотя у меня есть полный доступ и контроль над пользователем secure, я определённо не хочу добавлять открытый ключ common в доверенные ключи для пользователя secure — я не хочу, чтобы кто угодно, кто может войти как common, также мог войти как secure.
Я также не хочу вводить пароль secure пять раз в час. В идеале, я бы хотел ввести его один раз, чтобы какой-то агент или что-то подобное волшебно его запомнил — но только для этой сессии входа — и затем использовал его всякий раз, когда я подключаюсь из этой сессии до истечения времени. На самом деле это похоже на kinit
.
Есть ли что-то, что может достичь этой цели?
Это не так просто, если у вас общий пользователь на промежуточном сервере, и у этого пользователя есть доступ к оболочке, поскольку почти все там по умолчанию доступно каждой новой сессии.
Конечно, существуют способы в современных ядрах.
Либо может существовать инструмент, который использует ключи сессий (процессов/потоков) для хранения личных данных в ядре, либо систему, возможно, можно сделать достаточно безопасной, чтобы запретить различным процессам одного и того же пользователя доступ друг к другу, так что программа могла бы хранить информацию об аутентификации также в обычной пользовательской памяти, защищённой от других сессий. В любом случае, оба варианта должны идентифицировать запросы на аутентификацию на основе данных PID/SID, которые будут работать для базового использования. В конце концов, вам нужен демон, который выполняет настройку сессии для вас или доставляет сохраненные пароли вашему процессу, чтобы вы смогли использовать его с инструментом sshpass или подобным.
Другой подход — использовать пространства имён и смонтировать приватную tmpfs или tmpdir (хотя tmpfs лучше защищён или, по крайней мере, менее доступен для пользователей root, чем tmpdir).
Вы могли бы либо использовать sshd на отдельном порту с обёрткой, которая настроит окружение пространства имён для этого пользователя, либо, что проще всего в современной системе, вы можете использовать pam и pam_namespace.so для настройки личного временного каталога пользователя или tmpfs. Там вы могли бы хранить либо свой пароль в открытом виде для использования с sshpass или подобным, либо, что даже лучше, могли бы поместить сокет для ssh-agent в этот каталог и загрузить свой личный закрытый ключ в этот агент, обеспечив защиту доступа к агенту от доступа другими сессиями одного и того же пользователя. Если у вас есть закрытый ключ с надёжным паролем, вы также можете хранить его на машине. В противном случае вам пришлось бы передать его. Вы также могли бы сделать весь каталог /tmp таким приватным каталогом (возможно, с некоторыми подкаталогами, разделяемыми) и использовать SSH агент форвардинга достаточно безопасным способом (вы не можете реально защитить его от злоупотребления со стороны пользователя root, но, по крайней мере, если вы используете tmpfs, это сложно для root и невозможно для обычного пользователя использовать Auth-Sock).
В любом случае вы должны иметь возможность конфигурировать сервер достаточно или он должен быть сконфигурирован достаточно — по крайней мере, настолько, чтобы процессы пользователей не могли подключаться друг к другу.
Возможно, вы ищете ssh-agent
, который поставляется с OpenSSH. Используйте опцию -t
для установки времени ожидания.
.
Ответ или решение
Для решения вашей задачи по запоминанию пароля SSH для одной сессии в условиях, когда вы не хотите сохранять ключи на общедоступном сервере, есть несколько подходов.
Использование ssh-agent:
Наиболее подходящим инструментом в вашей ситуации является ssh-agent
, который поставляется вместе с OpenSSH. Этот агент позволяет временно хранить пароли или фразы доступа к закрытым ключам в памяти. Вы можете задать время действия ключей с помощью опции -t
, что позволяет автоматически их удалять после определенного периода.
Шаги по настройке ssh-agent:
- Запустите
ssh-agent
в вашей сессии:eval $(ssh-agent -s)
- Добавьте закрытый ключ с указанием тайм-аута:
ssh-add /путь/к/закрытому_ключу -t 3600 # 3600 секунд — это 1 час
- Теперь
ssh-agent
будет автоматически авторизовывать вычислительные процессы, такие какscp
, без необходимости ввода пароля каждый раз.
Альтернативный подход с pam_namespace.so:
Если ваш сервер поддерживает PAM (Pluggable Authentication Modules), вы можете использовать pam_namespace.so
для изоляции сессии. Это позволяет создать временное файловое пространство (tmpfs) для пользователя, которое может хранить только сокет ssh-agent
. Важно убедиться, что доступ к этому пространству ограничен сессионными и пользовательскими правами.
- Настройте
pam_namespace.so
в/etc/pam.d/
, чтобы создать отдельное временное пространство. - Настройте
ssh-agent
, чтобы его сокет находился в этом пространстве.
Важные аспекты безопасности:
- Не храните пароли или ключи в открытом виде. Если это невозможно, обеспечьте их надежное шифрование.
- Ограничьте права доступа к созданному пространству, чтобы другие процессы от этого же пользователя не могли получить к нему доступ.
Используя предложенные методы, вы можете безопасно и эффективно управлять входами на второй сервер в рамках одной сессии без излишнего ввода паролей, учитывая особенности безопасности.