iptables
私のUbuntu 16.04ノートブックでは、デフォルトですべてのアプリケーションへのインターネットアクセスを拒否し、名前付きグループのみを許可するようにルールを設定しようとしていますinternet
。代わりにグループを使用またはsudo -g
アクセスします。必要に応じてインターネットsg
。たとえば、
sudo -g internet firefox
または
sg internet -c "firefox"
しかし、このアプローチは効果がありませんでした。iptables
私が追加したルールは次のとおりです。
/sbin/iptables -A OUTPUT -p tcp --dport 80 -m owner --gid-owner internet -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443 -m owner --gid-owner internet -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53 -m owner --gid-owner internet -j ACCEPT
上記のルールをテストしましたが、所有者モジュールを削除すると正常に動作し、すべてのアプリでインターネットを許可します。ただし、所有者モジュールとgid-owner
フィルタを追加すると、どのアプリケーションもインターネットにアクセスできなくなります(上記とsg
コマンドsudo -g
を使用しても)。
私は何が間違っていましたか?
答え1
すでに解決されているとマークされていますが、この問題を経験している他の人々の健全な精神のために、ここで詳しく説明し、発見した問題の実際の原因を説明する必要があると思いました。問題はiptables。特に、人間が期待する方法でグループIDフィルタリングを処理しません。これがWADかバグかはわかりません。 IMHOこれは間違いですiptables -m owner
拡張コード。
問題は処理にあります--gid-owner
。そうだiptables 拡張コードはグループIDを文字通りフィルタリングしません(つまり、グループのユーザーはYesまたはNoです)。モジュールの動作を見ると、より深く掘り下げてユーザー名の設定を調べて、ユーザーの基本グループメンバーシップに基づいて決定を下すことが明らかです。これは、グループのメンバーリストを文字通りに確認するのとは異なります(自分自身とこの問題を経験した他の人が期待するもの)。この動作は関連するマニュアルページに文書化されていません。
つまり、Ubuntuのiptables実装は確認だけです。メイングループ現在のネットワークパケットの所有者です。特定のユーザーグループが使用される分割VPNを作成するとします。VPNトラフィックをVPNインターフェイスに強制します。
所有者固有を指定すると、拡張の下のパラメータは--uid-owner
期待-m owner
どおりに機能します。次に、分岐したいユーザー名が複数あり、時間の経過とともにユーザーリストが変更される可能性があるとします。したがって、グループIDフィルタリングを使用する方が効率的であると判断します(--gid-owner
)。すべてのVPNトラフィックユーザーVPNiptablesパラメータを--gid-owner vpn
。ご覧のとおり、多くの場合、フィルタは期待どおりに機能しません。なぜ?
パケット所有者の基本/基本グループのみが比較されます。したがって、あなたが追加したすべてのユーザー名はVPNユーザーが作成された後、グループは次の場所になります。VPNセカンダリユーザーとしてグループ化グループに属していても分岐しません!
「root」ユーザーが機能しない理由は、デフォルト/基本グループが「root」であるためです。
例えば
ユーザー名があると仮定VPNジュニアグループでVPNとユーザー名テストダミージュニアグループでテストしかし、テストダミーやはりその組織の一員VPNグループ。到着テストダミー、VPNマイナーグループだ。
このiptablesルールはVPNユーザーではありませんが、テストダミー両方のユーザーがグループに属しているため、両方のユーザーのパケットがタグ付けされると本能的に考える場合も同様です。VPN:
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
問題を解決するには、次の回避策などの他のルールを作成する必要があります。
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --uid-owner testdummy -j MARK --set-mark 0x1
答え2
多くの試行錯誤の後、私は私の質問に対する答えを見つけました。問題は、iptablesや私が使用しているUbuntu / Linuxのバージョンではなく、3番目の規則にあります。
/sbin/iptables -A OUTPUT -p udp --dport 53 -m owner --gid-owner internet -j ACCEPT
udp/53
ポートはDNS名前解決に使用されるため、バックグラウンドdnsmasq
サービスで使用できるため、そのグループでプログラムを実行しようとすると、そのグループinternet
に他のサービスがないため、名前解決は行われません。しかし、理想的には、これらのサービスはrootアカウントで実行されるため(そしてrootは何でもできます!)、まだポートにアクセスできるはずですが、iptables所有者モジュールの設計はこのroot権限を尊重しないようです。
最後のルールで所有者モジュールのチェックを削除すると、インターネットが機能し始めました。
/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
編集する
直接接続されていませんが、関連する質問はルートグループの所有者モジュールを使用することです。次のように、ルートグループにインターネットへのアクセス権を割り当てる傾向があります(グループinternet
に追加またはグループの代わりに)。
/sbin/iptables -A OUTPUT -p tcp --dport 80 -m owner --gid-owner root -j ACCEPT
ただし、多くのアプリケーションがセキュリティ上の理由からrootユーザーを使用してインターネットに接続しないため、実際には機能しません。たとえば、上記の操作を実行した後でも、次のコマンドは機能しません。
sudo apt-get update
これは、セキュリティ上の理由から、apt
プログラムが内部的にユーザーがダウンロードしたパッケージを使用するためです。_apt
答え3
これに使用できます--suppl-groups
。EA6CC2FD。 ~からiptables-extensions(8)
:
--suppl-groups
Causes group(s) specified with --gid-owner to be also checked in
the supplementary groups of a process.
また、見ることができますiptablesグループの一致:ユーザーのデフォルトグループを変更する
答え4
/sbin/iptables -A OUTPUT -p tcp --dport 80 -m owner ! --gid-owner root -j DROP