2017-02-06 11 views
3

"사용자"가 루트로 실행되지 않아도 루트로 내 시스템에서 특정 Perl 스크립트를 실행할 수 있기를 원합니다.Perl 스크립트가 루트 (일반화)로 실행됩니다.

각 스크립트에 대해 해당 래퍼에 대해 setuid root를 설정하여 C 래퍼를 작성할 수 있습니다. 래퍼는 UID를 0으로 변경 한 다음 setuid 비트가 설정되지 않은 Perl 스크립트를 호출합니다. 이렇게하면 setuid 루트 스크립트를 실행하는 동안 불행한 장애물을 피할 수 있습니다.

하지만 각 스크립트에 C 래퍼를 쓰고 싶지는 않습니다. 한 시스템에서 전체 C 래퍼 하나만 수행하면됩니다. 나는 또한 모든 스크립트가이 C 래퍼를 사용할 수 없도록하고 싶다. C 랩퍼 자체가 Perl 스크립트의 특정 특성을 점검하여 UID를 루트로 변경하는 것이 허용 가능한지 여부를 확인할 수 있어야합니다.

이 문제를 해결하는 다른 스택 오버플로 질문은 아직 표시되지 않습니다.

나는 위험을 안다. 나는 시스템을 소유하고 있으며, 내 방식대로 서서 나를 무언가를 보살 피는 것을 원치 않는다.

답변

1

:

모든 요구 사항은 다음 단계를 충족시킬 수있다. 먼저 단 한 번 수행되는 단계를 보여줍니다.

1 단계. 루트로 실행되어야하는 각 스크립트는 사용자 루트에 의해 어떻게 든 표시되어야하므로 (그렇지 않으면 모든 사용자가이 작업을 수행 할 수 있기 때문에) 시스템 관리자는 자신의 특권 상태를 이용하여 실제로 아무에게도 할당되지 않는 사용자 ID를 선택합니다 . 이 예에서는 사용자 ID 9999를 사용합니다.

2 단계. 특정 C 랩퍼를 컴파일하고 오브젝트 코드가 suid root로 실행되도록하십시오. 해당 래퍼의 소스 코드는 here입니다.

그런 다음, 다음 두 단계가 각 Perl 스크립트가 루트로 실행되도록 한 번 수행됩니다.

1 단계. 다음 코드로 각 Perl 스크립트를 시작하십시오.

if($>) 
{ 
    exec { "/path-to-wrapper-program" } 
     ("/path-to-wrapper-program",$0,@ARGV); 
} 

2 단계. 루트 (당연히)로서 Perl 스크립트의 소유자를 9999 사용자로 변경하십시오. 그게 전부입니다. 데이터베이스 또는 텍스트 파일을 업데이트하지 않습니다. Perl 스크립트를 루트로 실행하기위한 모든 요구 사항은 스크립트 자체에 있습니다. 단계 하나에

코멘트 : 나는 실제로 펄 위의이 행 후 니펫을 배치 :

use strict; 
use warnings FATAL=>"all"; 

...하지만 자신에 맞게.

1

단일 래퍼를 사용하고 펄 스크립트를 인수로 실행하고 C 래퍼가 스크립트의 길이와 스크립트 내용의 SHA-3 또는 SHA-2 해시를 예상 값과 비교하도록합니다.

+0

제안 된 솔루션은 훌륭합니다. 제안 된 스크립트를 축복하기 위해 루트에서 수행해야하는 것을 C 래퍼가 루트로 실행하도록 알고 있어야합니다. 하지만 축복 (여전히 루트 만 가능)을 Perl 스크립트 자체의 일부로 만들고 싶습니다. 따라서 스크립트가 추가, 제거 또는 수정 될 때마다 별도의 해시 목록을 유지할 필요가 없습니다. –

+0

그런 다음 펄 스크립트가 뒤돌아서 래퍼를 호출하여 이미 루트가 아닌 경우 자체를 호출합니다. 하지만 펄 스크립트는 그렇게 할 수 있으며, 본질적으로 전혀 보안이 없습니다. – ysth

+0

커맨드 라인 사용자는 모든 종류의 C 래퍼가 관련되어 있다는 것을 알 필요가 없습니다. 그는 단지 Perl 스크립트를 실행할 것이고 예, 래퍼를 호출 할 것입니다. 그 트릭은 (루트 만 할 수있는 방식으로) Perl 스크립트에 태그를 달아 C wrapper가 Perl 스크립트에 UID0으로 실행될 자격이 있음을 알 수 있도록하는 것입니다. –

5

당신이하려는 것은 전문가에 의해서조차 매우 어렵습니다. perl과 함께 사용되던 setuid 래퍼는 더 이상 존재하지 않으며 요즘에는 더 이상 필요하지 않기 때문에 존재하지 않습니다. 리눅스와 저는 다른 현대의 유닉스 시스템이 setuid 스크립트를 지원한다고 생각하기 때문에 매우 약하고 복잡한 래퍼가 필요하지 않습니다.

래퍼가 정말로 필요한 경우 휠을 다시 발명하지 마십시오. 그냥 sudo을 사용하십시오! 일부 브레인 스토밍 후