Rootにならずにiptables --list ….
コマンドを実行することはまったく可能ですか?
非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.
Rootでiptablesをリストする必要がある場合、その背後にある理由は何ですか?ルールの表示にセキュリティ上の懸念はありますか? rootアクセスを必要とするiptables --list
が使用するリソースまたはサービスはありますか?
明らかに、iptablesファイアウォールルールを変更するには、特権ユーザーが必要です。ご覧いただきたいと思います。
Rootになる代わりに、ルールのリストを許可できる機能はありますか? iptablesはカーネルとのインターフェースにnetlinkを使用しますか? netlink documentation は、
実効UIDが0のプロセスまたはCAP_NET_ADMIN機能を持つプロセスのみが、ネットリンクマルチキャストグループを送信またはリッスンできます。
多分それは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.
関連する質問 q1 および q2 をいくつか示します。どちらも私の考えでは回避策を提供しており、その背後にある根本的な理由については触れていません。
実際、iptables
はnetlinkインターフェイスを使用してカーネルと通信します。 xtables
へのnetlinkソケットを開き、このソケットを介してコマンドを発行します。アクセス制御は、個々のコマンドではなくソケットが開かれたときに実行されるため、ルールの一覧表示と変更には同じアクセス許可が必要です。ユーザーがルールをリストできるが変更はできないようにする唯一の方法は、慎重に記述されたsetuid(またはsetcap)実行可能ファイルを与えることです。
/proc
にnetfilterへのインターフェイスがあればいいのですが、私が知る限り、それを実装するタスクは完了していません。
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
そしてそれは大丈夫でした。