3

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

/ И т.д. / пароль

redtest:x:1002:1002::/home/redtest:/usr/bin/redtest

/ USR / бен / redtest

#!/bin/bash
/usr/bin/ssh redtest -t -F ~/.ssh/config

/home/redtest/.ssh/config

Host redtest
        HostName redtest1
        User root
        IdentityFile ~/.ssh/id_rsa

Как правильно настроить что-то подобное или это вообще возможно? Логины один на один с контейнерами. Цени толчок в правильном направлении!

1 ответ1

4

Когда удаленный ssh-клиент запрашивает выполнение команды на сервере, сервер OpenSSH запускает оболочку локального пользователя с опцией -c для запуска команды. Это запускает эквивалент этого:

$SHELL -c 'the requested command'

Например, если удаленный пользователь запустил:

ssh user@somehost 'rm -rf /'

и "user @ somehost" имеет /bin/bash качестве оболочки, тогда сервер будет запускать эквивалент:

/bin/bash -c 'rm -rf /'

SFTP немного сложнее, но вы в конечном итоге на том же месте. Удаленный клиент запрашивает у сервера запуск подсистемы "sftp". В файле sshd_config сервера у вас, вероятно, есть такая строка:

Subsystem sftp /path/to/sftp-server

Эта строка гласит:«Когда клиент запрашивает подсистему 'sftp', запустите /path /to /sftp-server" sftp-server - это программа, включенная в OpenSSH, которая реализует серверную часть протокола SFTP. Поэтому, когда ssh-клиент подключается и запрашивает подсистему sftp, сервер в конечном итоге работает:

$SHELL -c /path/to/sftp-server

(Существует особый случай, называемый «internal-sftp», в который я не буду вдаваться.)

Теперь вы написали скрипт с именем /usr/bin/redtest и установили его в качестве оболочки пользователя. Поэтому, когда удаленный пользователь пытается запустить sftp, сервер в конечном итоге запустится:

/usr/bin/redtest -c /path/to/sftp-server

Ваш redtest скрипт игнорирует командную строку и просто запускает простой ssh-сеанс с целевым сервером. Он никогда не запускает программу sftp-server на целевом сервере.

Чтобы это работало, вам нужно сделать самый быстрый запуск sftp sftp-server на целевом хосте, когда redtest запускается таким образом. Если вы не слишком требовательны к тому, что пользователь запускает на целевом хосте, то что-то вроде этого должно работать:

#!/bin/bash
if [ "$1" = "-c" ]
then
    /usr/bin/ssh redtest -F ~/.ssh/config "$2"
else
    /usr/bin/ssh redtest -t -F ~/.ssh/config
fi

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

Здесь вы можете столкнуться с проблемой, если на хосте перехода и на хосте назначения нет программы sftp-server в одном месте. Сервер ssh на хосте перехода будет пытаться запустить sftp-сервер, используя путь из конфигурации хоста перехода, который может быть неправильным для целевого хоста. Вы должны убедиться, что sftp-server может быть запущен на целевом хосте, используя путь в sshd_config хоста перехода.

Если вы хотите сделать самый redtest скрипт более изощренным, вы можете организовать, чтобы он выполнял что-то вроде этого, когда удаленный пользователь пытается запустить sftp:

/usr/bin/ssh redtest -F ~/.ssh/config -s sftp

Аргументы -s и sftp специально запрашивают запуск подсистемы sftp на целевом хосте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .