В коротком коде, выполняемом PHP как пользователь apache, похоже, нет доступа для записи в группы, членом которых является apache, в которые apache может писать в оболочке.
Так что у меня есть пользовательский apache на рабочем сервере. Если я бегу id apache
Я вижу Apache в качестве члена нескольких групп, в том числе groupa
, Если я grep apache /etc/groups
Я вижу, что членство в этих группах определяется не локально, а из LDAP.
У меня есть папка /u/dir
который принадлежит root:groupa
с разрешениями g+rws
Если я бегу sudo su -s /bin/bash -c "mkdir /u/dir/subdir" apache
он работает нормально, apache имеет разрешение на создание файлов / папок в /u/dir
Однако, если я создаю и запускаю следующий скрипт на PHP, он завершается неудачно с запрещенным разрешением: `
Если я бегу id apache
из оболочки он показывает: uid=48(apache) gid=123(groupa) groups=123(groupa)
Однако, если я запускаю следующее из PHP, я получаю другой результат: —
<?php echo shell_exec("id");?>
uid=48(apache) gid=48(apache) groups=48(apache)
Любые идеи, почему PHP (и, вероятно, процесс Apache / httpd) не имеют всех членств в группах, как они должны, и как я могу это исправить?
Я сделал тест, прежде чем кто-либо предложит это; Если я добавляю apache в группу в / etc / groups и перезапускаю apache, то приведенный выше вызов показывает новую группу, но не выбирает группы, в которые входит apache через LDAP (а этот сервер является одним из пула, доступ к удаленно сопоставленной / u, поэтому я не хочу вручную дублировать каждую группу локально на каждом сервере)
Я также добавлю, что я подозреваю, что наши серверы получают id
информация из LDAP через sssd
Наблюдение: https://unix.stackexchange.com/questions/409843/how-to-get-the-supplementary-groups-ids-of-a-process
Если я добавлю <?php echo shell_exec("cat /proc/$$/status"); ?>
Я вижу, что процесс httpd не поднял ни одного из sssd
группы, только местные.
Редактировать для ясности:
Для ясности я должен добавить, я тестировал добавление apache
в местную группу (300)testgroup
затем побежал <?php echo shell_exec("id");?>
снова:-
uid=48(apache) gid=48(apache) groups=48(apache),300(testgroup)
Так что, хотя ясно, что основные права доступа к процессу имеют значение, по какой-то причине, когда я запускаю httpd
(как apache:apache
), это пикап местных групп, которые apache
является членом и добавляет их в подгруппу («Группы» в /proc/$$/status
), это не собирание групп, которые apache
является членом via sssd. Это загадка.
Вы сравниваете яблоки с грушами.
Скрипт, который вы запускаете в оболочке, когда пользователь apache возвращает информацию, которую оболочка имеет для пользователя.
Но когда вы запускаете ваш PHP-скрипт, он запускается не только пользователем apache, но и демоном apache, у которого есть параметр конфигурации, под которым должен запускаться пользователь и какую группу его подпроцессов. И это перезаписывает системную информацию. Я почти уверен, что ваш apache httpd.conf где-то содержит группу и пользователя «apache». Таким образом, PHP-скрипты выполняются как пользовательские apache и групповые apache — и только эта одна группа из-за настроек config.
Я не уверен, что произойдет, когда вы вызовете этот PHP-скрипт:
<?php
echo shell_exec("/bin/bash id");
как это может вызвать новую сессию Bash.
Оказывается, у меня не было проблем вообще. Кто-то изменил основную группу пользователя apache на мою удаленную группу (в моем примере groupa), поэтому, когда apache запускался как apache: apache в соответствии с файлом httpd.conf, он перезаписывал эту основную группу. Поскольку apache на самом деле не был членом группы, кроме этого, казалось, что он покидает группу.