Используйте бинарный файл-обертку
Для этого конкретного случая использования (см. Важное примечание ниже), одна возможность состоит в том, чтобы создать пользователя (скажем support-ssh
) специально для этих исходящих соединений SSH, а затем установить небольшой двоичный файл-обертку, который исполняется /usr/bin/ssh
.
- Не копируйте + chmod сам
ssh
бинарный файл, потому что вы не забудете повторять его каждый раз, когда применяете обновления безопасности.
- И не используйте
root
в качестве более привилегированного пользователя, по причинам, которым я доверяю, это очевидно.
Это функционально эквивалентная альтернатива использованию sudo
для повышения привилегий support-ssh
учетной записи со следующими компромиссами:
- Это меньше и меньше
sudo
, так что меньше риск появления ошибки конфигурации, чем вы предполагали.
- Вы несете ответственность за правильное кодирование - делайте это только в том случае, если вы очень осторожны и (в идеале) имеете опыт кодирования, критичного для безопасности.
- Его можно
sudo
настроить более конкретно, чем (но чем больше кода вы пишете, тем больше вам нужно проводить аудит для обеспечения безопасности).
Двоичный файл оболочки должен указывать HOME
на support-ssh
домашний каталог пользователя, чтобы ssh
подобрать соответствующий ssh_config
и закрытый ключ. Но вызывающему пользователю не должно быть разрешено читать ~support-ssh/.ssh/
или его содержимое.
Обертка может быть такой простой, как:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
Вы можете захотеть быть более строгим и проверить, что аргумент argv[1]
находится в наборе разрешенных имен хостов. Или менее строгие, и позволяют (подмножество) аргументов опции. Возможно, вы захотите полностью заменить переменные окружения (но оставьте важные, такие как TERM
, LC_*
и т. Д.); обратите внимание, что LD_LIBRARY_PATH
и LD_PRELOAD
особенно опасно.
Аналогичная программа-обертка может быть предоставлена для scp
при необходимости.
Примечание о применимости
В этом ответе рассматриваются конкретные обстоятельства вопроса, когда пользователи по контракту обязаны соблюдать процедуры, и существуют санкции (например, увольнение) за их нарушение. Предполагается, что вы хотите не допустить, чтобы сотрудники случайно копировали личные ключи, вместо того, чтобы помешать определенному злоумышленнику получить несанкционированный доступ.
Я придерживаюсь мнения, что безопасность достигается как с помощью технических, так и нетехнических средств защиты, и что баланс, достигнутый здесь, или с помощью использования sudo
, соответствует представленной ситуации.