모든 사용자가 특정 네트워크 네임스페이스 내에서 프로그램을 실행할 수 있도록 하는 안전한 방법

모든 사용자가 특정 네트워크 네임스페이스 내에서 프로그램을 실행할 수 있도록 하는 안전한 방법

내 서버에 셀룰러 모뎀이 연결되어 있고 유선 전화가 끊길 때 이를 사용하여 알림 이메일을 보내고 싶습니다.

일반 네트워크 액세스와 이 특정 셀룰러 ​​모뎀 액세스를 훌륭하게 분리하기 위해 네트워크 네임스페이스를 만들고 네트워크 장치를 그 안에 있는 유일한 장치로 만들었습니다. 프로그램이 셀룰러 모뎀을 사용하도록 하려면 간단히 ip netns exec.

문제는 모든 사용자가 네임스페이스에서 원하는 모든 프로그램을 실행할 수 있도록 허용하고 싶지만 netns exec루트 권한이 필요하다는 것입니다. 내 솔루션은 다음과 같습니다.

/usr/local/sbin/_oob_shim:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

/etc/sudoers:

ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim

루트 권한이 없거나 루트 비밀번호를 모르는 상태에서 shim을 실행하는 유일한 방법은 sudo를 통하는 것이라고 생각하며, sudo를 사용하여 $SUDO_UID 및 $SUDO_GID를 올바른 값으로 설정할 수 있다고 믿습니다.

나는 상당한 위험에 처해 있습니까? 아니면 명백한 경고를 놓쳤다고 해야 할까요?

답변1

sh -c귀하의 코드에서 볼 수 있는 유일한 오류는 직접 실행해야 할 사용자 명령을 불필요하게 실행하고 있다는 것입니다. 이를 실행해도 sh -c아무 소용이 없지만 사용자가 원래 입력한 명령에 대한 참조가 삭제됩니다. 예를 들어 다음을 시도해 보세요.

sudo /usr/local/sbin/_oob_shim ls -l "a b"

a b네임스페이스 컨텍스트에서 호출된 파일을 나열해야 하지만 ab.

sudo /usr/local/sbin/_oob_shim ls -l "*"

이름이 별표인 파일 을 나열해야 *하지만 같은 이유로 실패합니다.

따라서 다음과 같아야 합니다.

#!/bin/sh
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

스크립트 시작을 더 쉽게 만들어보세요!

내가 할 수 있는 또 다른 요점은 이 경우 버그는 보안 버그가 아닌 기능적 버그일 뿐이지만 보안에 민감한 코드를 감사하고 셸을 통해 작업을 실행하는 것을 볼 때 항상 의심스럽다는 것입니다. 이는 거의 항상 문제이기 때문입니다.

마지막으로 사용자의 보조 그룹은 네임스페이스에 전파되지 않지만(uid와 기본 gid만 가져옴) 이는 큰 문제가 아닌 것으로 보이며 이를 수정하는 것도 쉽지 않습니다.

그 외에는 제가 보기에는 괜찮아 보입니다.

관련 정보