아파치 사용자 및 루트 액세스

아파치 사용자 및 루트 액세스

다음 명령을 호출하는 PHP에서 몇 가지 스크립트를 개발하고 싶습니다. exec() 함수를 사용하여

service network restart

crontab -u root /xyz/abc/fjs/crontab

등.

문제는 Apache가 휠에 Apache를 추가하거나 또는좋은 일, 나쁜 일, 추한 일 그룹 할당은 위에서 언급한 것처럼 명령을 실행하지 않습니다.

다음은 내 구성입니다.

내 /etc/sudoers

root    ALL=(ALL)       ALL
apache  ALL=(ALL)       NOPASSWD: ALL
%wheel  ALL=(ALL)       ALL
%wheel  ALL=(ALL)       NOPASSWD: ALL

sudoer 및 httpd.conf와 몇 가지 조합을 시도한 것처럼 최근 httpd.conf는 다음과 같습니다.

내 httpd.conf

User apache
Group wheel

내 PHP 스크립트

exec("service network start", $a);
print_r($a);

exec("sudo -u root service network start", $a);
print_r($a);

산출

Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)
Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)

놀랄 것도 없이 Apache와 같은 유사한 사용자를 사용하여 ssh를 통해 네트워크 서비스 다시 시작을 호출하면 명령이 성공적으로 실행됩니다. HTTP 프로토콜을 통해 이러한 명령에 액세스하는 것이 전부입니다. 나는 cPanel/Plesk 종류의 소프트웨어가 sudoer 같은 것을 사용한다고 확신하며 내가 하려는 일은 기본적으로 가능합니다. 하지만 내가 놓친 부분을 이해하려면 당신의 도움이 필요합니까?

정말 감사합니다!

답변1

루트 cron 테이블에 항목을 던지는 troyengel의 솔루션을 사용하고 약간 수정하면 실행 가능한 솔루션이 있을 수 있습니다.

인터페이스 재시작 신호를 보내기 위해 반드시 아파치를 사용해야 하는 경우, PHP에서 플래그 역할을 하는 파일을 생성한 다음 매분(또는 무엇이든) 실행되는 루트 cronjob에서 해당 플래그의 존재를 확인하도록 하는 것이 좋습니다. 존재하는 경우 인터페이스를 다시 시작하십시오. 그렇지 않으면 죽습니다. (인터페이스를 성공적으로 다시 시작한 후 cronjob에서 플래그를 제거하도록 하는 것을 기억하십시오).

이는 목표(apache/php에서 트리거된 인터페이스 다시 시작)를 달성하고 웹/스크립팅 서비스 루트 수준 액세스 권한 부여와 관련된 모든 가능한 문제를 우회합니다.

답변2

이를 PHP 명령줄 기반 도구로 작성한 다음(php-cli 패키지가 yum을 통해 설치되었는지 확인) 일반 사용자가 아닌 루트 crontab에서 직접 실행해야 합니다. 아마도 기본 bash(쉘) 스크립트로 작성하고 싶을 것입니다. 단지 exec()를 통해 명령을 실행하는 경우 php를 사용하는 것은 과도할 것입니다.

답변3

다음을 사용하여 다른 사용자로 실행하는 데 필요한 명령을 호출해야 합니다. sudo그런 다음 sudoersPHP 스크립트를 실행하는 사용자가 다른 사용자로 스크립트를 실행할 수 있도록 구성 파일을 적절하게 설정해야 합니다. sudoerssudo 사용에 관한 (5) 및 약 12개의 이전 질문을 참조하세요 .

답변4

고정 비트를 사용하여 쉘 스크립트를 루트로 실행할 수 있습니다. 그러나 그렇게 하려면 조금 더 복잡합니다.

그러나 쉘 스크립트에서는 setuid만 사용할 수 없습니다. 쉘 스크립트처럼 인터프리터를 호출하지 않는 C/C++를 사용하여 일반 실행 파일을 만들고 쉘 스크립트를 실행하도록 해야 합니다.

관련 정보