プロセスのネットワークアクセスをブロックしますか?


74

単一プロセスの(発信)ネットワークアクセスをブロックすることは可能ですか?


6
プロセスをどのように識別しますか?PID、名前、パス?
マルコ

1
どのアクセスをブロックしますか?一部のプログラムはlocalhost、(同じマシンへの)ネットワークアクセスを使用してジョブを実行します。
フォンブランド

プロセスが連携している場合は、ネットワークアクセスを防ぐためにLD_PRELOADまたは同様のものも参照してください。
ジル

回答:


78

Linux 2.6.24+では(2.6.29までは実験的と見なされていました)、そのためにネットワーク名前空間を使用できます。ツールを使用して、カーネル(CONFIG_NET_NS=y)およびutil-linuxで「ネットワーク名前空間」を有効にする必要がありunshareます。

次に、ネットワークアクセスなしでプロセスを開始するのは簡単です。

unshare -n program ...

これにより、プロセスの空のネットワーク名前空間が作成されます。つまり、ループバックを含め、ネットワークインターフェイスなしで実行されます。以下の例では、現在の有効なユーザーIDとグループIDがスーパーユーザーのIDにマッピングされた後にのみプログラムを実行する-rを追加します(sudoを回避)。

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

アプリにネットワークインターフェイスが必要な場合は、新しいインターフェイスを設定できます。

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

これにより、新しいローカルループバックが作成されることに注意してください。つまり、生成されたプロセスは、ホストのの開いているポートにアクセスできません127.0.0.1


名前空間内の元のネットワークにアクセスする必要がある場合は、を使用nsenterして他の名前空間を入力できます。

次の例pingは、PID 1で使用されるネットワーク名前空間で実行されます(それはを通じて指定されます-t 1)。

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms

4
unshare -nroot特権なしで「許可されていない操作」をスローするようです、私はそれについて何も欠けていますか?
ハゲ

1
たぶん愚かな質問...この名前空間は、非共有アプリケーションの子プロセス/呼び出されたプロセスにも適用されますか?
ボナンザ

3
はい。名前空間を切り替えた後に生成されたすべての子によって継承されます。
ミチャウゴルニー

2
sudo unshare -nルート権を継承するなど、共有を解除したいプログラムがあるようです。unshareを呼び出すにはsudoが必要なので、呼び出されたプログラムにroot権限がないことをどのように確認できるか疑問に思っています。
ボナンザ

3
プロセスをユーザーに制限するライナー。ただ、二回須藤:sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
ヤクブBochenski

21

Linuxには、ネットワーク名前空間と呼ばれる機能があります。これにより、同じマシン上に複数のネットワークスタックを基本的に配置し、実行時にプログラムに割り当てることができます。これは、通常コンテナで使用される機能ですが、目的を達成するために使用することもできます。

ip netnsサブコマンドは、それを管理します。何にもアクセスできない新しいネットワーク名前空間を作成するのは簡単です。これは新しい名前空間のデフォルトの状態です。

root@host:~# ip netns add jail

これで、そのネームスペースに切り替えると、かなり簡単に構成できます。あなたはおそらくそこにloを持ち出したいと思うでしょう、それはそれです:

root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit

これで、ネットワークなしでコマンドを実行したい場合は、その刑務所で実行するだけです:

root@host:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

ネットワークは、必要に応じて到達不能です。(別のネットワークスタックにはiptablesルールなどが含まれているため、あらゆる種類の興味深いことができます。)


sudo ipipコマンドを実行する必要がありましたが、bashになってからsu someuser、ユーザー 'someuser'の非特権シェルを取得するために実行しました。
セージ

11

iptablesを使用して、そのプロセスをcgroupに移動できます。

mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid

iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP

echo [pid] > /sys/fs/cgroup/net_cls/block/tasks

1
そのタスクファイルからpidを削除する方法imがrootユーザーとimでそのファイルからデータを削除または削除しようとするとエラーが発生する
-pkm

@pkmでネットワーキングを有効に戻すには、[pid]にエコーする必要があります/sys/fs/cgroup/net_cls/tasks(パスに「ブロック」はありません)
悲嘆

10

はい、カスタマイズされた装甲プロファイル、すなわち

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

しかし、その方法では、アクセスを許可するファイルのリストも生成する必要があります。手順全体が少し複雑になる可能性があります。そして、ここでのヘルプ文書を参照してください


7

firejailサンドボックスを使用できます(seccomp機能を備えたカーネルで動作するはずです)。

使用するには

firejail --noprofile --net=none <path to executable>

--noprofileデフォルトのサンドボックスを--net=none無効にし、ネットワークを無効にします

ほとんどのディストリビューションはすでにパッケージを提供していると思いますが、firejailがなくても、ビルドツールチェーンと名前空間/ seccomp対応カーネル以外の依存関係はほとんどありません。

firejailにfirejail --helpは、ネットワークに関して表示できる他の優れた機能(ループバックインターフェイスの提供やip / dnのブロックなど)がありますが、これでうまくいくはずです。また、それdoesn't require root


5

iptablesだけではできません。この機能は簡単に存在していましたが、確実に動作させることができず、放棄されました。

専用のユーザーIDとしてプロセスを実行できる場合、iptablesはownerモジュールでそれを実行できます。

iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP

