Убунтариум

индекс
253,47

Ограничение доступа в интернет для приложений в Linux

Иногда бывает необходимо запустить программу, предварительно заблокировав для неё доступ в интернет. Существует довольно простой трюк для решения этой задачи.

Итак, идея заключается в том, чтобы при запуске приложения устанавливать особый ID группы, который будет сигналом блокировки доступа для netfilter.

Шаг 1. Создаём группу-маркер и добавляем себя в неё


Создаём группу (В нашем случае группа будет называться noinet):
sudo groupadd noinet

Добавляем в неё текущего пользователя:
sudo gpasswd -a `id -un` noinet


Шаг 2. Создаём правило для iptables, которое будет выполняться перед каждым подъёмом сетевого интерфейса


Создадим файл в директории /etc/network/if-pre-up.d
sudo vim /etc/network/if-pre-up.d/inet_access_blocking_rule

со следующим содержимым:
#!/bin/bash
iptables -A OUTPUT -m owner --gid-owner noinet -j DROP

Не забываем сделать его исполняемым:
sudo chmod +x /etc/network/if-pre-up.d/inet_access_blocking_rule

Шаг 3. Создаём скрипт запуска, устанавливающий группу-признак


Разместим скрипт в /usr/local/bin
sudo vim /usr/local/bin/noinet

Содержимое скрипта несложное:
#!/bin/bash
sg noinet "$*"

Опять же, не забываем сделать его исполняемым
sudo chmod +x /usr/local/bin/noinet

Шаг 4. Перезагрузка системы


Наверняка это можно сделать проще, но в случае с karmic out-of-box ситуация выглядит следующим образом:

sudo service networking restart сообщает:
restart: Unknown instance:

sudo initctl restart networking сообщает:
initctl: Unknown instance:

sudo invoke-rc.d networking restart сообщает:
Ignoring unknown interface eth0=eth0

К тому же, чтобы добавление пользователя в группу вступило в силу вам придётся перелогиниться (это как минимум перезапуск DE — sudo restart gdm).
В общем, если вы просто перезагрузитесь, то все настройки выполнены и вступили в силу.

Использование


Использование простое:
noinet ping habrahabr.ru
noinet firefox

Хардкорные линуксоиды шаг 3 могут опустить и использовать всё это так :)
sg noinet "ping habrahabr.ru"
sg noinet "firefox"
+69
3 февраля 2010, 01:10
92

комментарии (34)

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
–16
miver #
Спасибо!
–15
Mzybin #
хаха) впечатляет. Спасибо!!!
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+4
el777 #
Меняете правило фаервола наоборот — чтобы оно разрешало доступ, а по умолчанию ставите запрет.
–2
iiihyp #
man iptables
+3
AVI #
Модифицировать описанный метод, сделать правило ACCEPT для группы welcome2inet, все остальное DROP'ать.
+6
urandom #
Какое то убожество. man selinux, срочно.
+3
AgaFonOff #
apparmor?
0
igorp1024 #
Вопрос (не наезд): apparmor сумеет применять разные правила для одного бинарника? Например, есть несколько приложений на VM (например, на той же java). Бинарник — один. Получится ли как-то контролировать разные приложения? Можно, в принципе, насоздавать симлинков на бинарник виртуальной машины (по одному для каждого приложения), но, имхо, неудобно.
0
AgaFonOff #
Вообще не в курсе. Я только понимаю, что это две разные реализации примерно одного и того-же.
Но в моей жизни использовать осознанно не приходилось. Более того, selinux мне местами попортил настроение.
Наверное, всё это где-то надо и важно, но мои linux use cases не затрагивают…
+3
otaqsun #
Selinux не лучший вариант.
Из-за особенностей работы, бывают проблемы с принтерами и сканерами например. В общем много подводных камней.
+1
mdevils #
Для рестарта сети лучше использовать "/etc/init.d/networking restart".
0
salvator #
вещь хорошая конечно, а вот как сделать policy based routing по группам? на сколько я помню, метки ставить и одновременно проверять группу не получается в iptables. а очень хочется торренты завернуть мимо vpn соединения
–25
egorinsk #
Фу, а зачем извращаться с группами и юзерами, нельзя просто по дефолту всем запретить выход в сеть, а избранным приложениям разрешить? А, это же Линукс :) тут нет простых путей)
–2
rdolgov #
во фряшном ipfw возможно сделать правила для опеделенных uid, gid, думаю что iptables не уступает ему в функциональности, т.ч. гляньте в эту сторону в man iptables.
+3
GreyCat #
Он вообще-то ровно это и предлагает — это правило для iptables по определенному gid:

iptables -A OUTPUT -m owner --gid-owner noinet -j DROP
0
rdolgov #
млин, втупил, извиняюсь ;)
–4
medvedy #
Спасибо!!! возьму на заметку!
0
amIwho #
А я просто шнур выдираю, а потом настраиваю прогу чтобы не лезла куда не надо… Я что-то не так делаю?
0
CTpaHHoe #
браво, самый простой способ для десктопа.
однако «не так» начинается, когда ваша машина стоит где-то очень далеко от вас
0
NastyIII #
Вообще-то играть с itables на удаленной машине чревато. Достаточно одного неверного символа и приходиться сделать так, чтобы машина стала от вас близко. (если некому перегрузить). Сам наступил на эти грабли. Выход нашел в сбросе всех правил на дофолтовые по крону каждые 15 мин.
0
NastyIII #
И не забыть убрать или не удивляться
0
el777 #
Я думаю любой админ через это проходит :)
Это нормально.
Я обычно делаю первым правилом разрешение себе на доступ по ssh — так безопаснее играться. Ну и проверить, чтобы в случае сброса была возможность продолжить работу.

Так же рекомендуется использовать stateful фаервол. Можно разрешить любой пакет для уже устанолвенного соединения, а фильтровать только новые. См. ESTABLISHED.
0
StrangeAttractor #
> Выход нашел в сбросе всех правил на дофолтовые по крону каждые 15 мин.

Просто и гениально! Спасибо за решение. А я заморачивался супервниательным прочитыванием и продумыванием написанного.
+1
CaptainFlint #
После чего с чертыханием вспоминаете, что именно в этот момент как раз докачивался громадный файл с рапиды, и его теперь придётся тянуть по новой.
–1
1024 #
Добавьте пожалуйста в топик обратную операцию — как потом вытащить из этой группы приложение?

Или доступ приложения в сеть при использовании этого метода будет запрещён разово?
+1
onix74 #
Здесь использеутся sg, а sg — выполняет команду с правами другой группы
Таким образом, чтобы запустить приложение с правами доступа в интернет, надо его просто запустить без использования этого скрипта: вместо noinet firefox, просто firefox.
0
giner #
Гуд.
Вот только я не понял, зачем добавлять текущего пользователя в группу, если потом приложение и так запускается с другим GID?
0
igorp1024 #
Иначе будет запрос пароля (кажется, пароля группы).
0
ekzo #
спасибо
0
rapkasta #
отличнейшее решение, жаль не позволяет менять правила для приложения «на лету» во время работы приложения.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.