войти зарегистрироваться

Убунтариум whois

индекс
170,92

Ограничение доступа в интернет для приложений в 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"

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

  • раскрыть комментарий
  • раскрыть комментарий
  • раскрыть комментарий
  • раскрыть комментарий
  • раскрыть комментарий
  • А мне вот интересно — можно ли сделать скрипт который будет блокировать ВСЕ приложения? То есть всё кроме того на что я покажу пальцем и скажу «этому можно». Не спрашивайте зачем, например для повышения безопасности. Например «троян» не сможет скачать свои исходники с интернета… или закачать в локалку… ну вы поняли…
    • Меняете правило фаервола наоборот — чтобы оно разрешало доступ, а по умолчанию ставите запрет.
    • man iptables
    • Модифицировать описанный метод, сделать правило ACCEPT для группы welcome2inet, все остальное DROP'ать.
  • Какое то убожество. man selinux, срочно.
    • apparmor?
      • Вопрос (не наезд): apparmor сумеет применять разные правила для одного бинарника? Например, есть несколько приложений на VM (например, на той же java). Бинарник — один. Получится ли как-то контролировать разные приложения? Можно, в принципе, насоздавать симлинков на бинарник виртуальной машины (по одному для каждого приложения), но, имхо, неудобно.
        • Вообще не в курсе. Я только понимаю, что это две разные реализации примерно одного и того-же.
          Но в моей жизни использовать осознанно не приходилось. Более того, selinux мне местами попортил настроение.
          Наверное, всё это где-то надо и важно, но мои linux use cases не затрагивают…
    • Selinux не лучший вариант.
      Из-за особенностей работы, бывают проблемы с принтерами и сканерами например. В общем много подводных камней.
  • Для рестарта сети лучше использовать "/etc/init.d/networking restart".
  • вещь хорошая конечно, а вот как сделать policy based routing по группам? на сколько я помню, метки ставить и одновременно проверять группу не получается в iptables. а очень хочется торренты завернуть мимо vpn соединения
  • раскрыть комментарий
  • во фряшном ipfw возможно сделать правила для опеделенных uid, gid, думаю что iptables не уступает ему в функциональности, т.ч. гляньте в эту сторону в man iptables.
    • Он вообще-то ровно это и предлагает — это правило для iptables по определенному gid:

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

          Так же рекомендуется использовать stateful фаервол. Можно разрешить любой пакет для уже устанолвенного соединения, а фильтровать только новые. См. ESTABLISHED.
    • После чего с чертыханием вспоминаете, что именно в этот момент как раз докачивался громадный файл с рапиды, и его теперь придётся тянуть по новой.
  • Добавьте пожалуйста в топик обратную операцию — как потом вытащить из этой группы приложение?

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