LINUX.ORG.RU
решено ФорумAdmin

Теоретические вопросы по SFTP


0

1

Доброго времени суток.

Пытаюсь разобраться с sftp. Понимаю, что не понимаю ничего.

В rfc4254 сказано, что

а) sftp - отдельная подсистема (subsystem) sftp

б) после установки сессии, на сервере запускается программа, шелл или подсистема (subsystem), зависит это от запроса.

При этом: как альтернатива sftp-server'у, входящему в состав openssh, можно использовать MySecureShell, который позволяет много чего настроить. Причём для использования MySecureShell достаточно прописать его в качестве оболочки (shell) пользователя.

Каким образом MySecureShell вообще будет выполняться, если клиент запросил не shell, а sftp subsystem?

★★★★★

Последнее исправление: router (всего исправлений: 2)

Дело в том, что sftp работает поверх нижележащего протокола (которым чаще всего является ssh2), а тот самый нижележащий как раз использует шелл. Так вот чтобы защититься, либо создать пачку виртуальных пользователей под это как раз и делают специальные шеллы, заточенные под sftp (например, rssh).

// На истину не претендую.

madgnu ★★★★★
()
Ответ на: комментарий от madgnu

Ты спас мой мозг :) Огромное спасибо!

Немного приду в себя, потом продолжу курить rfc до полного просветления

router ★★★★★
() автор топика
Ответ на: комментарий от o

Посмотри документации и оффсайты openssh и mysecureshell.

Суровые люди, воспитанные разведчиками. Лишнего не сболтнут, особенно деталей реализации. Лучше уж rfc, чем исходники ;)

router ★★★★★
() автор топика
Ответ на: комментарий от router

Там, кроме слова «just» ещё много других слов, в том числе и на /bin/sh и видно, что для замены sftp нужно вызывать «/bin/MySecureShell -c sftp-server», а если прочитать «man MySecureShell», то там нет такой опции.

Это должно наводить на мысль, что не всё так чисто, раз опцию не документировали, смотрим исходиники и видим, что если MySecureShell вызван с аргументом, содержащим подстроку «sftp-server», то он считает себя sftp сервером:

  if (ac == 3 && av[1] != NULL && av[2] != NULL                                 
      && strcmp("-c", av[1]) == 0                                               
      && (strstr(av[2], "sftp-server") != NULL ||                               
          strstr(av[2], "MySecureShell") != NULL))  

Если посмотреть исходники openssh, то для sftp он запускает внешнюю команду, причём делает это так

"/bin/sh -c /usr/libexec/openssh/sftp-server",
где /bin/sh это шелл пользователя, а путь к sftp серверу зашит в бинарник sshd (и может быть переопределён в конфиге).

Начиная с версии 4.9 в sshd появился internal-sftp, и, получается, что если sshd сконфигурирован на использование встроенного sftp сервера, то MySecureShell не сможет на это повлиять. Хотя я это не проверял.

mky ★★★★★
()
Ответ на: комментарий от mky

Но это всё равно не значит

чтобы их продукт использовался вместо sftp (сервера) нужно править конфиг sshd

т.к. в дефолтном конфиге как раз не используется internal-sftp. Т.е. правка sshd_config требуется для того, чтобы MySecureSheell

1) всегда использовался для реализации подсистемы sftp, независимо от шела пользователя

2) использовался только для реализации подсистемы sftp, не затрагивая возможность вызова шела и приложений (на что как раз намекает слово just)

А вообще, огромное спасибо за исследование, теперь таинственное влияние шела на подсистему sftp полностью освещено :)

router ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.