it-swarm-ja.com

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

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

77
larkee

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

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

unshare -n program ...

これにより、プロセスの空のネットワーク名前空間が作成されます。つまり、no loopbackを含むネットワークインターフェイスなしで実行されます。以下の例では、-rを追加して、現在の有効なユーザーIDとグループIDがスーパーユーザーIDにマップされた後でのみプログラムを実行します(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

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


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

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

$ 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
83
Michał Górny

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

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

[email protected]:~# ip netns add jail

これで、その名前空間に切り替えると、かなり簡単に構成できます。あなたはおそらくそれを育てたいと思うでしょう、そしてそれだけです:

[email protected]:~# ip netns exec jail /bin/bash
[email protected]:~# ip addr add 127.0.0.1/8 dev lo
[email protected]:~# ip link set dev lo up
[email protected]:~# exit

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

[email protected]:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

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

24
derobert

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
15
Jan Mueller

はい、カスタマイズされたapparmorプロファイル、つまり

/usr/bin/curl {
    ...

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

}

ただし、そのようにすると、アクセスを許可するファイルのリストも生成する必要があり、手順全体が少し複雑になる可能性があります。そして こちらのヘルプドキュメントを参照

10
daisy

firejail sandbox を使用できます(seccomp機能を備えたカーネルで動作するはずです)。

使うには

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

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

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

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

7
pruzinat

Iptablesだけではできません。この機能 一時的に存在した ですが、確実に機能させることができず、放棄されました。

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

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

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

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

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

ソリューション1:ファイアウォール:

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

ソリューション2:カーネルMAC:

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

ソリューション3:Firejail:

Firejail は、アプリケーションのネットワークアクセスをブロックするために使用できます。これはrootを必要としません

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

ソリューション4:共有解除

Unshareは、ネットワークがなくても別の名前空間でアプリケーションを起動できますが、これにはルートFireJailのソリューションがほぼ同じである必要がありますが、ルートは必要ありません

unshare -r -n application-comand

ソリューション5:Proxify:

1つの解決策は、アプリケーションをnull/fakeプロキシにプロキシ化することです。 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 確認する : Sudo groups userName

  2. パスにscriptを作成し、実行可能にします:
    • 作成:nano /home/username/.local/bin/no-internet
    • 実行可能ファイル:chmod 755 /home/username/.local/bin/no-internet
    • コンテンツ:#!/bin/bash
      sg no-internet "[email protected]"

  3. グループのネットワークアクティビティを削除するためのiptablesルールを追加no-internet
    • 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
4
intika

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

2
Bratchley

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

Libseccompを使用して動作するsocketシステムコールを妨げるこのapprocahの example を書きました。概要は(エラーチェックなし)です。

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);

これにはroot権限は必要ありません。

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

2
ysdx

Systemd v235以降、別の非常に簡単なオプションもあります:

systemdを使用したIPアカウンティングとアクセスリスト

TL; DR:systemdは、サービスごとのIPトラフィックアカウンティング、およびIPアドレス範囲のアクセス制御を実行できるようになりました。

0
Marco Gamberoni