В настоящее время я должен sudo tcpflow -i lo
как пользователь root , я хочу предоставить интерфейс lo
и TCP port range 3000-3999 of all interfaces
для user1, как это сделать?
1 ответ
Вы должны быть суперпользователем, чтобы делать вид слежения, который делают 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
.