インターネットにアクセスせずにプログラムを実行したい。
unshare -n ping 127.0.0.1
。
非特権ユーザーとしてはOperation not permitted
を返し、特権ユーザーとしては目的のNetwork is unreachable
を返します。
非特権ユーザーでも同様に機能させる方法はありますか?
Util-linuxの以降のバージョンでは、unshare
に_--map-root-user
_オプションが追加されました。 unshare(1)
バージョン2.26.2からの引用:
-r、-map-root-user
現在有効なユーザーIDとグループIDが、新しく作成されたユーザー名前空間のスーパーユーザーUIDとGIDにマップされた後にのみ、プログラムを実行してください。これにより、権限なしで実行されている場合でも、新しく作成された名前空間のさまざまな側面を管理するために必要な機能(ネットワーク名前空間でのインターフェイスの構成やマウント名前空間でのファイルシステムのマウントなど)を簡単に取得できます。単なる便宜機能として、UIDとGIDの複数の範囲のマッピングなど、より高度な使用例はサポートしていません。このオプションは、-setgroups = denyを意味します。
したがって、新しいシステムでは、次のコマンドを実行できます。
_unshare -n -r ping 127.0.0.1
_
そして、これは期待される_Network is unreachable
_を生成します。
setuid
にします(すでにroot
が所有している場合):
Sudo chmod u+s "`which unshare`"
からnshare(1):
注unshareコマンドは、ターゲットプログラムを実行する前に、潜在的な特権を削除します。これにより、setuidで共有を解除できます。
setcap
ユーティリティを使用して、共有解除を設定できます。
Sudo setcap cap_sys_admin+ep /usr/bin/unshare
この後、unshare -n ping 127.0.0.1
これ以上説明することはできません。これが良いアイデアかどうかはわかりませんが、機能し、whoami
はユーザー名としてroot
を表示しません。