Блокировать доступ к сети процесса?

Обычно эта информация не хранится - и если это, это собирается зависеть очень, на какой системе Вы используете.

Мы можем вывести из Вашего желаемого вывода, что Вы используете подобную Unix систему. Unix сохраняет три метки времени для каждого файла: mtime, ctime, и atime, которые являются временем последнего изменения, время inode, был последний раз изменен, и прошлое время доступа. Никакая более глубокая история не сохранена ни для одного из них.

Программа, которую Вы используете для изменения файла, могла бы хранить такую информацию, но это зависит от того, что Вы используете.

Если Вы хотите отслеживать такие вещи, Вы, вероятно, хотите использовать систему управления исходным кодом. Много их доступны: RCS, CVS, Подверсия (SVN), Мерзавец, Подвижный (Hg), и многие другие. Необходимо будет явно зарегистрироваться файле (файлах) после изменения их для модификаций, которые будут прослежены. Такая система также позволит Вам получить и сравнить более старые версии.

75
28.03.2013, 03:21
11 ответов

С Linux 2.6.24 + (рассмотренный экспериментальным до 2.6.29), можно использовать сетевые пространства имен для этого. У Вас должны быть 'сетевые пространства имен', включил в Вашем ядре (CONFIG_NET_NS=y) и util-linux с unshare инструмент.

Затем запуск процесса без доступа к сети так же прост как:

unshare -n program ...

Это создает пустое сетевое пространство имен для процесса. Таким образом, это выполняется без сетевых интерфейсов, включая никакую обратную петлю. В ниже примера мы добавляем-r для запущения программы только после текущего эффективного пользователя, и идентификаторы группы были отображены на суперпользователя (избегайте sudo):

$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable

Если для Вашего приложения нужен сетевой интерфейс, можно настроить новый:

$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms

Обратите внимание, что это создаст новую, локальную обратную петлю. Таким образом, порожденный процесс не сможет получить доступ к открытым портам хоста 127.0.0.1.


Если необходимо получить доступ к исходным сетям в пространстве имен, можно использовать nsenter ввести другое пространство имен.

Следующие выполнения в качестве примера ping с сетевым пространством имен, которое используется PID 1 (это указано через -t 1):

$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms

--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms
80
27.01.2020, 19:31
  • 1
    unshare -n кажется, бросает "Операцию, не разрешенную" без root полномочия, что-нибудь я отсутствующий об этом? –  baldrs 30.12.2013, 23:42
  • 2
    , Возможно, глупый вопрос... это пространство имен также относится к дочерним процессам / названный процессами неразделенного приложения? –  bonanza 27.01.2015, 22:50
  • 3
    Да. Это наследовано всеми детьми, порожденными после переключения пространства имен. –  Michał Górny 28.01.2015, 07:00
  • 4
    I похож на любую программу, с которой я хотел бы не совместно использовать, например, sudo unshare -n наследовал корневое право. Поскольку мне нужен sudo для вызова недоли, я задаюсь вопросом, как я могу удостовериться, что названная программа не имеет корневых прав. –  bonanza 15.05.2015, 18:25
  • 5
    Один лайнер для ограничения процесса пользователем. Просто sudo дважды: sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER' @ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240 –  Jakub Bochenski 10.10.2017, 23:33

Да, со специализированным профилем apparmor, т.е.

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

Но таким образом, необходимо будет генерировать список позволенных файлов к доступу также, целая процедура может быть немного сложным. И см. документ справки здесь

10
27.01.2020, 19:31

Вы не можете сделать этого с одним только iptables. Эта функция кратко существовала, но не могла быть сделана работать надежно и отказалась.

Если можно выполнить процесс, поскольку специализированный идентификатор пользователя, iptables может сделать это с owner модуль:

iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP

Посмотрите примеры в Iptables: соответствие исходящему трафику с conntrack и владельцем. Работы со странными отбрасываниями, iptables/pf управляют, чтобы только позволить приложение/пользователя XY?

Если можно выполнить процесс в его собственном контейнере, Вы можете брандмауэр, что контейнер независимо (даже делают его полностью отключенным от сети).

Модуль безопасности может отфильтровать доступ процесса к сетевым функциям. ответ warl0ck дает пример с AppArmor.

5
27.01.2020, 19:31

Это зависит, на каком дистрибутиве Вы используете, но это - функция, обычно включаемая в систему MAC ОС. Как указано ранее Ubuntu или AppArmor SuSE могут сделать это. При использовании RHEL, можно настроить SELinux, чтобы или позволить или запретить доступа к конкретному номеру порта на основе маркировки процесса выполнения. Это - все, что я мог найти после некоторого быстрого поиска с помощью Google, но существуют, вероятно, больше подробно ресурсы онлайн, если Вы выглядите более твердыми, и он дает Вам общее представление.

2
27.01.2020, 19:31

Вы можете использовать iptables и переместить этот процесс в cgroup:

mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid

iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP

echo [pid] > /sys/fs/cgroup/net_cls/block/tasks
13
27.01.2020, 19:31

Вы можете использовать программу командной строки под названием «proxychains» и попробовать одно из следующих возможности:

Настроить, чтобы он использовал ...

  • ... прокси, которого не существует? (Я не знаю, запустится ли он с «недействительным» прокси)
  • ... локальный прокси (например, tinyproxy, squid, privoxy, ...), который ограничивает доступ к Интернету. ? (Просто используйте ACL)

