Apache не позволяет мне входить в папки, принадлежащие другим пользователям - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь настроить сеансы PHP для suPHP (см. здесь ).Мне нужно, чтобы мой файл проверки php принадлежал пользователю, чтобы при запуске suPHP это делалось для правильного пользователя.Однако я также не хочу, чтобы пользователь имел доступ к этому файлу, поэтому он может отредактировать его, чтобы просто вернуть true, а не проверять базу данных.

Моя первая попытка была похожа на эту (где работает Apacheот имени пользователя www-data)

/etc/validate
├── [drwx------ www-data  ]  user1
│   └── [-rwx------ user1  ]  validate.php
/var/www/
└── [drwx------ user1  ]  user1
    └── [-rwx------ user1  ]  index.html

Затем перенаправьте веб-страницы на страницу подтверждения, после чего подтвердите, затем верните /var/www/user1/index.html

RewriteCond %{REQUEST_URI} !^/xyz
RewriteRule ^(.*) /etc/validate/user1/validate.php?uri=$1

Однако suPHP жалуется, что ядоступ к чему-то за пределами моего docroot (/var/www/user1).Я не хочу устанавливать docroot на / и обновлять файл suphp.conf, чтобы check_vhost_docroot=false не исправлял (и я не хочу, чтобы это было исправлено).Поэтому вместо этого я просто переместил /etc/validate в /var/www примерно так (это немного грязно, я знаю)

/var/www/
└── [drwx------ user1  ]  user1
    ├── [-rwx------ user1  ]  index.html
    └── [dr-x------ www-data  ]  validate
        └── [-rwx------ user1  ]  validate.php

Так что теперь проверочный файл

  1. Внутри docroot
  2. Владелец user1
  3. Не редактируется user1

Но теперь, если я пытаюсь загрузить страницу, я получаю следующую ошибку

Directory /var/www/user1/validate is not owned by user1

В этот момент я теряю терпение, поэтому я просто вставляю туда другую фиктивную папку, чтобы структура файла выглядела так

/var/www/
└── [drwx------ user1  ]  user1
    ├── [-rwx------ user1  ]  index.html
    └── [dr-x------ www-data  ]  validate
        └── [drwx------ user1  ]  dummy
            └── [-rwx------ user1  ]  validate.php

Теперь, когда я пытаюсь загрузить страницу, Apache говорит мне: «Выу меня нет разрешения на доступ к xyz на этом сервере. "где xyz - это то, что следует за моим доменным именем.Я не знаю, почему Apache говорит мне об этом, потому что я не пытаюсь получить доступ к конечным значениям в виде файла / папки.Я думаю, что перенаправление сбой, и Apache просто предполагает, что это жесткая ссылка, которая терпит неудачу.

Может кто-нибудь сказать мне, что я делаю неправильно, или предоставить альтернативный способ запретить пользователям возможность редактировать свои файлы,Он не мог попасть в каталог dummy, поскольку его разрешения были rwx------, и только user1 мог cd войти в него.Когда я изменил права доступа с 0700 на 0755, он вернулся к ошибкам suPHP.Таким образом, теперь возникает вопрос: как заставить suPHP выполнять сценарии, когда одна из его папок upstage принадлежит кому-то другому?


EDIT: Теперь я понимаю, почему Apache жаловался,Не может попасть в

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Я не могу найти официальную ссылку для этого, но согласно этому сайту:

Все файлы и каталоги ДОЛЖНЫ принадлежать вашему имени пользователя, а не «никто» или какому-либо другому имени / номеру. Если он не принадлежит вам, suPHP откажется запускать сценарий и выдаст «Внутренняя ошибка сервера 500».

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

РЕДАКТИРОВАТЬ: Существует способ, позволяющий пользователям получать доступ к сценариям вне их документирования (через suPHP_GlobalDocRoot). Я не могу заставить его работать на меня, Apache утверждает, что это синтаксическая ошибка. В любом случае, даже если бы это работало, все равно требовалось бы по крайней мере выполнить доступ 0111 (и, возможно, также прочитать 0555) во всех каталогах вплоть до /.

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

0 голосов
/ 06 марта 2012

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

  • Сценарии PHP должны принадлежать непривилегированному UID
  • Путь назад к / mustбыть владельцем того же UID или root.
  • Если скрипт или любой родительский каталог не может быть доступен для записи другим UID пользователя.
  • Сценарий выполняется в UID пользователя.

Это часть формальной модели доверия suPHP, и если вы хотите изменить ее, не используйте suPHP.

Пользователь может определить свой собственный путь для загрузки PHP.ini,По умолчанию пользователь может указать пользовательские php.ini и IIRC, вы не можете отключить опцию suPHP_ConfigPath.В конце концов, вы запускаете php-cgi в UID пользователей.Таким образом, это означает, что даже если вы установите auto_prepend_file (который может принадлежать пользователю root и не может быть записан UID), знающий пользователь все равно сможет обойти это.

Мой простой вопрос: почему вы используете PHP?или, по крайней мере, установленный suPHP обработчик PHP для того, что вы пытаетесь достичь здесь?Сохраняйте PHP для пользовательских и пользовательских привилегированных функций.Используйте CGI-скрипт или даже RewriteMap и параметр prg: для этих «системных» функций.Вы можете даже тривиально реализовать это в PHP, если вы предпочитаете этот язык, так как он будет выполняться с использованием php-cli.Существует множество руководств по написанию функций Map prg.Их довольно легко реализовать.

0 голосов
/ 05 марта 2012

Я могу ошибаться, но если suPHP работает так, как я помню, тогда PHP работает под пользователем (в данном случае user1), а не как Apache (www-data), в этом случае www-data) является единственнымс доступом на чтение и запись к файлу проверки, а user1 не является www-данными.

Решение, я думаю, состоит в том, чтобы предоставить разрешение на чтение всем для проверки и разрешение на запись только для www-данных.Итак:

/var/www/
└── [drwx------ user1  ]  user1
    ├── [-rwx------ user1  ]  index.html
    └── [dr-x---r-- www-data  ]  validate
        └── [-rwx------ user1  ]  validate.php

С учетом вышесказанного, user1 не может редактировать свой проверочный файл, только читать его.

Вы также можете попробовать:

/var/www/
└── [drwx------ user1  ]  user1
    ├── [-rwx------ user1  ]  index.html
    └── [dr-x-----x www-data  ]  validate
        └── [-rwx------ user1  ]  validate.php

Iвсегда сбит с толку тем, как именно «выполнить» работает, но я считаю, что идея заключается в том, что файл может быть запущен (выполнен) пользователем, но не может быть прочитан или записан.Но для этого нужно, чтобы validate был исполняемым, поэтому, если это скрипт, это может не сработать.Кто-то еще может подтвердить это.

...