2

В настоящее время я должен sudo tcpflow -i lo как пользователь root , я хочу предоставить интерфейс lo и TCP port range 3000-3999 of all interfaces для user1, как это сделать?

1 ответ1

2

Вы должны быть суперпользователем, чтобы делать вид слежения, который делают tcpflow и tcpdump. Так что вам нужно либо sudo либо setuid root-оболочка.

Ну, технически все, что вам нужно, это возможность CAP_NET_RAW . Если вы устанавливаете libcap2-bin bin¹, вы можете использовать команду setcap для создания оболочки «setcap- CAP_NET_RAW » вокруг tcpflow , а не оболочки setuid. Но это только помогает сделать дыру в безопасности в оболочке немного менее опасной (пользователь, который получает доступ CAP_NET_RAW может получить root без особых усилий).

Вы можете использовать sudo или оболочку root 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 и читать (хотя бы частично) /path/to/foo с root разрешения.

Я не думаю, что вы сможете прилично позволить пользователю указать выражение для сопоставления пакетов. Вместо того, чтобы давать дополнительные разрешения для запуска 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.

Other Для других дистрибутивов Linux: вам нужно ядро 2.6.24 или выше и команда setcap .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .