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

LAMP / Apache2: как сделать PHP-файл webhook API общедоступным, но вне корневого каталога проекта?

У меня есть сервер AWS EC2 LAMP (с использованием Apache 2.0 и mod_php5) с такой базовой структурой каталогов:

    var
    |-- www
    |   `-- api_folder (NOT public)
    |   |   |-- sensitive files (NOT public)
    |   |   |-- folder with sensitive files and 1 public webhook API file
    |   |   |   |-- sensitive files (NOT public)
    |   |   |   |-- Файл Public_Webhook.php получает POST <== (PUBLIC)
    |   |   |   |-- sensitive files (NOT public)
    |   '-- public_html (PUBLIC)
    |   |   |-- files_and_folders (PUBLIC)
    |   |   |-- ...

Вопросы

  1. Должен ли файл PHP быть общедоступным, чтобы иметь возможность получать веб-перехватчик POST от какой-либо службы?
  2. Если да, можно ли сделать Public_Webhook.php file receiving POST как общедоступный, в то время как папка находится внутри, а остальное содержимое является частным и недоступным для публики?
  3. Если возможно, я бы просто chmod 700(Нужно ли мне потом самому устанавливать файлы в 600 или это будет сделано автоматически, если я установлю папку на 700?) всю частную папку API и установите разрешения для частного файла PHP на 644?

ИЗМЕНИТЬ / ОБНОВИТЬ

Бег $ ps aux | grep http, получает меня:

$ ps aux | grep http
root     32267  0.0  1.9 370488 19968 ?        Ss   14:40   0:00 /usr/sbin/httpd
apache   32275  0.0  2.5 459372 26324 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32276  0.0  2.6 460168 27080 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32277  0.0  2.5 459400 26412 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32278  0.0  2.5 459240 26272 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32279  0.0  2.5 459372 26304 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32280  0.0  2.5 459372 26288 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32314  0.0  2.5 459372 26288 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32316  0.0  2.5 459372 26288 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32319  0.0  2.5 459236 26240 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32324  0.0  2.4 458332 25132 ?        S    14:50   0:00 /usr/sbin/httpd
ec2-user 32524  0.0  0.2 110456  2208 pts/0    S+   15:50   0:00 grep --color=auto http

Итак, мой пользователь apache просто apache (в то время как я предполагаю, что в некоторых дистрибутивах это будет похоже на www-data или ubuntu, и т.д).

В настоящее время у меня нет /public_html каталог, но это то, что я планирую создать. На данный момент моя общая папка /var/www/html/ и все конфиденциальные файлы находятся в этом каталоге - ура!

$ ls -l /var/www/html показывает это:

drwxrwsr-x 2 ec2-user www 4096 Jul  2 19:56 archive
-rw-r--r-- 1 ec2-user www  364 Jul  7 00:02 config.ini.php
drwxrwsr-x 4 root     www 4096 Jun 30 21:42 private_api_files
drwxrwsr-x 2 root     www 4096 Jun 26 21:29 some_assets
-rw-r--r-- 1 ec2-user www  643 Jul  6 00:02 mail_test.php
-rw-rw-r-- 1 root     www   18 Jul  5 22:53 phpinfo.php
drwxrwsr-x 7 ec2-user www 4096 Jul  2 20:25 PHPMailer-master

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


Решение?

Пожалуйста, поправьте меня, если я ошибаюсь. Так,

  1. Я бы переехал .../Public_Webhook.php к /var/www/html/public_html/ оставляя конфиденциальные файлы на их месте и заново связывая их должным образом в PHP-файле webhook.

  2. Затем я бы запустил следующее на недавно созданном частном /var/www/html/private_api_files/ и измените его на:
    $ chown -R apache:apache /var/www/html/private_api_files/
    $ chmod -R go-rwx /var/www/html/private_api_files/
    $ chmod -R 700

  3. Тогда я бы сделал противоположное на вновь созданном /var/www/html/public_html/
    $ chown -R apache:apache /var/www/html/public_html/
    $ chmod -R rwxr-xr-x /var/www/html/public_html/
    $ chmod -R 755

ИЛИ

  1. Было бы чище переместить все конфиденциальные файлы из /var/www/html/ и в папку, например /var/www/all_sensitive_api_files/ и просто держать все в /var/www/html/ общедоступный - похоже, так мне не пришлось бы менять владельца / разрешения или Apache Директива DocumentRoot настройки, да?)

PS: У меня так мало точек сбоя сервера, что я даже не могу проголосовать за вас: /

В вашем случае php по сути тот же пользователь, что и вилки apache. Таким образом, пользователь, которому принадлежат дочерние процессы apache, является пользователем, которому требуется доступ к файлам.

Пользовательский apache запускается, как настроено в файле конфигурации apache. Вы можете проверить, кто этот пользователь в вашей запущенной системе, запустив:

ps aux | grep http

Вы увидите процесс, принадлежащий root, и ряд дочерних процессов, которые вам интересны.

С точки зрения каталога, это пользователь, которому требуются разрешения RX.

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

Есть понятие веб-корня Apache. Вы настраиваете это в своем файле conf, обычно в разделе vhost, используя DocumentRoot директива. Файлы в корневом каталоге доступны через работающий сервер Apache. Похоже, что public_html - это ваш корневой каталог. Если это так, то Public_Webhook.php должен находиться в корневом веб-каталоге.

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

Большинство фреймворков с фронт-контроллером размещают только фронт-контроллер вместе со статическими активами под корневым веб-сайтом. Все остальные файлы размещаются вне корневого каталога и включаются по мере необходимости.

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

Что касается разрешений по умолчанию и прав собственности на файлы, здесь есть много вопросов. Есть umask, а также некоторые вещи, которые вы можете сделать более детально. Вы можете настроить unmask для пользователя, который используется для владения указанными каталогами, и установка umask этого пользователя, вероятно, позаботится о ваших проблемах при добавлении новых файлов в существующие каталоги. Посмотри это сайт по основам umask

Посмотреть этот вопрос для более сложных вещей вы можете сделать установку каталога acl.

Изменение разрешений для каталога просто требует некоторой комбинации использования подстановочных знаков и / или рекурсивного параметра. Это работает как для владельцев, так и для химической завивки:

Право собственности, рекурсивно измененное:

chown -R apache:apache /some/dir

Пермь:

Удалите все завивки для группы / другого рекурсивно

chmod -R go-rwx  /some/dir

Рекурсивно установить только владельца perms:

chmod -R 700

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

Что действительно сбивает с толку, так это то, что каталогу необходимо разрешение на выполнение, чтобы apache (или любой пользователь) мог читать файлы внутри него. Сами файлы (за исключением сценариев .php, которые будут выполняться) не обязательно должны иметь выполнение, и их можно настроить так, чтобы apache имел доступ только для R.

С точки зрения безопасности, вы не обеспечиваете большой безопасности, если у пользователя apache есть доступ RWX ко всему. Даже в корневом каталоге вы не хотите, чтобы пользователь apache имел доступ на запись к каталогам и скриптам.

Обычно люди, использующие apache / mod_php, настраивают все так, чтобы Apache обращался к файлам через групповое разрешение для файла.

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

Обновлено, решение отвечает:

  1. Да ссылаться на включение файлов. В PHP все функции, связанные с файлами, относятся не к «веб-пространству», а к реальной файловой системе. По этой причине вы можете включать файлы / fopen и т. Д. В любом месте системы, к которому может получить доступ пользователь, запускающий скрипт php.
  2. Ваши каталоги, как частные, так и веб-пространства, принадлежат пользователю системы, который не является apache. Для простоты этот пользователь будет владеть всеми файлами как пользователь | группа, где имя пользователя и имя группы совпадают. А пока назовем эту учетную запись fsuser.

    chown -R fsuser: fsuser / var / www / html / private_api_files / chown -R fsuser: fsuser / var / www / html / public_html /

Теперь обработайте разрешения каталога и предоставьте доступ только пользователю и группе.

chmod -R 750 /var/www/html/public_html
chmod -R 750  /var/www/html/private_api_files

Теперь для отдельных файлов в каталогах, только для файлов php, дайте им следующее:

chmod find /var/www/html/public_html -type f -name '*.php' -exec chmod 650 {} \;

Для другого каталога вы не хотите устанавливать бит выполнения, поэтому вы хотите, чтобы группа имела доступ только для чтения. Это найдет все файлы и установит их доступ.

find /var/www/html/private_api_files/ -type f -exec chmod 640 {} \;

Теперь вам просто нужно добавить пользователя apache в качестве дополнительного члена группы в группу fsuser:

usermod -a -G fsuser apache

Убедитесь, что вы всегда перезапускаете apache после внесения любого из этих типов изменений или настроек.

sudo service httpd restart