GNU/Linux >> Linux の 問題 >  >> Linux

プロセス/サービスごとに iptables ルールを作成する

<ブロック引用>

プロセスの開始前にプロセスの 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
    
    1. そのグループに自分自身を追加して、プライマリ グループが設定されたプロセスを実行する際にパスワードを要求されないようにします。
    sudo adduser $USER snitch
    
    1. 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
    
    1. カーネル メッセージのテール ウォッチを開きます:
    dmesg -w
    
    1. 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


    Linux
    1. 方法:Linux General –一般的なIPTables

    2. Linux OS サービス「iptables」

    3. Linux のプロセスあたりの最大スレッド数は?

    1. PHPスクリプトをデーモンプロセスとして実行

    2. プロセスごとに設定可能なコア ダンプ ディレクトリ

    3. プロセスごとに開いているファイルをカウントする

    1. プロセスが常に実行されていることを確認しますか?

    2. ゾンビプロセスの作成

    3. CentOS 7 で postgresql サービスを開始できません