PHP에서 루트로 bash 스크립트를 실행하는 중에 문제가 발생했습니다.

PHP에서 루트로 bash 스크립트를 실행하는 중에 문제가 발생했습니다.

나는 서버에 owncloud 및 plex와 같은 애플리케이션을 설치할 수 있는 PHP 패널을 만들고 있습니다. 소프트웨어 설치 및 제거를 위한 여러 bash 스크립트를 만들었습니다. 나는 이 모든 것을 쉘에서 테스트했고 모든 것이 잘 작동했습니다. 그러나 우분투 15.10에서 루트로 sudo를 사용하여 PHP에서 스크립트를 실행하면 apt-get 및 dpkg가 작동하지 않습니다.

Visudo에는 다음이 있습니다.

seedbox ALL = (root) NOPASSWD: /bin/appinstaller

appinstaller는 응용 프로그램 설치/제거 bash 스크립트(예: appinstaller plex)를 실행하는 데 사용되는 bash 스크립트입니다.

Plex 스크립트 예:

dpkg --configure -a
cd /tmp
wget https://downloads.plex.tv/plex-media-server/0.9.15.6.1714-7be11e1/plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
dpkg -i plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb

Bash에서 직접 appinstaller를 실행하면 모든 것이 잘 작동합니다.

PHP를 사용하여 appinstaller를 실행할 때(스크립트가 루트로 실행되고 있는지 확인):

exec("sudo /bin/appinstaller plex > /home/installer.log 2>&1 &");

작동하지만 다른 응용 프로그램을 설치하려고 하면 다음과 같은 apt & dpkg 오류가 발생합니다.

E: plexmediaserver 패키지를 다시 설치해야 하는데 해당 아카이브를 찾을 수 없습니다. (설치되어 실행 중이더라도)

또한 dpkg --configure -a오류를 반환합니다.

Plex는 잘 작동하지만 apt가 설치 프로세스를 완료하지 못하고 어딘가에 멈춰 있는 것 같습니다. apt-get install/ 이후에 실행되는 명령 dpkg도 php에서 실행되지 않고 bash에서 실행됩니다. 또한 cron 및 systemctl에서 스크립트를 실행해 보았지만 동일한 문제가 발생했습니다.

일부 앱은 문제 없이 설치/제거된다는 점은 주목할 가치가 있습니다.

php/cron/systemctl에서 스크립트를 실행하는 것과 쉘에서 직접 실행하는 것의 차이점은 무엇입니까? 일반 bash 세션을 시뮬레이션할 수 있나요?

답변1

PHP 스크립트를 루트로 실행하는 것은 위험한 습관입니다. 웹 서버는 권한 상승을 방지하고 다음과 같은 다양한 조치를 구현하기 위해 최선을 다합니다.chroot 감옥. 나는 이것이 당신의 문제의 원인일 수 있다고 믿습니다.

특히, 제대로 작동 dpkg하려면 파일에 대한 액세스가 필요합니다 /var/lib/dpkg/. 예를 들어 PHP 스크립트에서 파일 목록을 시도하여 이 디렉토리에 액세스할 수 있는 권한이 있는지 확인할 수 있습니다 /var/lib/dpkg/status. 그렇지 않은 경우(루트로 실행하더라도) 실제로 감옥에 있는 것입니다. 물론 감옥을 비활성화할 수 있지만(이 작업을 수행하는 방법은 웹 서버에 따라 다름) 권장하지 않습니다. 보안 메커니즘을 우회하면 다양한 공격에 노출되는 데에는 이유가 있습니다.

관련 정보