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.
以下はいくつかの関連質問です。
- iptables – rootとしてルールを追加しないでください (根)
- root権限なしでiptablesを使用する (サーバー障害)
私の考えは両方とも解決策を提供しますが、制限の背後に隠れた根本的な理由については議論しません。
答え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
実際、iptables
netlinkインタフェースはカーネルとの通信に使用されます。 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_RAW
CAP_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を子プロセスとして実行する場合は、その子プロセスに必要な機能を渡す必要があります。