2011-02-14 2 views
3

아파치 또는 명령 줄에서 호출되는 Perl 스크립트가 있습니다.cgi-bin으로 사용할 때 setuid()를 사용하여 Perl 스크립트를 성공적으로 실행하는 방법은 무엇입니까?

테스트 목적으로 나는 펄 스크립트가 작동하게하려는 사용자 이름을 전달하고 POSIX::setuid을 사용하여 uid을 설정합니다. 내가 명령 줄에서 스크립트를 실행하는 경우

, 다음 uid가 제대로 설정됩니다

use CGI::Pretty qw/:standard/; 
use POSIX qw(setuid getuid); 

... 
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment, 
    $pwGcos, $pwHome, $pwLogprog) = getpwnam($username); 

if ((defined $pwUid) && (getuid() == $pwUid)) { 
    setuid($pwUid); 
    print header; 
    print Dumper $<; 
} 
else { 
    print header(-status => 401); 
    print "Could not setuid to correct uid (currently:)".getuid()."\n"; 
} 

명령 줄 출력 대신 테스트 계정의 uid의의 $username 지정된 올바른 uid 보여줍니다 스크립트를 실행하기 시작했습니다.

아파치를 통해 스크립트를 호출하면 uidapache 사용자의 ID로 설정되고 변경되지 않습니다.

, 설명서를 읽고 때문에, 여기 suExec를 사용할 수 있다고 생각하지 않습니다

  1. 나는 모든 $username에 대한 http://www.example.com/~username에이 스크립트의 사본을 넣을 수 없습니다. 스크립트는 한 위치에서 실행해야하며 스크립트 내에서 uid을 지정해야합니다.

  2. 런타임시 지정된 사용자 이름으로 스크립트를 실행해야하며 Apache 구성 파일의 가상 호스트 지시문에 한 번 지정된 단일 사용자 이름이 아니어야합니다. 이 구성 파일을 변경하고 새 사용자가이 스크립트를 실행할 때마다 Apache를 다시 시작하는 것은 현실적이지 않습니다.

가 어떻게 Perl 스크립트가 CGI - bin에 제대로 uid을 변경할로 실행합니까, 때 setuid()을 사용하고 계십니까?

+1

명령 줄 사용자가 UID를 변경할 수있는 권리가있을 수 있습니다. 웹 서버 사용자는 아마도 그렇지 않습니까? – Konerak

답변

4

임의의 uid에 setuid 할 수있는 유일한 방법은 루트로 실행하는 것입니다. [1]

나는 너를 모른다. 그러나 루트로 실행되는 CGI 프로그램의 아이디어는 나에게 악몽을 준다.

uid를 변경 한 후 실제로 수행해야하는 코드는 무엇입니까? 아마도 setuid없이이 작업을 수행 할 수있는 방법이 있을까요?

[1] 코드 및 보안 모델에 따라 사용자의 암호를 수집하고 su/sudo [2]을 사용하여 별도의 명령 줄 프로그램을 실행하여 웹 외부에서 실제 작업을 실행할 수 있습니다 서버 환경이지만 su/sudo은 suid root이고 CGI 코드를 루트로 실행하는 것과 관련된 대부분의 문제를 여전히 열어 놓기 때문에이 작업을 수행 할 수 있습니다. 루트를 잘못된 사용자 이름으로 필터링하더라도, 임의의 사용자가 악용 할 수있는 많은 기회를 열어 가면서 가장 할 수 있습니다.

[2] sudo도 암호를 요구하지 않고도 허용하도록 구성 할 수 있지만 해당 경로 아래에는 용이 있습니다. 시도 할 경우 수행중인 작업을 알고 있는지 확인하십시오. 사용자가 자유롭게 다른 사람을 사칭하도록 할 수 없도록하십시오.

+0

이 cgi-bin은 Ajax 호출과 함께 사용됩니다.스크립트는 웹 서버에 액세스 할 수있는 파일 시스템에서 자신의 파일 목록에 대한 해당 사용자의 액세스를 제한하기 위해 지정된 사용자로 실행해야합니다. –

+0

나는 디렉토리 목록을 제공하기 위해 사용하고있는 코드를 분리 한 다음, 제공된 사용자 이름의 uid를 기반으로 결과를 필터링해야한다고 생각합니다. –

+1

@Alex - 후자 (사용자 ID를 기반로 한 CGI 필터 결과 제외)는 실제로이 문제에 대한 최상의 솔루션입니다. – DVK

관련 문제