通常のユーザーがネットワーク名前空間を使用できるスクリプトは何ですか?


22

ネットワーク名前空間(netns)を使用するアーキテクチャがあります。通常のユーザーがこれらのネットワークでいくつかの操作を行えるようにしたいと思います。

この投稿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含まれているa suです。とにかく、物をラップするスクリプトを書きます。それは2つのユーザースイッチを作ります、それは本当にいです、あなたは思いませんか?
ラズベガイ

6
それはあなたを怖がらせる必要があります。ユーザーは、$ USERを変更してrootにすることができます。
スティーブン

1
はい、それは私を怖がらせます。しかしsudo、後で特定の変数を提供することがわかりました$SUDO_USER。これはより安全です。しかし、それはまだいです。
Raspbeguy

1
@Elronnd-カーネルがスクリプトのsetuidを無視する
アンジェロ

回答:


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は、rootのみが実行できるというエラーを返します。解決策2は当初私が念頭に置いていたものですが、私の意見では満足できませんでした。
ラスベガイ

これchmod 0633により、write+executeすべてのユーザーとnetnsグループにアクセス許可が付与されます。:私は、スクリプトのSGIDビットを設定したかったが、@Angeloが述べたように疑いsetuidsetgidシェルスクリプトのために無視され、正当な理由のために
-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を使用します。
ラズベガイ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.