インターネットにアクセスせずにプログラムを実行したいです。
unshare -n ping 127.0.0.1
。
権限のないユーザーとしてを返し、Operation not permitted
権限のあるユーザーとして必要なものを返しますNetwork is unreachable
。
権限のないユーザーにも機能させる方法はありますか?
答え1
util-linuxの将来のバージョンでは、unshare
このオプションが得られました--map-root-user
。unshare(1)
バージョン 2.26.2 引用:
-r、--map-root-user
現在有効なユーザーとグループIDが、新しく作成されたユーザー名前空間のスーパーユーザーUIDとGIDにマップされている場合にのみ、このプログラムを実行してください。これにより、権限なしで実行しても、新しく作成されたネームスペースのさまざまな側面(たとえば、ネットワークネームスペースからインターフェースを構成したり、マウントネームスペースにファイルシステムをマウントしたり)を管理するために必要な機能を簡単に取得できます。純粋に便利な機能として、複数のUIDやGID範囲マッピングなどのより複雑なユースケースはサポートされていません。このオプションは --setgroups=deny を意味します。
そのため、最新のシステムでは以下を実行できます。
unshare -n -r ping 127.0.0.1
それから期待されるNetwork is unreachable
。
Debianシステムではまだエラーが表示される可能性があるため、Operation not permitted
まず次のコマンドを実行して、権限のないユーザーネームスペースを有効にする必要があります。
sudo sysctl -w kernel.unprivileged_userns_clone=1
注:より広い範囲のユースケースでは、bwrap --unshare-net
簡単に説明したように、より複雑なユースケースを検討できます。他の答えで。
答え2
また、新しいネットワーク名前空間を入力するもう1つの方法は、unshare -n
より高いレベルのBubblewrap()を使用することですbwrap --unshare-net
。
bwrap --bind / / --dev /dev --unshare-net -- your-program args …
注:その場合、your-program args …
ICMPping 127.0.0.1
はBubblewrapではサポートされていないため、OPの例には「Network is unreachable
」は表示されません。
プログラムがあることも注目に値する。--unshare-net
するループバックインターフェイスを取得しますが、ネットワークネームスペース分離インターフェイスを取得します。
答え3
このsetcap
ユーティリティを使用して共有解除を設定できます。
sudo setcap cap_sys_admin+ep /usr/bin/unshare
その後は、これ以上unshare -n ping 127.0.0.1
説明できず、良いアイデアかどうかはわかりませんが、うまくいき、ユーザー名としてwhoami
表示されません。root