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