
次の内容を含む、file.php という PHP スクリプトがあります。
<?php
exec("ip netns exec vpn file2.php");
?>
コマンドラインから root として file.php を実行すると、動作します。ただし、Apache 経由で実行すると、www-data には ip netns exec を使用する権限がありませんが、www-data は ip netns list を使用できます。
どうすれば、a) ip netns exec を非ルート ユーザーが実行できるようになるか、www-data に ip net exec を実行する権限を与えることができますか?
答え1
次のようなことを試してみてください
# ip netns exec vpn sudo -u www-data apache
root として。
この方法では、Apache は非ルート ユーザーとして netns で実行されます。 両方の名前空間を同時に必要とする場合は、それぞれ 1 つの名前空間で 2 つのインスタンスを起動します。 名前空間をオンザフライで変更することは機能しないようです。
説明:
ディレクトリには/var/run/netns
すべてのネットワーク名前空間が格納されており、新しい名前空間「abc」を追加すると、このディレクトリに空のファイル「abc」が作成されます。名前空間「abc」でプログラム「xyz」を実行するたびに、ip(1)
は のファイル記述子を開いて保持し/var/run/netns/abc
、 と を呼び出しunshare(2)
ますsetns(2)
。
ここで 2 つの障壁が生まれます。1 つは のファイルシステム権限であり/var/run/netns/*
、もう 1 つは特権システムコールの機能です。