web-dev-qa-db-ja.com

ネットワークインターフェイスでアクセス許可を付与するにはどうすればよいですか?

現在、私はSudo tcpflow -i lorootユーザーとして使用する必要があります。loインターフェースとTCP port range 3000-3999 of all interfacesをuser1に付与したいのですが、どうすればよいですか?

2
Xiè Jìléi

Tcpflowやtcpdumpが行うようなスヌーピングを行うには、rootである必要があります。したがって、Sudoまたはsetuidルートラッパーが必要です。

技術的には、_CAP_NET_RAW_機能が必要です。 _libcap2-bin_ package¹をインストールする場合は、setcapコマンドを使用して、tcpflowの周りに「setcap -_CAP_NET_RAW_」ラッパーを作成できます。 setuidラッパーではなく。しかし、それはラッパーのセキュリティホールの損傷を少し少なくするのに役立つだけです(_CAP_NET_RAW_アクセスを取得したユーザーはおそらく少しの努力でrootを取得できます)。

Sudoまたはsetuidルートラッパーを使用して、user1にtcpflow -i eth0 tcp and \( src Host 1.2.3.4 and src port 3000 or dst Host 1.2.3.4 and src port 3000 \)のようなコマンドを実行させることができます。 user1に任意のtcpflowコマンドを実行させることはできないことに注意してください。これにより、user1は_tcpflow -r … -r /path/to/foo_のようなものを実行し、root権限で_/path/to/foo_を(少なくとも部分的に)読み取ることができます。

ユーザーがパケットに一致する式を指定できるようにすることは、きちんとできないと思います。 tcpflowを実行するための追加のアクセス許可を与えるのではなく、固定のtcpdumpコマンドを実行するための追加のアクセス許可を与えることをお勧めします(stdoutに書き込み、必要に応じてユーザーがファイルにリダイレクトできるようにします)。次に、ユーザーは_tcpflow -r_を実行して、tcpdump出力を分析できます(リアルタイムでも、パイプを介して)。

ここで、loについて、user1がこの正確なコマンドを実行できるようにします。

_tcpdump -i lo tcp
_

他のインターフェイスの場合、次のコマンドはtcpポート3000〜3999を選択すると思います(ただし、確実に広範なテストを行います)。

_tcpdump -i eth0 tcp and \( \
  \( src Host 1.2.3.4 and 'tcp[0:2] >= 3000' and 'tcp[0:2] <= 3999' \) or
  \( dst Host 1.2.3.4 and 'tcp[2:2] >= 3000' and 'tcp[2:2] <= 3999' \) \)
_

1.2.3.4をインターフェースに関連付けられたIPアドレスに置き換えます。 IPアドレスが固定されていない場合、提供できる適切なソリューションはありません。ifconfig出力から読み取るか、ラッパースクリプトの先頭で読み取ると、競合状態になります。

ラッパーの推奨事項は、シェルスクリプト(Debianのシェルのいずれかがsetuidスクリプトの記述に適しているかどうかはわかりません。シェルは多くの環境変数を使用する傾向があります)ではなく、Perl(この種の場合)を使用することです。このように、明示的にサポートされています)。

_#!/usr/bin/Perl -T
exec '/usr/sbin/tmpdump', '-i', 'lo', 'tcp'
_

スクリプトを通常の実行可能ファイル(モード755)にし、user1がSudoを介してスクリプトを実行できるようにします。

¹ 他のLinuxディストリビューションの場合:カーネル2.6.24以降とsetcapコマンドが必要です。