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

Безопасность PHP: нужна помощь в понимании SUID

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

Бит SUID или Set User ID - это функция разрешений файловой системы UNIX и Linux, которая позволяет указать, что рассматриваемое приложение всегда должен запускаться от имени пользователя, владеющего двоичным файлом- независимо от того, какой пользователь инициирует процесс

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

Если вы установите бит SUID, то PHP не будет запускаться от имени пользователя www, вместо этого владелец программы PHP будет тем, от кого программа PHP будет работать. Таким образом, если «root» владеет PHP, то PHP всегда будет запускаться как «root» со всеми соответствующими разрешениями. Это может быть очень опасно, так как в Unix-системах «root» имеет безграничные возможности (учетные записи администратора уступают только системной учетной записи Windows и могут нанести почти такой же ущерб, что и достаточно плохо).

Теперь, если вы хотите, чтобы PHP мог открывать файл от имени пользователя joe, тогда PHP должен работать от имени пользователя joe. Если это поступает с веб-сервера, это может произойти только одним из двух способов (обычно). 1. Веб-сервер работает под именем «joe», и PHP унаследует эти разрешения. 2. PHP работает как пользователь, который может принимать права других пользователей (обычно эта возможность сохраняется за «root»).

Поскольку запускать веб-сервер как «joe» нецелесообразно, для PHP-программы обычно используется SUID и запускается от имени пользователя root, а затем принимаются права пользователя «joe». Это может быть чрезвычайно опасно, поскольку ошибки в программе могут легко позволить любому взломать сервер и нанести неисчислимый ущерб. Кроме того, ошибки в других частях веб-сервера могут потенциально использовать это и снова вызвать повреждение. По этой (и другим причинам) настоятельно рекомендуется не использовать SUID (за исключением случаев крайней необходимости) и писать программы, которые не требуют этого.

В зависимости от конкретной среды могут потребоваться дополнительные сведения, а некоторые из них могут быть неточными. Я старался изо всех сил, не зная, что именно вы делаете. Также обратите внимание, что в Windows нет SUID, но есть способы получить эту функциональность при запуске веб-сервера.