쉘 스크립트에서 UID를 설정할 수 없습니다


14

아무도 여기서 무슨 일이 일어나고 있는지 알 수 있습니까? 패킷 수 추적을 설정하는 규칙이 있습니다. 루트로 다음 스크립트를 실행할 때 :

#!/bin/bash
iptables -t mangle -xnvL

나는 내가 기대하는 결과를 얻는다 :

//snip
233203 199929802 MARK  //blah blah blah
//snip

그러나 나는 이것을 아파치로 실행되는 선인장의 일부로 실행하고 싶습니다. 이제 아파치는 iptables를 실행할 수 없으므로 스크립트가 있습니다. SUID 루트로 설정했습니다 .

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

그러나이 출력을 얻습니다.

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

분명히 내 커널은 괜찮으며 루트가 아닌 것으로 실행한다는 사실은 뭔가 엉망이지만 그 이유를 이해할 수 없습니다. [데모] ( http://en.wikipedia.org/wiki/Setuid#Demonstration으로 SUID를 다시 확인하고 작동하는지 확인했습니다.

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

내 최종 목표는 아파치로 실행하는 동안 iptables -t mangle -xnvL의 출력을 얻는 것이므로 cacti를 사용하여 그래프를 멋지게 그래프로 나타낼 수 있습니다.

답변:


16

쉘 스크립트에는 SUID 루트를 사용할 수 없습니다. 실제 프로그램 만 SUID 루트 일 수 있으며 쉘 스크립트는 "#!"로 시작합니다. 통역사는 SUID를 실행해야하며 알지 못하는 이유로 작동하지 않습니다.

sudo를보고 설치하십시오! / etc / sudoerrs를 편집하고 다음과 같은 줄을 추가하십시오 :

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

그런 다음 실행

sudo /usr/local/sbin/iptables_packet_report.sh

귀하의 코드에서.

그런 다음 암호를 묻지 말고 프로세스를 자동으로 평가하십시오.

www-data를 수동으로 su하고 수동으로 실행하면 오류 메시지가 발생할 것입니다.


13

Christian이 지적한 것처럼 내 문제는 쉘 스크립트로 SUID를 시도하고 있다는 것입니다. 여기에 설명 된 것처럼 쉘 스크립트에서 SUID를 설정하는 것은 매우 나쁜 생각입니다.

UNIX에서 셸 스크립트를 실행하려면 2 단계 프로세스가 필요합니다. 커널에서 셸 스크립트를 실행하려고한다고 결정하면 먼저 셸 인터프리터의 SUID 복사본을 시작한 다음 셸 인터프리터가 셸 스크립트 실행을 시작합니다. 이 두 가지 작업은 두 개의 개별 단계로 수행되므로 첫 번째 단계 후에 커널을 중단하고 셸 인터프리터가 실행하려고하는 파일을 전환 할 수 있습니다. 이러한 방식으로 공격자는 컴퓨터가 자신이 선택한 쉘 스크립트를 실행할 수 있습니다.

이 때문에 많은 현대 리눅스 배포판은 내가 사용하고있는 젠투를 포함하여 SUID 쉘 스크립트를 무시합니다. sudoers 파일을 편집하여 작동시킬 수있었습니다.


환상적인 답변!
Dave Cheney

이것이 Solaris 10에 해당되는지 아는 사람이 있습니까?
Eric Johnson

2

나는 Christian의 해결책이 최선이라고 생각하지만 정말로 원한다면 shc를 사용하여 스크립트를 컴파일 한 다음 컴파일 된 프로그램에서 setuid root를 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.