プロセスの開始前にプロセスの pid を取得する方法があるとしたら、聞いたことがない.
PID は exec(3) 呼び出しによって変更されないため、最初にフォークし、次にルールを追加してプロセスを実行するラッパーを作成できます (実行中のプログラムが再びフォークしないと仮定します)。
/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
/* Eat argv[0] the name of the wrapper script */
argv++;
argc--;
pid_t my_pid = getpid();
char *iptables_cmd = NULL;
asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);
system(iptables_cmd);
execv(argv[0], argv);
}
@Bgs の回答に基づいて、次のようにします。
<オール>snitch
sudo addgroup --system snitch
- そのグループに自分自身を追加して、プライマリ グループが設定されたプロセスを実行する際にパスワードを要求されないようにします。
sudo adduser $USER snitch
- IPv4 と IPv6 を追加 そのグループに属するプロセスによって生成されたパケットをログに記録して拒否するルール:
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j REJECT
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j REJECT
- カーネル メッセージのテール ウォッチを開きます:
dmesg -w
sg
を使用してターゲット プロセスを起動します またはその他の同様の手段:
sg snitch 'your target program'
-m owner --pid-owner PID
http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html および http://linux.die.net/man/8/iptables を参照してください
--pid-owner は xt_owner ではサポートされていないため、ipt_owner モジュールが必要であることに注意してください。
例 (これは概算です)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
ただし、実際には --uid-owner と --gid-owner を使用したほうがよいでしょう。まず、 --pid-owner 基準は正確な pid にのみ一致します。つまり、プログラムは、このルールによってブロックされない子プロセスを簡単に生成できます。 (少なくとも私はそれ以外を読んだことはありません。) 第二に、iptables(8) は --pid-owner が SMP システムで壊れていることを警告します (これはあなたに当てはまるかもしれないし、当てはまらないかもしれませんが、どちらの場合も移植性を制限します)。第 3 に、プロセスがブロックされる前に開始されるため、上記のスクリプトには競合状態があります。 (プロセスの開始前にプロセスの pid を取得する方法がある場合、私はそれについて聞いたことがありません。)
所有者のようです iptables モジュールが必要です。まず、システムで利用できるかどうかを確認してください:
iptables -m owner --help
ここで詳細を読むことができます:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH