Использует ли OpenSSH SFTP-сервер umask или сохраняет клиентские разрешения после команды put (chrooted окружение)?

13

Я знаю, что этот вопрос уже обсуждался, но, читая посты, я не мог понять ответы, потому что некоторые говорили: «Да, umask может работать», а другие говорят: «Команда openSSH put всегда сохраняет разрешения».

Прежде всего, чтобы уточнить:

  • Я использую OpenSSH 5.9 на RHEL 6.2
  • Я настроил привязанный SFTP-сервер, используя internal-sftpподсистему, -u 0002для umask
  • Я точно не использую опцию -pили-P

Из того, что я прочитал с одной стороны: есть много способов определить umask для SFTP-передач:

  • вариант -uиз internal-sftp(или sftp-server), так как OpenSSH 5.4
  • создайте оболочку для sftp-server(в которой мы явно устанавливаем umask - кстати, это не подходит для chrooted окружения)
  • добавить конкретную конфигурацию в pam.d/sshdфайл

С другой стороны, я прочитал:

SFTP-клиент и сервер OpenSSH передают разрешения (как расширение) и создают удаленный файл с разрешениями на локальной стороне. AFAICT, нет способа отключить это поведение.

Итак, я сделал следующий тест:

На моем клиенте я создал файл MYFILEи каталог MYDIRс разрешениями 600 и 700.

Затем с помощью sftpкоманд:

mkdir => the new directory has permissions following the umask (OK)
put MYFILE => MYFILE has same permissions as on client (KO)
put -r MYDIR => MYDIR has same permissions as on client (KO)

Если изменить разрешения MYFILEи MYDIRна стороне клиента, и загрузить снова, я получаю новые разрешения на стороне сервера.

Я pam.dтоже попробовал решение, но оно ничего не изменило.

Так что теперь я в замешательстве:

Из того, что я тестировал, и из части того, что я читал, я бы сказал, что OpenSSH всегда сохраняет права доступа. Но так как есть много сообщений, в которых говорится, что можно определить umask, я могу представить, что я сделал неправильную вещь в своих тестовых конфигурациях.

Буду признателен за опытную обратную связь.

Спасибо.

drkzs
источник

Ответы:

12

Во-первых, umask - это сервер, а не клиент. Поэтому спрашивать, использует ли putкоманда клиента OpenSSH umask, неправильно. Вы должны спросить, использует ли сервер OpenSSH umask при создании файла в результате загрузки SFTP.

В любом случае, что делает SFTP-клиент OpenSSH:

  • putбез -Pфлага он просит сервер создать файл с теми же правами, что и у локального файла. Затем сервер OpenSSH (неявно по правилам * nix) применяет umask.

  • putс -Pфлагом он запускается так же, но после завершения загрузки клиент просит сервер явно (пере) установить разрешения на то же, что и у локального файла (запрос "chmod"). Для "chmod", umask не применяется.

  • mkdir, он просит сервер создать каталог с разрешениями 0777. Umask неявно применяется.

В любом случае, я считаю, что umask 0002 не влияет на файл с разрешениями 0600, поскольку они взаимоисключающие. Вы должны попробовать свой umask для файла с разрешениями, такими как 0644.

Так что на самом деле, это должно работать, если ваша система настроена так, как вы описываете. Смотрите доказательства из моей коробки (Ubuntu с OpenSSH 6.2p2)

Match user user2
  ChrootDirectory /home/user2/chroot
  ForceCommand internal-sftp -u 0077
  AllowTcpForwarding no
  PermitTunnel no
  X11Forwarding no

Смотрите разницу в разрешениях после putи put -P:

user1:~$ touch file.txt
user1:~$ ls -l
total 0
-rw-r--r-- 1 user1 ftpuser    0 Oct 23 15:34 file.txt
user1:~$ sftp user2@localhost
user2@localhost's password: 
Connected to localhost.
sftp> cd somefolder 
sftp> put file.txt
Uploading file.txt to /somefolder/file.txt
file.txt                                         100%     0    0.0KB/s    0:00
sftp> ls -l
-rw-------    1 1003 1001    0 Oct 23 15:35 file.txt
sftp> put -P file.txt
Uploading file.txt to /somefolder/file.txt
file.txt                                         100%     0    0.0KB/s    0:00
sftp> ls -l
-rw-r--r--    1 1003 1001    0 Oct 23 15:34 file.txt

Кстати, последняя спецификация SFTP определяет поведение клиента и сервера в отношении umask. Как вы можете видеть, OpenSSH фактически нарушает это, хотя OpenSSH реализует SFTP версии 3, в которой еще не упоминалось umask.

7,6. права доступа

...

Серверу НЕ СЛЕДУЕТ применять umask к битам режима; но следует установить биты режима, как указано клиентом. Клиент ДОЛЖЕН применить соответствующий «umask» к битам режима перед их отправкой.

Мартин Прикрыл
источник
Я уже пробовал со многими различными разрешениями, в самом начале у меня было 755 для моего каталога на стороне клиента, и я хотел получить 775 вместо этого. Но это не сработало. Я согласен с вами для -P, прочитав документацию, но даже без этого флага я всегда получаю на сервере те же разрешения, что и у клиента (какими бы ни были разрешения)
drkzs
спасибо за замечание, я попытался улучшить заголовок и исправить некоторые термины
drkzs
Это должно работать на самом деле, смотрите мое обновление.
Мартин Прикрыл
Да, ваш пример работает ... но если вы измените umask на 0002, он больше не работает. Может быть, этот пост поднимает ту же проблему? кроме того факта, что я нахожусь в openssh5.9 и этот вариант umask должен работать. Разница между вашей конфигурацией SSHD и моей заключается в том, что я не использую ForceCommand, поэтому я указываю umask в строке подсистемы. (Я постараюсь опубликовать конфиг и результат, но тест сети не так легко получить)
drkzs
1
Просто чтобы прояснить этот момент: The server SHOULD NOT apply a 'umask' применяется только тогда, когда клиент отправляет информацию о правах доступа . Когда клиент не отправляет информацию о правах доступа, он намерен применить umask!
Heiglandreas