root以外のユーザーとしてiptablesを一覧表示できますか?なぜ?

root以外のユーザーとしてiptablesを一覧表示できますか?なぜ?

iptables --list … root権限なしでこのコマンドを実行できますか?

root以外のユーザーとして実行すると、次のものが印刷されます。

$ iptables --list
iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

iptablesをリストするためにルートでなければならないのはなぜですか?セキュリティ問題に関するルールを確認しますか?iptables --list ルートアクセスが必要なリソースやサービスがありますか?

明らかにiptablesファイアウォールルールを変更するには権限が必要です。視聴してもいいか聞きたいです。


ルールを一覧表示できるルート以外の機能はありますか? iptablesはnetlinkを使用してカーネルと対話しますか?なぜならウェブリンク(7)話す

有効なUIDのみ0または CAP_NET_ADMIN Netlinkマルチキャストグループを送受信する機能。

たぶんこれはiptablesでは動作しないかもしれません。

これが正しいアプローチであるかどうかはわかりませんが、関数を追加してもルールを一覧  iptables 表示することはできません。

bash-4.1$ echo $UID
2000
bash-4.1$ getcap /sbin/iptables-multi-1.4.7
/sbin/iptables-multi-1.4.7 = cap_net_admin+ep
bash-4.1$ /sbin/iptables-multi-1.4.7 main --list
FATAL: Could not load /lib/modules/3.10.0-514.21.1.el7.x86_64/modules.dep: No such file or directory
iptables v1.4.7: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded. 

以下はいくつかの関連質問です。

私の考えは両方とも解決策を提供しますが、制限の背後に隠れた根本的な理由については議論しません。

答え1

iptablesテーブルを読み取るにはCAP_NET_RAWとCAP_NET_ADMINが必要です。頑張った

$ cp /usr/sbin/iptables ~/iptables  # note, it may be a symbolic link
$ sudo setcap CAP_NET_RAW,CAP_NET_ADMIN+ep  ~/iptables
$ ~/iptables  -nvL

それは問題ではありません。

答え2

実際、iptablesnetlinkインタフェースはカーネルとの通信に使用されます。 netlinkソケットを開き、ソケットを介してxtablesコマンドを実行します。個々のコマンドではなくソケットが開かれたときにアクセス制御が実行されるため、ルールをリストして変更するには同じ権限が必要です。ユーザーがルールを一覧表示できますが、変更しないようにする唯一の方法は、よく書かれたsetuid(またはsetcap)実行可能ファイルを提供することです。

netfilterへのインタフェースがあればいいのですが/proc、私が知る限りこれを実装する作業は完了しませんでした。

答え3

これが私がしたことです:

$ cat iptables-list.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    if (setuid(0) != 0)
    {
        perror("setuid");
        return EXIT_FAILURE;
    }
    execl("/sbin/iptables", "iptables", "-L", "-n", NULL);
    perror("execl");
}
$ gcc -Wall -Werror -o iptables-list -s iptables-list.c
$ sudo mv iptables-list /sbin/iptables-list
$ sudo chown 0.0 /sbin/iptables-list
$ sudo chmod 4755 /sbin/iptables-list
$ ls -l /sbin/iptables-list
-rwsr-xr-x 1 root root 5552 Feb 23 08:14 /sbin/iptables-list
$ iptables-list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
...

答え4

Ubuntu 20.04.5 LTS Focalでは設定してCAP_DAC_READ_SEARCH動作する必要があります。CAP_NET_RAWCAP_NET_ADMIN

CAP_NET_RAW合計のみを設定すると、次CAP_NET_ADMINのエラーが表示されます。

Fatal: can't open lock file /run/xtables.lock: Permission denied

どのように動作するかを見てみましょう。

$ sudo cp /usr/sbin/ip6tables ~/ip6tables

$ sudo setcap cap_net_admin,cap_net_raw+ep ./ip6tables # not enough caps
$ ./ip6tables -nvL
Fatal: can't open lock file /run/xtables.lock: Permission denied

# CAP_NET_RAW + CAP_NET_ADMIN + CAP_DAC_READ_SEARCH capabilities
$ sudo setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep ./ip6tables 
$ ./ip6tables -nvL # works fine
Chain INPUT (policy ACCEPT 1813K packets, 4509M bytes)
=== /// ===

また、プログラムを実行してip6tablesを子プロセスとして実行する場合は、その子プロセスに必要な機能を渡す必要があります。

Golangについては、以下を参照してください。今回の広報そしてこのコード

関連情報