Можно ли заблокировать (исходящий) доступ к сети одного процесса?
linux
networking
process
iptables
larkee
источник
источник
localhost
к сети через (к тому же компьютеру) для выполнения своей работы.Ответы:
В Linux 2.6.24+ (считается экспериментальной до 2.6.29), вы можете использовать для этого сетевые пространства имен. Вам необходимо включить «сетевые пространства имен» в вашем ядре (
CONFIG_NET_NS=y
) и util-linux с помощьюunshare
инструмента.Затем запустить процесс без доступа к сети так же просто, как:
Это создает пустое пространство имен сети для процесса. То есть он запускается без сетевых интерфейсов, в том числе без обратной связи . В приведенном ниже примере мы добавляем -r для запуска программы только после того, как текущие действующие идентификаторы пользователей и групп были сопоставлены с суперпользователями (избегайте sudo):
Если вашему приложению нужен сетевой интерфейс, вы можете установить новый:
Обратите внимание, что это создаст новую локальную петлю. То есть порожденный процесс не сможет получить доступ к открытым портам хоста
127.0.0.1
.Если вам нужно получить доступ к исходной сети внутри пространства имен, вы можете использовать
nsenter
для входа в другое пространство имен.Следующий пример работает
ping
с сетевым пространством имен, которое используется PID 1 (указывается через-t 1
):источник
unshare -n
Кажется, бросить "Операция не разрешена" безroot
привилегий, что-то я пропустил об этом?sudo unshare -n
унаследовал права root. Поскольку мне нужен sudo для вызова unshare, мне интересно, как я могу убедиться, что вызываемая программа не имеет прав root.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240В Linux есть функция, называемая сетевыми пространствами имен, которая позволяет вам по существу иметь несколько сетевых стеков на одном компьютере и назначать один программе при ее запуске. Эта функция обычно используется для контейнеров, но вы также можете использовать ее для достижения желаемого.
В
ip netns
Подкоманды управлять им. Создать новое пространство имен сети без доступа к чему-либо легко, это состояние по умолчанию для нового пространства имен:Теперь, если вы переключитесь на это пространство имен, вы можете настроить его довольно легко. Вы, вероятно, захотите поднять в нем lo, вот и все:
Теперь, когда вы хотите запустить свою команду без сети, вы просто запускаете ее в этой тюрьме:
Сеть, по желанию, недоступна. (Вы можете делать разные интересные вещи, так как отдельный сетевой стек включает в себя
iptables
правила и т. Д.)источник
sudo ip
было выполнять команды ip, как только я попал в bash, я простоsu someuser
запустил, чтобы получить непривилегированную оболочку для пользователя 'someuser'.Вы можете использовать iptables и переместить этот процесс в cgroup:
источник
/sys/fs/cgroup/net_cls/tasks
(без 'block' в пути)Да, с настроенным профилем apparmor, т.е.
Но в этом случае вам также потребуется сгенерировать список разрешенных файлов для доступа, вся процедура может быть немного сложной. И см. Справочный документ здесь
источник
Вы можете использовать firejail sandbox (должен работать на ядрах с функцией seccomp).
Чтобы использовать это просто сделать
--noprofile
отключает песочницу по умолчанию--net=none
отключает сетьЯ верю, что большинство дистрибутивов уже предоставляют пакеты, но даже если они не имеют firejail, у них практически нет зависимостей, кроме сборки инструментария и ядра с включенным пространством имен / seccomp.
Есть некоторые другие приятные особенности firejail, которые могут быть показаны в
firejail --help
отношении работы в сети (например, только предоставление интерфейса обратной связи или блокировка ip / dns и т. Д.), Но это должно сработать. Кроме того, этоdoesn't require root
.источник
Вы не можете сделать это только с помощью iptables. Эта особенность существовала недолго , но ее нельзя было заставить работать надежно, и она была заброшена.
Если вы можете запустить процесс как выделенный идентификатор пользователя, iptables может сделать это с помощью
owner
модуля:Смотрите примеры в Iptables: сопоставление исходящего трафика с conntrack и владельцем. Работает со странным капель , IPTables / правило пФ только позволяют приложения XY / пользователь?
Если вы можете запустить процесс в своем собственном контейнере, вы можете запустить этот контейнер самостоятельно (даже сделать его полностью отключенным от сети).
Модуль безопасности может фильтровать доступ процесса к сетевым функциям. Ответ warl0ck дает пример с AppArmor.
источник
Решение 1: Брандмауэр:
Мы могли бы использовать межсетевые экраны , как Douane или Opensnitch НО эти приложения не являются 100% эффективными или на ранней стадии развития (есть много ошибок и т.д. , как в 2019 году)
Решение 2: MAC ядра:
Ядро MAC можно использовать в качестве брандмауэра. Наиболее известными из них являются Tomoyo , Selinux и Apparmor. Это решение является наилучшим, когда речь заходит о стабильности и эффективности (решение брандмауэра), но в большинстве случаев его настройка является несколько сложной.
Решение 3: Firejail:
Firejail можно использовать для блокировки доступа к сети для приложения, для которого не требуется root, любой пользователь может извлечь из этого пользу
Решение 4: Unshare
Unshare может запускать приложение в другом домене без сети, но для этого требуется, чтобы решение root firejail делало почти то же самое, но не требует root
Решение 5: Proxify:
Одним из решений является прокси приложения к пустому / поддельному прокси. Мы можем использовать tsocks или proxybound . Вот некоторые подробности о настройке
Решение 6: Iptables:
Другое простое решение - iptables, его можно настроить для блокировки приложения.
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Примечание: если вы изменяете уже существующего пользователя, вы должны запустить:
usermod -a -G no-internet userName
проверьте с помощью:sudo groups userName
nano /home/username/.local/bin/no-internet
chmod 755 /home/username/.local/bin/no-internet
#!/bin/bash
sg no-internet "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Примечание. Не забудьте сделать изменения постоянными, чтобы они автоматически применялись после перезагрузки . Это зависит от вашего дистрибутива Linux.
4. Проверьте это, например, в Firefox, запустив:
no-internet "firefox"
5. Если вы хотите сделать исключение и разрешить программе доступ к локальной сети :
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
6. Сделайте это постоянным
Один из способов применения правила iptables при загрузке - добавить правило как службу с помощью systemd.
источник
sg no-internet
сейчас.Это зависит от того, какой дистрибутив вы используете, но эта функция обычно включена в систему MAC ОС. Как указывалось ранее, Ubuntu или SuSE AppArmor могут это сделать. Если вы используете RHEL, вы можете настроить SELinux, чтобы разрешить или запретить доступ к определенному номеру порта на основе метки исполняемого процесса. Это все, что я смог найти после некоторого быстрого поиска в Google, но в Интернете, возможно, есть более глубокие ресурсы, если вы посмотрите более усердно, и это дает вам общее представление.
источник
Вы можете использовать seccomp-bpf, чтобы заблокировать некоторые системные вызовы. Например, может потребоваться заблокировать
socket
системный вызов для предотвращения процесса создания сокетов FD.Я написал пример этого подхода, который запрещает
socket
системному вызову работать с использованием libseccomp. Сводка (без проверки ошибок):Это не нуждается в привилегиях суперпользователя.
Однако полная песочница намного сложнее, поэтому вам не следует использовать этот приказ для блокировки неработоспособных / вредоносных программ.
источник
Вы можете использовать программу командной строки под названием «proxychains» и попробовать одну из следующих возможностей:
Настройте, что он использует ...
Я не проверял это сам, поэтому я не знаю, работает ли он ...
источник