Поширена безпека налаштування PHP?


10

Я працюю з адміністрацією систем в університеті і просто натрапив на щось, що, мабуть, є загальним, але для мене було досить шоком.

Усі каталоги public_html та веб-області зберігаються на afs з дозволами читання для веб-серверів. Оскільки користувачам дозволено мати PHP-скрипти у своєму public_html, це означає, що вони можуть отримувати доступ до файлів один одного зсередини php (та основних веб-файлів!).

Це не лише робить повний захист паролем .htaccess, але також дозволяє користувачам читати вихідні файли php, що містять паролі бази даних mysql та подібну конфіденційну інформацію. Або якщо вони виявлять, що інші люди мають каталоги, куди веб-сервери мають доступ до запису (наприклад, для особистих журналів або для збереження поданих даних форми), вони можуть зберігати файли в цих облікових записах.

Простий приклад:

<?
  header("Content-type: text/plain");
  print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd"); 
?>

Це поширена проблема? І як ти зазвичай це вирішуєш?

ОНОВЛЕННЯ:

Дякуємо за вклад. На жаль, здається, немає простої відповіді. У великих умовах спільного використання, таких як це, користувачі, мабуть, не повинні мати такий великий вибір. Кращий підхід, про який я можу придумати, - це встановити "open_basedir" в основній конфігурації для всіх каталогів "public_html", запустити suphp і дозволити лише чистий php (без скриптів cgi, запуску зовнішніх команд із задніми таблицями тощо).

Якщо змінити таку політику, можна було б зламати багато речей, і цілком можливо змусити користувачів захопити їхні вини та переслідувати нас ... Я обговорю це з колегами та оновлю тут, якщо ми приймемо рішення про те, як змінити налаштування.


Це цікаве питання. Я впевнений, що для великих провайдерів спільного хостингу (наприклад, DreamHost) це неможливо. Але мені було б цікаво, як вони від цього захищають. suphp, як згадували cstamas, виглядає як хороше рішення, але чи саме цим користуються більшість хостинг-провайдерів?
Lèse majesté

1
Нижче я використовував open_basedirрішення щодо спільних виробничих хостингових систем, але ми розділили кожного на свій власний vhost - Не впевнений, чи працює він для окремих каталогів ...
voretaq7

Відповіді:


8

Можна використовувати suphp, який запускає скрипт php з уid його власника.

http://www.suphp.org


Це, ймовірно, не вирішить вищезазначену проблему (принаймні, у спільному середовищі хостингу .файли .htpasswd зазвичай належать користувачеві, якому належать сайт та група (апаш) або світ (оскільки користувачі не знають / не піклуються про безпеку) читабельні, тож навіть із suphp вони зможуть прочитати ці файли)
voretaq7

@ voretaq7: Можна застосувати ще кілька обмежень. Наскільки я пам'ятаю, ви навіть можете заборонити доступ до файлів, якими ви не володієте. Отже, це виключає атаку вище.
cstamas

Я знаю, що ви можете обмежити дозволи на файли ("Не можна писати для групи / інших / когось"), але я не знаю, як заблокувати читання, що перевищує дозволи FS. У них є check_vhost_docroot, але AFAIK, що стосується лише сценарію, який виконується (я можу помилитися з цим)
voretaq7

1
Я не впевнений, що suphp - це гарне рішення в такому середовищі. Користувач може мати всілякі дозволи, яких www-користувач не має. Зловмисник, який знайшов вихід через php, міг знайти ключі ssh або клавіші, або змінити сценарії входу користувачів, щоб створити на задньому плані. Налаштування "vhosts" не дуже корисні, оскільки каталоги public_html доступні через "/ ~ ім'я користувача" на головному віртуальному хості. Я думаю, що, можливо, сценарії в public_html повинні бути повністю відключені.
Понту

4

Моя пропозиція полягатиме в тому, щоб обмежити доступ PHP до файлів (через open_basedir& подібні директиви, на основі vhost): Ви хочете, щоб користувачі могли відкривати / читати / писати файли під їх веб-корінням, а можливо, на один рівень над ним (для нуля простір), але не каталог, де вони зберігатимуть, наприклад, htpasswdфайли.