Iptablesの例を参照してください:conntrackと所有者との発信トラフィックのマッチング。XYアプリケーション/ユーザーのみを許可するための奇妙なドロップiptables / pfルールで動作しますか?

独自のコンテナでプロセスを実行できる場合は、そのコンテナを個別にファイアウォールで保護できます(ネットワークから完全に切断することもできます)。

セキュリティモジュールは、ネットワーク機能へのプロセスのアクセスをフィルタリングできます。warl0ckの答えは、AppArmorの例を示しています。


3

解決策1:ファイアウォール:

DouaneOpensnitchなどのファイアウォールを使用できますが、これらのアプリケーションは100%効率的ではないか、開発の初期段階にあります(2019年時点で多くのバグなどがあります)

解決策2:カーネルMAC:

カーネルMACは、最も知られているTomoyoSelinux、およびApparmorとしてファイアウォールとして使用できます。 このソリューションは、安定性と効率(ファイアウォールソリューション)に関しては最高のソリューションですが、ほとんどの場合、これはやや複雑です。

解決策3:Firejail:

Firejailを使用して、アプリケーションのネットワークアクセスをブロックできます。これにより、すべてのユーザーが恩恵を受けることができるルートは不要です。

firejail --noprofile --net=none command-application

解決策4:共有解除

Unshareは、ネットワークなしで別のネームスペースでアプリケーションを起動できますが、これにはroot firejailのソリューションがほぼ同じことを必要としますが、rootは必要ありません

unshare -r -n application-comand

解決策5:Proxify:

1つの解決策は、アプリケーションをnull /偽のプロキシにプロキシ化することです。tsocksまたはproxyboundを使用できます。ここではいくつかあるのセットアップに関する詳細

解決策6:Iptables:

他の簡単な解決策はiptablesです。アプリケーションをブロックするようにセットアップできます

  1. 新しいグループを作成、検証します。このグループに必要なユーザーを追加します。
    • 作成: groupadd no-internet
    • 検証: grep no-internet /etc/group
    • ユーザーの追加:useradd -g no-internet username

      注:既存のユーザーを変更する場合は、次を実行する必要があります:usermod -a -G no-internet userName check with:sudo groups userName

  2. パスにスクリプトを作成し、実行可能にします。
    • 作成: nano /home/username/.local/bin/no-internet
    • 実行可能ファイル: chmod 755 /home/username/.local/bin/no-internet
    • コンテンツ: #!/bin/bash
                    sg no-internet "$@"

  3. グループno-internetのネットワークアクティビティを削除するためのiptablesルールを追加します
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      注:変更を永続的にすることを忘れないでください。再起動後に自動的に適用されます。それを行うかどうかは、Linuxディストリビューションによって異なります。


   4.以下を実行して、Firefoxなどで確認します。

  • no-internet "firefox"

   5.例外を作成し、プログラムがローカルネットワークにアクセスできるようにする場合:

  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
  • iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

   6.永続化する

   ブート時にiptablesルールを適用する1つの方法は、systemdでルールをサービスとして追加することです

cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh

1
これは非常に優れたガイドです。ありがとうございました。私にとっては、no-internetコマンドがパラメーターを渡すことはなかったのでsg no-internet、今のところ使用しています。
ザックブルームキスト

@Zach私はあなたが火の刑務所に興味があるかもしれない私の答えを更新しました;)
intika

2

使用しているディストリビューションによって異なりますが、これは通常OSのMACシステムに含まれている機能です。前述のとおり、UbuntuまたはSuSEのAppArmorでこれを実行できます。RHELを使用している場合は、実行中のプロセスのラベルに基づいて特定のポート番号へのアクセスを許可または拒否するようにSELinuxを構成できます。これは、高速グーグルの後に見つけることができるすべてです。しかし、あなたがもっとよく見て、それがあなたに一般的な考えを与えるなら、おそらくオンラインでより多くの詳細なリソースがあります。


2

seccomp-bpfを使用して、一部のシステムコールをブロックできます。たとえば、プロセスがソケットFDを作成するのを防ぐためにsocketシステムコールをブロックすることができます。

このapprocahのを書いたので、libseccompをsocket使用して作業するためのシステムコールを防ぎます。要約は次のとおりです(エラーチェックなし)。

scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
seccomp_arch_add(ctx, SCMP_ARCH_NATIVE);
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(socket), 1, SCMP_CMP(0, SCMP_CMP_EQ, pf));
seccomp_load(ctx);
execvp(argv[1], argv+1);

これにはルート権限は必要ありません。

ただし、完全なサンドボックスははるかに複雑なので、この非順序を使用して非協力的/悪意のあるプログラムをブロックしないでください。


これの使い方の例を教えていただけますか?動作するにはルート権限が必要ですか?
ボナンザ

-4

「proxychains」と呼ばれるコマンドラインプログラムを使用して、次の可能性のいずれかを試すことができます。

使用するようにセットアップします...

  • ...存在しないプロキシ?(「無効な」プロキシで実行するかどうかわかりません)
  • ...インターネットへのアクセスを制限するローカルプロキシ(「tinyproxy」、「squid」、「privoxy」など)(ACLを使用するだけ)

私はそれを自分でテストしていないので、それが機能するかどうかわかりません...


一般に、テストされていないソリューションを投稿することはお勧めできません。
トウィリム

(localhostのような:1234など)存在しないプロキシとproxychainsは実際にしかし、固体のアプローチであるかもしれない
phil294
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.