У меня есть сервер 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)
| | |-- ...
Public_Webhook.php file receiving POST
как общедоступный, в то время как папка находится внутри, а остальное содержимое является частным и недоступным для публики?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
Практически все эти каталоги / файлы являются частными и будут содержать конфиденциальную информацию. По какой-то причине это выглядит неправильно, но я слишком новичок, чтобы об этом говорить.
Пожалуйста, поправьте меня, если я ошибаюсь. Так,
Я бы переехал .../Public_Webhook.php
к /var/www/html/public_html/
оставляя конфиденциальные файлы на их месте и заново связывая их должным образом в PHP-файле webhook.
Затем я бы запустил следующее на недавно созданном частном /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
Тогда я бы сделал противоположное на вновь созданном /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
ИЛИ
/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 обращался к файлам через групповое разрешение для файла.
Это позволяет вам иметь другого пользователя для владения / редактирования / обновления каталогов и файлов, и вы концентрируетесь на разрешениях группы и делаете их максимально ограниченными.
Обновлено, решение отвечает:
Ваши каталоги, как частные, так и веб-пространства, принадлежат пользователю системы, который не является 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