일반 사용자가 네트워크 네임 스페이스를 사용할 수있는 스크립트는 무엇입니까?


22

네트워크 네임 스페이스 (netns)를 사용하는 아키텍처가 있습니다. 일반 사용자가이 netn에서 일부 작업을 수행하도록 허용하고 싶습니다.

이 게시물 에서 netns-exec.sh영감을 얻은 다음으로 실행 된 스크립트를 작성할 수 있습니다 .sudo

ip netns exec $1 su $USER -c "$2"

내 sudoer 파일에 추가하십시오.

user ALL=(ALL) /path/to/netns-exec.sh

그러나 나는 그것이 너무 추악하다는 것을 알았습니다. 일반 사용자가 네임 스페이스를 사용할 수 있도록하는 더 나은 솔루션이 있습니까? 유용한 그룹에 사용자를 배치 할 수 있습니까? 나는 그것에 대해 검색했지만 아무것도 찾지 못했습니다.


1
Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]sudoers 파일에 정의하지 말고 허용 된 사용자를 넣을 그룹을 생성하고이 그룹을이 명령 별칭에 연결하십시오.
netmonk

2
그것은 것 sudo포함 su날 귀찮게하지 스크립트 자체를. 어쨌든 나는 물건을 포장하는 스크립트를 작성합니다. 그것은 2 개의 사용자 스위치를 만듭니다. 정말 못생긴 것 같아요?
Raspbeguy

6
당신을 놀라게 할 것입니다. 사용자는 $ USER를 루트로 수정할 수 있습니다.
Stephen

1
그렇습니다. 그러나 나중에 sudo특정 변수 를 제공하는 $SUDO_USER것이 더 안전 하다는 것을 알았습니다 . 그러나 그것은 여전히 ​​추악합니다.
Raspbeguy

1
@Elronnd-커널은 스크립트에서 setuid를 무시합니다
Angelo

답변:


1

해결책 1

"netns"라는 그룹을 추가하기 만하면 원하는 모든 사용자가 추가됩니다. 그런 다음 root : netns에 소유권을 부여하고 그룹에 읽기 / 실행 기능을 제공하십시오.

다른 용어로 :

# New group netns
sudo groupadd --system netns

# Add root to "netns", not sure if needed
sudo usermod -aG netns root

# Do this for every needed user
sudo usermod -aG netns $UserName

# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh

해결책 2

이 솔루션은 더 간단합니다 . 이 예제 와 같이 sudoers 파일을 편집해야합니다 .

user ALL=(ALL) /bin/ip netns

솔루션 1은 불가능합니다. 명령 ip netns은 루트 만 실행할 수 있다는 오류를 리턴합니다. 솔루션 2는 처음에 생각했지만 내 의견으로는 만족스럽지 않았습니다.
Raspbeguy

이렇게 하면 모든 사용자와 그룹에 권한 chmod 0633이 부여 됩니다. : 난 당신이 스크립트에 SGID 비트를 설정하고 싶었지만 @Angelo가 언급 한 바와 같이 의심 과 쉘 스크립트를 무시하고, 좋은 이유 . write+executenetnssetuidsetgid
ckujau

0

개인적으로 일반 사용자가 다른 네트워크 네임 스페이스에서 명령을 실행할 수 있는지 여부는 알 수 없지만이 주석이 달린 쉘 스크립트는 귀하의 요구에 더 적합 할 수 있습니다.

#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline

case "${1}" in
    do)
        shift # remove "do"
        NSNAME="${1}" # remember nsname
        shift # remove nsname to get argument list for su -c
        [ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
        echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
    ;;
    *)
        SCRIPTNAME="${0}" # remember script full path
        exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
    ;;
esac

어딘가에 설치하고 /usr/bin사용자가 실행할 수있게하십시오.


답장을 보내 주셔서 감사합니다 (몇 달 후에도 죄송합니다). 그러나 문제는 여전히 동일합니다. 즉 sudo를 사용하는 것입니다.
Raspbeguy

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