Структура каталогу:

/Client
    /auth
    /site
        /www_root
        /www_tmp

Відповідала б цій вимозі: її open_basedirможна було б /Client/siteбезпечно вказати , а htpasswdфайли, що зберігаються в них /Client/auth.htaccessфайлами або httpd.confмодифікованими, щоб вказати на відповідне місце).
Це заважає вашим клієнтам не відкривати чужі файли. І як користь, зловмисні користувачі не можуть читати матеріали /Client/auth(або що-небудь ще у вашій системі, наприклад /etc/passwd:-)

Дивіться http://php.net/manual/en/ini.core.php для отримання більш детальної інформації про реалізацію open_basedir та per-vhost.


1
suphpяк зазначає cstamas, це також дуже хороша ідея в спільному хостинговому середовищі. Існує невеликий накладний набір налаштувань, але я б сказав, що посилення безпеки цілком варто того. Окрім пісочниці всіх ваших PHP-сайтів у чомусь схожі на FreeBSD Jail або на спеціальній віртуальній машині, це одна з найбільших виграшів у безпеці.
voretaq7

"open_basedir" представляється простим способом відокремити основні веб-файли від користувацьких, за умови, що "public_html" подається через власний віртуальний хост. Але це не захищає користувачів один від одного, оскільки у них немає власних віртуальних хостів. Правильно?
Понту

Я не намагався налаштувати open_basedirвсередині директиви <Directory>, але думаю, що це повинно бути допустимим ("спробуйте і подивіться" - найгірше, що можна зробити, це не спрацює :)
voretaq7

1
На сьогоднішній день схоже, що open_basedir - це те, чим користуються більшість комерційних хостів (зазвичай абоненти мають власні платні домени або отримують безкоштовний субдомен), але для домашніх сторінок на базі каталогів, як в академічній установі, схожа найкраща відповідь.
Lèse majesté

1

Ні, це не є загальною проблемою, оскільки більшість спільних хостів визначають конфігурацію open_basedir у файлі htaccess у каталозі public_html кожного користувача (або в vhost, якщо у кожного користувача є свій vhost).

наприклад, .htaccess файл:

# Assuming these are not set globally - its good practice to limit:
  php_flag magic_quotes_gpc off
  php_flag magic_quotes_runtime off
  php_flag register_globals off
  php_flag short_open_tag off
  php_value max_execution_time 60

# These set the user-specific paths
  php_value open_basedir /afs/example.com/home/smith:/usr/share/php/include
  php_value session.save_path /afs/example.com/home/smith/tmp
  php_value upload_tmp_dir /afs/example.com/home/smith/tmp

Але переконайтеся, що ви встановили правильні дозволи на файл .htaccess, щоб користувач не міняв open_basedir (якщо вони спробують його замінити в subdir / .htaccess, він не повинен працювати - але, мабуть, вам слід перевірити це) .

HTH

C.


2
Це може допомогти запропонувати певний захист нових облікових записів. Але той факт, що користувач не може його редагувати, може зробити спокусливим видалити файл .htaccess (що вони можуть зробити, оскільки він вимагає доступу лише до запису до каталогу public_html) та створити свій власний. Додавання "<Directory>" -блока в основний конфігурацію для кожного користувача буде спрацьовувати, але тут їм все одно дозволено перезавантажувати зовнішні команди з php, що означає, що open_basedir легко обійти.
Понту

@Pontus: хороший момент щодо видалення файлу (я не впевнений, чи підтримує afs атрибут незмінного файлу). Я б дав +1, якби ви сказали, що запуск веб-сервера в chroot тюрмі захистить від усіляких уразливих програм програми.
symcbean

1

AFS ігнорує прості дозволи користувача Unix. suPHP виконує встановлення перед запуском програми php, але це не дає процесу маркери kerberos, необхідні для доступу до AFS, і обмежуються його правами. suPHP доведеться певним чином модифікувати для отримання цих жетонів, перш ніж він може представити себе в системі AFS як цей користувач. Наскільки мені відомо, цього не було зроблено. (Насправді я знайшов це питання, коли шукав, чи хтось ще це зробив.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.