php & filesystem + setUID / permissions ... я просто не понимаю! - PullRequest
2 голосов
/ 09 февраля 2010

Я должен признать, что я никогда полностью не получал модель разрешений * nix для файловой системы. о, материал rwxrwxrwx не слишком сложен, но я легко запутываюсь, когда программы создают новые файлы и как я могу их обработать.

Моя текущая проблема - это смесь java-апплета (с закрытым исходным кодом), который выполняет загрузку файлов через ftp и php (он находится на выделенном сервере, и данные на самом деле не критичны, так что я не слишком обеспокоен мирового writeability).

Итак, у меня есть два пользователя: ftp (1000) и apache / php (81). группы не совпадают, поэтому они в основном "другие", если я прав.

каталог «import», установленный на 0777, принадлежащий ftp.

если посетитель заходит на страницу загрузки, мой скрипт создает подкаталог с именем его имени пользователя. скажем, имя пользователя для посетителей - "foo", так что это "import / foo", значение 0777, пользователь 81 / php.

Затем посетитель использует Java-апплет для загрузки файла в этот каталог (test.jpg). права доступа к файлу теперь rw-r - r--, пользователь ftp.

первый вопрос

Первое, что я не понимаю, это то, что я могу отсоединить этот файл через php.
Зачем? пользователи не совпадают, и файл не доступен для записи во всем мире.
это из-за разрешения на запись в родительские каталоги? понятно, я не могу chown или chmod через php.

Пока проблем нет, потому что, пока я могу читать и отключать связь, все в порядке.

второй вопрос

Java-апплет может загружать целые каталоги, что приятно. если я это сделаю, новый подкаталог import / foo / test будет иметь права доступа rwxr-xr-x / ftp. файлы в этом каталоге: rw-r - r - / ftp.

теперь мне не повезло. я ничего не могу сделать с этими файлами (кроме чтения, что я делаю успешно), без разыменования, без chmod / chowning. они просто сидят и поглощают дисковое пространство.

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

третий вопрос

что я могу с этим сделать? Я имею в виду, что бы сделал разумный человек? Могу ли я / я должен изменить Umask для пользователя FTP? (Я только что узнал о Umask вчера). мне это не очень удобно, так как это повлияет на весь трафик ftp, не так ли? Кроме того, сервер выделен, но я не администратор, поэтому мой доступ ограничен.

У меня просто была другая идея. перед тем, как начать этот пост, я прочитал материал о базовых разрешениях Linux. Во-первых, бит закрепления не установлен нигде в цепочке каталогов. и затем, это было: «установить бит идентификатора пользователя».
Итак, мой текущий план состоит в том, чтобы написать простой сценарий оболочки с владельцем ftp, который можно запускать с помощью setuid. скрипт просто передает файл в владельцах каталогов импорта пользователю php.
затем после каждого импорта я просто exec() этот файл из моего php-скрипта и обрабатывать файлы дальше.

это сработает? и что более важно: это чисто и законно? или сисадмин наградит меня за голову?

Спасибо большое!

обновление: Я просто попытался установить бит uid (4755) через winscp (через соединение ftp), но он как-то не работает - кажется, что он «забывает» только бит uid другие биты установлены). это почему? почему владелец не может установить UID сам? это для конкретного сервера или вообще так?

обновление 2:
Википедия говорит все это

Из-за повышенной вероятности недостатков безопасности многие операционные системы игнорируют атрибут setuid при применении к исполняемым сценариям оболочки.

Может ли пользователь root установить бит uid?

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Первый ответ

Правильно, у вас есть разрешение на изменение каталога, чтобы вы могли отсоединить файл. Является ли этот файл доступным для чтения или записи для вас, не имеет значения.

Второй ответ

Да, вы правы, что пользовательский umask по умолчанию будет использоваться, если только скрипт / апплет не изменяет права доступа к файлу для чего-то другого

Третий ответ

Установка umask по умолчанию для ftp - самое простое решение, но, как вы говорите, это влияет на все файлы, созданные пользователем ftp. Если этот пользователь используется только для загрузки через апплет (и это должно быть действительно), то на самом деле это не проблема, я бы сказал.

Другой вариант - запустить задание cron, которое выполняет сценарий (как вы предлагаете), изменяющий / владеющий файлами (и, возможно, проверяющий их на вирусы и т. Д.) Из области загрузки по FTP где-то в webroot.

Вы не утверждаете, почему наличие этих файлов только для чтения в Apache является проблемой (или это тот факт, что корень FTP не находится в веб-корне?), Возможно, поясните, что это может помочь найти разумное решение? Обычно вы не хотите доверять тому, что дал вам пользователь, если только вы не проверили его сначала.

РЕДАКТИРОВАТЬ - только что вы увидели, что вы не администратор машины, что усложняет задачу.

0 голосов
/ 09 февраля 2010

что я узнал сегодня: бит setuid часто отключается для сценариев.

решение, на котором я остановился: apache / php получает права sudoer для определенных сценариев (все сценарии в одном каталоге вне web-корня), которые могут работать как пользователь ftp- или apache-пользователь. затем я могу вызвать эти сценарии с помощью sudo из php с помощью system / exec / etc.

Я не знал, что sudo можно настроить таким образом. удивительный

...