2009-02-08 4 views
17

리눅스에서 root가 아닌 사용자가 openSUSE를 사용하여 sudo 명령을 사용하지 않고 apache를 실행할 수 있는지 알고 싶습니다. 사용자가 apache (wwwrun)와 같은 그룹에 속한다고 간주하십시오.
미리 감사드립니다. 난 당신이 극복해야한다고 생각할 수root 권한이없는 사용자로 Linux에서 apache 서버를 시작/재시작/중지하는 방법이 있습니까?

+0

내가 대답 하겠지만, 프로그래밍 질문이 아니라고 말할 것입니다. 정말로 대답은 모르겠습니다. 사실 큰 질문입니다. –

+1

감사합니다. 예, 프로그래밍에이 질문이 맞는지는 잘 모르겠지만 시도해 보았습니다. :). – Adriana

+4

내 경험에 비추어 볼 때 프로그래머가 자신의 개발 상자에서 아파치를보다 쉽게 ​​다시 시작할 수 있도록하는 것은 프로그래밍 관련 일 것입니다. –

답변

3

benlumley가 지적한 문제, 즉 로그 파일과 예약 된 포트는 httpd.conf에서 로그 디렉토리와 포트를 구성하면 쉽게 해결할 수 있습니다.

+2

권한이 부여 된 액세스없이 권한이 부여 된 포트 액세스 제한을 해결할 방법은 없습니다. – kmkaplan

+0

"httpd.conf의 ... 포트 구성"은 권한없는 포트를 선택하여 권한있는 포트 액세스 제한을 해결할 수있는 방법입니다. –

+0

오, 나는 비표준 포트가 perfectDay에 맞을 것임을 깨닫지 못했습니다. – kmkaplan

1

두 가지 문제는 다음과 같습니다

  1. 권한을 로그 파일에 -이 아니라 이미 wwwrun 그들에 액세스 할 수 있도록 설정할 수 있지만 종종 문제가 있습니다.

  2. 권한이없는 포트 (80)에 액세스하는 비 루트 사용자 - 변경할 수 있는지 여부는 확실하지 않습니다.

10

모든 사용자로 Apache를 실행할 수 있습니다. 허용 된 리소스 (디렉토리, 파일 및 가장 중요하게는 비 특권 포트에서 수신 대기) 만 사용하도록 설정되어 있는지 확인하십시오.

HTTP의 표준 포트 80 (권한이 있음)에 표시 되려면 실제 Apache 서버로 리디렉션하도록 설정해야합니다. 가장 쉬운 방법은 아마도 iptables를 사용하는 것입니다.

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080 

이 같은 서버를 구성 (또는 시스템 관리자 모두에 대해 한 번 그렇게이)가 아닌 특권 포트를 사용하도록해야합니다 수없는 경우 (뭔가 예를 들어 아파치 서버는 포트 8080에서 수신 대기하는 경우 Listen 8080과 같은 URL을 사용하고 액세스하십시오. http://www.example.com:8080/

+0

문제는 루트가 될 수 없기 때문에 루트로 수행해야하는 모든 것을 극복하는 방법을 찾고 있습니다. 그러나 당신의 대답에 감사드립니다. – Adriana

0

Apache 제어 프로그램 (예 : "chmod g + x apachectl") 소유 그룹에 대한 실행 권한을 부여하면이 작업을 수행 할 수 있어야합니다. 이것이 자체적으로 작동하지 않는다면 프로그램의 소유자 SUID 비트를 설정해보십시오 ("chmod u + s apachectl"의 행을 따라).

첫 번째 단계에서는 wwwrun 그룹의 사용자가 apachectl 프로그램을 실행할 수 있습니다. 두 번째 단계는 그룹이 프로그램을 실행할 때 프로그램 소유자 권한으로 실행되도록합니다.

이 기능이 작동하는지 알고 싶으면 파일 실행 SUID가 약간 녹슬지 만 문제가 계속되면 더 자세히 조사 할 수 있습니다.

이렇게하기 전에 SUID 비트 설정의 결과를 이해했는지 확인하십시오.

5

짧은 대답은 : 없음

그 이유는 루트 만 이하 포트를 결합 할 수 없습니다 1024

긴 대답 : 당신이 포트 문제를 극복하면 http://www.debian-administration.org/articles/386

을 확인, I 더 이상 문제가 없을 것이라고 생각하지 마십시오. 아파치가 실행되는 사용자는 로그 파일과 기타 다른 파일에 대한 쓰기 권한이 있어야한다는 것을 기억하십시오.

그러나 sudo없이 실행하면 spawner가 사용자를 변경할 수 없으므로 apache 사용자 대신 apache가 시작되는 사용자로 실행됩니다.

하지만 sudo를 실행하고 싶지 않은 이유는 무엇입니까?루트로 실행되는 것은 spawner 프로세스 일 뿐이며 나머지는 apache 사용자로 실행됩니다.

0

루트가 아닌 사용자가 루트로 인증 할 필요없이 루트 권한으로 apachectl을 실행할 수 있도록 "setuid"할 수 있습니다.

Example

편집 : 당신은 sudo를 사용하면 파일을 만들 수 있습니다 설치 한 경우

+0

나는 같은 생각.시도해 봤지만 날지 않습니다. (13) 권한 거부 : make_sock : 주소 [:]에 바인드 할 수 없습니다 : 80 (13) 권한 거부 : make_sock : 주소 0.0.0.0:80에 바인딩 할 수 없습니다. –

+0

내 실수 - setuid는 일반적으로 쉘 스크립트에서 무시됩니다 (보안상의 이유로). Emanuel의 답변을 확인하십시오. – Nick

+0

엠마누엘의 대답은 날지 않습니다. –

5

:-) 처음에이 설정 루트 액세스를 필요로 언급해야 : /etc/suduers.d를/다음과 같은 내용으로 apache2reload : 당신이 다시 시작 명령에 액세스 할 수있는 것을 발견,하지만 어쩌면 시작하고 중지하지 않을 수 있습니다 여기에서

