У нас есть постоянная проблема на работе. У нас есть множество веб-сайтов, настроенных на общих хостах, наша cms записывает много файлов на эти сайты и позволяет пользователям сайтов загружать файлы и т. Д.
Проблема в том, что когда пользователь загружает файл на сайт, владелец этого файла становится веб-сервером и, следовательно, не позволяет нам изменять разрешения и т. Д. Через FTP.
Есть несколько способов обхода, но на самом деле нам нужен способ установить закрепленного владельца, если это возможно, для новых файлов и каталогов, которые создаются на сервере. Например, вместо того, чтобы php записывать файл как пользовательский apache, он берет на себя владельца родительского каталога.
Я не уверен, возможно ли это (я никогда не видел, чтобы это было сделано). Есть идеи?
Очевидно, что мы не собираемся получать логин для apache на сервере, и я сомневаюсь, что мы сможем попасть в группу apache.
Возможно, нам нужен способ позволить apache установить хотя бы группу файла, чтобы мы могли установить группу для нашего пользователя ftp в php и установить 664 и 775 для любых файлов, которые записываются?
Привет, Джон.
ACL POSIX позволят вам установить наследуемые ACL. Если вы установите acl по умолчанию для каталога, он наследуется вниз по стеку по мере создания новых файлов.
$ sudo mkdir /tmp/acltest
$ ls -ld /tmp/acltest
drwxr-xr-x 2 root root 4096 2011-01-13 20:39 /tmp/acltest
$ touch /tmp/acltest
touch: setting times of `/tmp/acltest': Permission denied
На данный момент мой пользователь (Дэниел) не может создавать файлы в этом каталоге. Я установил acl по умолчанию для каталога, а также установил пользовательский acl в верхнем каталоге (по умолчанию применяется к файлам / каталогам, созданным в этом каталоге, а не к самому фактическому каталогу)
$ sudo setfacl -m d:u:daniel:rwx /tmp/acltest/
$ sudo setfacl -m u:daniel:rwx /tmp/acltest/
И теперь я могу создать файл:
$ touch /tmp/acltest/foo
$ ls -la /tmp/acltest/foo
-rw-r--r-- 1 daniel daniel 0 2011-01-13 20:41 /tmp/acltest/foo
Кроме того, я могу делать все, что захочу, с файлами, которые другие пользователи создают в этом каталоге:
$ sudo mkdir /tmp/acltest/foo2
$ ls -ld /tmp/acltest/foo2
drwxrwxr-x+ 2 root root 4096 2011-01-13 20:49 /tmp/acltest/foo2
$ sudo touch /tmp/acltest/foo2/bar
$ ls -la /tmp/acltest/foo2/bar
-rw-rw-r--+ 1 root root 0 2011-01-13 20:43 /tmp/acltest/foo2/bar
Обычные разрешения unix не позволяют мне коснуться этого, однако ACL говорят иначе:
$ getfacl /tmp/acltest/foo2/bar
# file: tmp/acltest/foo2/bar
# owner: root
# group: root
user::rw-
user:daniel:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
Обратите внимание, что этот файл находится в подкаталоге каталога / tmp / acltest, поэтому обычные разрешения unix не позволяют мне что-либо делать с этим файлом.
И действительно, пользователь daniel может делать с этим файлом все, что угодно:
$ mv /tmp/acltest/foo2/bar /tmp/acltest/foo2/bar2
$ ls -la /tmp/acltest/foo2/
total 8
drwxrwxr-x+ 2 root root 4096 2011-01-13 20:49 .
drwxrwxr-x+ 3 root root 4096 2011-01-13 20:43 ..
-rw-rw-r--+ 1 root root 0 2011-01-13 20:43 bar2
Обратите внимание, что ACL по умолчанию будет распространяться только при создании новых файлов и каталогов. Вам нужно будет один раз выполнить рекурсивную операцию установки, чтобы все было на месте, а затем ваш acl по умолчанию вступит во владение.
Чтобы пользовательские списки управления доступом, вам необходимо убедиться, что ваша файловая система смонтирована с опцией acl в / etc / fstab.
TL; DR ACL POSIX позволят вам установить закрепленные права пользователя / группы, которые распространяются вниз по дереву файловой системы.
РЕДАКТИРОВАТЬ: возможность форматирования и монтирования
acls потенциально очень опасны - и поддержка варьируется. Лучшим решением было бы использовать липкий бит группы и сделать файлы доступными для записи группой.
Проблема в том, что когда пользователь загружает файл на сайт, владелец этого файла становится веб-сервером и, следовательно, не позволяет нам изменять разрешения и т. Д. Через FTP.
В этом нет никакого смысла - как пользователь может стать веб-сервером? Или вы пытаетесь описать, что происходит с Безопасный_режим PHP с отключенной проверкой gid? В этом случае решение, вероятно, заключается в использовании бит липкой группы с safe_mode_gid, однако функциональность safe_mode устаревший и вам следует искать другое решение, которое не зависит от него.
множество веб-сайтов, настроенных на общих хостах
У вас есть root-доступ к хостам? Если нет, то вам определенно следует рассмотреть возможность перехода на выделенный или виртуальный хост, где вы действительно можете контролировать эти вещи - если вы не можете изменить конфигурацию, тогда ваш только вариант - использовать общие учетные записи.
Вам также следует отказаться от использования FTP - это кошмар безопасности, и его очень сложно автоматизировать.
Вы можете использовать маска настройка для apache.
http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html
По умолчанию файлы, загруженные с помощью Apache, будут прерывать настройку umask на сервере.
Но у вас есть возможность установить umask специально для Apache.
Проверить это https://stackoverflow.com/questions/428416/setting-the-umask-of-the-apache-user
Единственный способ, которым я когда-либо решал эту проблему, - это иметь root, выполняющий обычную задачу cron, которая устанавливает разрешения для файлов в каталоге веб-сервера. Это некрасиво, но работает нормально.
Вместо запуска cronjobs для смены владельца вы можете использовать fsniper: http://freshmeat.net/projects/fsniper
fsniper отслеживает каталоги на предмет новых файлов (через inotify) и запускает сценарии мгновенно, а не периодически.