Назад | Перейти на главную страницу

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

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

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

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

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

Клиент и сервер OpenSSH SFTP передают разрешения (как расширение) и создают удаленный файл с разрешениями на локальной стороне. 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 можно определить, я могу представить, что делаю что-то не так в своих тестовых конфигурациях.

Буду признателен за отзывы опытных специалистов.

Спасибо.

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

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

  • put без -P flag, он просит сервер создать файл с теми же разрешениями, что и у локального файла. Затем сервер 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 vs. 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» к битам режима перед их отправкой.