username ALL=NOPASSWD:/usr/bin/service apache2 reload 
+0

그렇게하지 않겠습니다. 왜 이렇게 많은 사람들이이 옵션을 게시했는지 이해할 수 없습니다. 기본적으로 sudo 명령을 실행하면 다른 sudo 명령을 실행하기 위해 암호를 입력 할 필요가 없어 자유로운 루트 액세스를 제공합니다. – dtc

+0

이것은 방금 시도한 두 시스템 ("Ubuntu 14.04, SLES 11")에서 "기본값"이 아니므로 스스로 점검 할 가치가 있습니다. – Nick

+0

이것은 올바른 대답입니다. 사용자 아파치를 실행하면 (어쨌든 루트가 아니기 때문에) 차이가 나지 않습니다. @ dtc의 이의 제기는 sudoers conf의 작동 방식에 대한 오해에 근거합니다. – jwg

0

당신은, sudo는 -l로 권한을 볼 수 있습니다.

0

내가 찾은 링크 중 일부는 이에 가장 유익한 답변입니다. 기술적으로는 여전히 root 권한으로 작동하지만, apache2 및 apache2ctl (두 번째 파일도 사용하고있는 경우) 파일로드시 chmod를 사용할 수 있습니다. 이렇게하면 루트 액세스로 실행할 수 있지만 여전히 동일한 권한을 가진 사용자가 보안을 유지합니다 (아파치 또는 apache2ctl이 내가 의심스럽고 미친 짓을하지 않는 한). 당신은 sudo를 액세스를 제공하지 않으려면

-1

당신은 또한이 setuid 래퍼 프로그램을 만들 수 있습니다, 아파치에게

3

을 실행하는 관리자를 사용할 수 있습니다.

httpdctrl.c에서 경로

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
#include <strings.h> 

// allow start/stop/restart of apache by non-root users 

int main(int argc, char **argv) 
{ 
    char *cmd, *cmd2, *usage; 

    // UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 
    cmd2 = "apachectl"; 
    usage = "Usage: COMMAND [start|stop|restart]\n"; 

    if (argc != 2) { 
    printf(usage); 
    exit(1); 
    } 

    setegid(0); 
    seteuid(0); 
    setgid(0); 
    setuid(0); 

    if (strncmp(argv[1], "start", 5) == 0) { 
    if (execl(cmd, cmd2, "start", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "stop", 4) == 0) { 
    if (execl(cmd, cmd2, "stop", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "restart", 7) == 0) { 
    if (execl(cmd, cmd2, "restart", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else { 
    printf(usage); 
    exit(1); 
    } 
    exit(0); 
} 

업데이트 : 예를 들어 다음

// UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 

컴파일하고

gcc -o httpdctrl httpdctrl.c 
sudo chown root:root httpdctrl 
sudo chmod u+s httpdctrl 

이제 httpdctrl이 루트가 소유와 권한 '을 변경, setuid가 루트로 실행합니다.

중요 : 시작/중지 스크립트와 모든 상위 디렉토리가 root가 소유하고 있는지 확인하십시오. 또한 '기타'에 대한 파일 및 디렉토리에 대한 쓰기 액세스를 제거하십시오. 기본적으로 누군가가 루트로 실행되는 dir/파일을 편집하거나 변경할 수 없도록하고 싶습니다.

관련 문제