Я сам не тестировал, поэтому не знаю, работает ли он ...

-4
27.01.2020, 19:31

Я думаю, что вы ищете команду udevadm . Параметры trigger и test используются для запуска повторного сканирования событий udev и тестирования конкретного события соответственно.

Я усвоил это трудный способ при использовании нового имени сетевого устройства в EL 7. Удачи!

-121--29338-

Установив shell =/usr/bin/zsh\-l в .vimrc решил мою проблему

Примечание:

Я использую: linux mint 17,1

-121--37302-

Linux имеет функцию, называемую сетевыми пространствами имен , которая позволяет по существу иметь несколько сетевых стеков на одной машине и назначать их программе при ее запуске. Эта функция обычно используется для контейнеров, но ее также можно использовать для достижения желаемого.

Подкоманды ip netns управляют им. Создать новое сетевое пространство имен без доступа к чему-либо просто, это состояние по умолчанию нового пространства имен:

root@host:~# ip netns add jail

Теперь, если вы переключитесь в это пространство имен, вы можете настроить его довольно легко. Вы, вероятно, захотите включить в него lo, и все:

root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit

Теперь, когда вы хотите выполнить свою команду без сети, вы просто запустите ее в этой тюрьме:

root@host:~# ip netns exec jail su user -c 'ping  8.8.8.8'
connect: Network is unreachable

Сеть, по желанию, недостижима. (Вы можете делать все интересные вещи, как отдельный сетевой стек включает в себя iptables правил и т.д.)

22
27.01.2020, 19:31

Вы можете использовать firejail sandbox (должен работать на ядрах с функцией seccomp).

Чтобы использовать его, просто сделайте

firejail --noprofile --net=none <path to executable>

--noprofile отключает песочницу по умолчанию --net=none отключает работу в сети

Я полагаю, что большинство дистрибутивов уже предоставляют пакет, но даже если это не так, у firejail практически нет зависимостей, кроме инструментария сборки и ядра с поддержкой namespace/seccomp.

Есть и другие возможности firejail, которые можно показать с помощью firejail --help в отношении работы с сетью (например, предоставление только loopback интерфейса или блокировка ip/dns и т.д.), но этого должно хватить. Кроме того, для этого не требуется root.

10
20.08.2021, 13:14

Вы можете использовать seccomp-bpf для блокировки некоторых системных вызовов. Например, может потребоваться заблокировать системный вызов socket , чтобы предотвратить создание сокетов FD процессом.

Я написал пример этого подхода, который не позволяет системному вызову socket работать с использованием libseccomp. Резюме (без проверки ошибок):

scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
seccomp_arch_add(ctx, SCMP_ARCH_NATIVE);
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(socket), 1, SCMP_CMP(0, SCMP_CMP_EQ, pf));
seccomp_load(ctx);
execvp(argv[1], argv+1);

Для этого не нужны привилегии root.

Полная песочница намного сложнее, поэтому вам не следует использовать этот un order для блокировки не взаимодействующих / вредоносных программ.

2
20.08.2021, 13:14

Решение 1 :Брандмауэр:

Мы могли бы использовать такие брандмауэры, как Douane или Opensnitch , НО эти приложения не на 100% эффективны или находятся на ранней стадии разработки (имеют много ошибок и т. д. на момент 2019)

Решение 2 :MAC-адрес ядра:

В качестве брандмауэра можно использовать MAC-адреса ядра, наиболее известными из которых являются Tomoyo , Selinux и Apparmor . Это решение является лучшим, когда речь идет о стабильности и эффективности (решения для брандмауэра ), но в большинстве случаев его настройка несколько сложна.

Решение 3 :Пожарная тюрьма:

Firejail можно использовать для блокировки доступа к сети для приложения, для которого не требуется root, любой пользователь может воспользоваться этим

firejail --noprofile --net=none command-application

Решение 4 :Отменить общий доступ

Unshare может запускать приложение в другой области имен без сети, но для этого требуется решение root firejail, которое делает почти то же самое, но не требует root

unshare -r -n application-comand

Решение 5 :Proxify:

Одним из решений является проксирование приложения на нулевой/фальшивый прокси. Мы можем использовать tsocks или proxybound . Вот некоторые подробности о настройке

Решение 6 :Iptables:

Другим простым решением является iptables, его можно настроить для блокировки приложения

  1. Создать, подтвердить новую группу ;добавить необходимых пользователей в эту группу :
    • Создать:groupadd no-internet
    • Подтвердить:grep no-internet /etc/group
    • Добавить пользователя:useradd -g no-internet username

      Примечание. :Если вы изменяете уже существующего пользователя, вам следует запустить:usermod -a -G no-internet userNameпроверьте с помощью:sudo groups userName

  2. Создайте скрипт в своем пути и сделайте его исполняемым :
    • Создать:nano /home/username/.local/bin/no-internet
    • Исполняемый файл:chmod 755 /home/username/.local/bin/no-internet
    • Содержание:#!/bin/bash
      sg no-internet "$@"

  3. Добавить правило iptables для отключения сетевой активности для группы без -интернета:


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

cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh
10
20.08.2021, 13:14

Начиная с Systemd v235 есть еще один очень простой вариант:

Учет IP-адресов и списки доступа с помощью systemd

TL;DR: systemd now can do per-service IP traffic accounting, as well as access control for IP address ranges.

1
20.08.2021, 13:14

Теги

Похожие вопросы