setuid 작업을 올바르게 실행하는 방법은 무엇입니까?

setuid 작업을 올바르게 실행하는 방법은 무엇입니까?

PHP 웹사이트가 있고 웹사이트 코드 실행을 기반으로 방화벽 수준에서 IP를 차단하고 싶다고 가정해 보겠습니다. 사이트는 루트가 아닌 사용자로 실행됩니다.

사이트 코드의 IP를 스크립트(루트에만 쓸 수 있음)로 전달할 계획입니다.

#!/bin/bash
function validate_ip()
{ ... code here ...}
if validate_ip $1; then 
    /usr/sbin/iptables -I INPUT -s $1 -j DROP
    echo 'blocked'; 
else 
    echo 'bad IP $1'; 
fi

suid 비트를 사용하세요. XSS 및 기타 나쁜 문제(필요하다면 편집증적인 생각)를 피하기 위해 추가 IP 유효성 검사를 추가하고 싶으므로 웹 사이트에서 iptables를 직접 호출하는 것을 원하지 않습니다.

스크립트가 작동하지 않습니다 can't initialize iptables table 'filter': Permission denied (you must be root).bash는 suid 비트를 제거합니다.

해결 방법이 있습니다. 허용sudo의 iptables하지만 나는 그것이 안전하다고 생각하지 않습니다. 해당 작업을 수행할 수 있는 바이너리를 개발/구입할 시간/가능성이 없습니다. 누군가 스크립트를 바이너리로 래핑하는 것을 제안했지만 망설였습니다. 더 좋은 방법이 있을까요?

따라서 질문은 루트가 아닌 응용 프로그램이 안전한 방법으로 방화벽에서 iptables IP를 차단하도록 허용하는 방법입니다.

답변1

bash 스크립트 suid 루트를 만드는 대신 sudo를 통해 bash 스크립트를 실행하십시오. 부가적인 이점으로 루트로 스크립트를 실행할 수 있는 사람과 전달되는 매개 변수를 쉽게 잠글 수 있습니다. 예를 들어 다음만 허용할 수 있습니다.

phpuser ALL=(root) NOPASSWD: /usr/local/sbin/your-script [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9]

그런 다음 PHP 스크립트가 항상 각 IP 주소 옥텟의 형식을 세 자리 숫자로 지정하는지 확인하세요.

PHP가 sudo를 호출하는 것이 너무 어려운 경우(그러면 안 됩니다!) 스크립트가 직접 호출하도록 할 수 있습니다. 예를 들면 다음과 같습니다.

#!/bin/sh

[ "$(id -u)" -eq 0 ] || exec sudo -- "$0" "$@"
# rest of script here

(iptables가 앞에 오는 0을 만족할지 확신할 수 없습니다. 그렇지 않으면 제거할 수 있습니다.)

추신: 쉘 스크립트에서 변수를 인용하십시오.

if validate_ip "$1"; then 
    /usr/sbin/iptables -I INPUT -s "$1" -j DROP
    # ⋮

관련 정보