ネットワークネームスペース(netns)を使用するアーキテクチャがあります。一般ユーザーがこれらのネットワークでいくつかのタスクを実行できるようにしたいと思います。
netns-exec.sh
私は以下からインスピレーションを得てスクリプトを書くことができます。この投稿の実行に使用されるものには、次のものがsudo
含まれます。
ip netns exec $1 su $USER -c "$2"
私のsudoerファイルに追加しました。
user ALL=(ALL) /path/to/netns-exec.sh
しかし、あまりにも醜いので悪夢を見ることができると思います。一般ユーザーが名前空間を使用できるようにするより良いソリューションはありますか?ユーザーを便利なグループに入れることは可能ですか?検索しましたが、何も見つかりませんでした。
答え1
答え2
ソリューション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
答え3
スクリプトではありませんが、root以外のユーザーがLinuxネットワークの名前空間内でプロセスを実行できるようにする、非常にミニマリストで編集可能なCプログラムを作成しました。
ソースコードはここにあります:netns-exec.c
答え4
個人的には、通常のユーザーが他のネットワーク名前空間でコマンドを実行できるようにすることは可能ですが、注釈付きのこのシェルスクリプトはあなたのニーズに適している可能性があります。
#!/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
し、ユーザーが実行できるようにします。