вівторок, 28 серпня 2012 р.

Запрещаем приложению доступ в сеть

Часто требуется лишить программу возможности работы с сетью. То есть для отдельного приложения создать иллюзию, что сети нет и тем самым запретить ей передавать какие-либо данные.

Запрет программе доступа в сеть через iptables

Есть такой трюк через файрвол iptables. Любым доступным вам способом нужно добавить правило, которое сбрасывает (DROP) пакеты, основываясь на имени пользователя.

sudo iptables -A OUTPUT -p tcp -m owner --uid-owner NAME_USER_NO_INET -j DROP.

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

sudo -u NAME_USER_NO_INET программа

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

Способ рабочий, но не элегантный. Лишний пользователь мозолит глаза. Запуск программы нужно изменять, то есть править ярлыки или пункты меню. Хотя метод прост, тут ему не откажешь.

Но есть и другой способ.

Запрет программе доступа в сеть через AppArmor

Можно создать профиль AppArmor для данной программы и в профиле лишить программу сетевых возможностей. Так как цель - запрет выхода в сеть программе, то тонкая настройка профиля для программы это отдельная история и она рассматривается в статье Правила AppArmor.

В данном случае, нам достаточно только запретить сеть, разрешив всё остальное. "Разрешив всё" имеется в виду, что мандатный доступ AppArmor не работает для программы и вся защита основывается на классических правах доступа.

Для облегчения создания профиля AppArmor, запрещающий программе доступ в сеть, рекомендую создать скрипт deny-app-net.sh.


#!/bin/bash clear date # variable PROGRAM="/usr/bin/wget" RELOAD_APPARMOR="sudo service apparmor reload" DIR_AA_PROFILES="/etc/apparmor.d/" NAME_PROFILE=`echo $PROGRAM| tr "/" "." | cut -c 2-` # echo === name AppArmor Profile === echo $NAME_PROFILE echo === create AppArmor Profile $DIR_AA_PROFILES$NAME_PROFILE === echo ----- echo Пожалуйста, нажмите Enter на клавиатуре echo ----- cat | sudo tee $DIR_AA_PROFILES$NAME_PROFILE < profile "$PROGRAM" { deny network, deny capability net_bind_service, deny capability net_broadcast, deny capability net_admin, deny capability net_raw, capability chown, capability dac_override, capability dac_read_search, capability fowner, capability fsetid, capability kill, capability setgid, capability setuid, capability setpcap, capability linux_immutable, capability ipc_lock, capability ipc_owner, capability sys_module, capability sys_rawio, capability sys_chroot, capability sys_ptrace, capability sys_pacct, capability sys_admin, capability sys_boot, capability sys_nice, capability sys_resource, capability sys_time, capability sys_tty_config, capability mknod, capability lease, capability audit_write, capability audit_control, capability setfcap, capability mac_override, capability mac_admin, /** rwmlkux, / rwmlkux, } EOF echo === restart AppArmor === $RELOAD_APPARMOR exit 0

Что делает скрипт и как?
Так как AppArmor - это мандатный доступ основанный на путях, то для AppArmor крайне важен путь к программе. Для примера и наглядности продемонстрируем запрещение доступа для утилиты wget.

В переменной PROGRAM="/usr/bin/wget" указан полный путь к wget. Подсказать путь к бинарнику программы поможет команда

whereis -b имя_программы
.

В переменной NAME_PROFILE=`echo $PROGRAM| tr "/" "." | cut -c 2-` будет имя будущего профиля wget, которое создаётся из /usr/bin/wget в usr.bin.wget. То есть / заменяется на точку, кроме первого символа.

В RELOAD_APPARMOR="sudo service apparmor reload" укажите как нужно перегружать в вашей системе AppArmor.

DIR_AA_PROFILES="/etc/apparmor.d/" указывает на каталог с профилями AppArmor.

Запустив скрипт

sudo sh ./deny-app-net.sh
вы создадите файл $NAME_PROFILE в каталоге $DIR_AA_PROFILES.

Содержимое файла /etc/apparmor.d/usr.bin.wget будет таким

profile "/usr/bin/wget" {
deny network,
deny capability net_bind_service,
deny capability net_broadcast,
deny capability net_admin,
deny capability net_raw,
capability chown,
.... сокращено ...
/** rwmlkux,
/ rwmlkux,
}

Мы лишаем wget сети, указывая deny network. Так же отключаем возможности (capability) сети, указав deny capability net_*.

Остальные возможности разрешаем, так как не знаем какой программе и что понадобится.

Конструкция вида

/** rwmlkux,
/ rwmlkux,

не мешает программе получить доступ ко всем файлам и папкам (/**) в системе и даёт ей возможность их прочесть (r), записать (w), отобразить в память (m), создать ссылку (l), заблокировать файл (k), ЕСЛИ это позволяют классические права доступа!

С помощью ux мы указываем неконтролируемое AppArmor выполнение программы, так как наша цель была просто лишить программу сети.

Многих испугает фраза, что /** rwmlkux даёт такие широкие возможности программе, НО не забывайте, что речь идёт о мандатном доступе в AppArmor и только! Проще говоря, если классические права доступа не дают программе прочесть некоторый файл, то /** rwmlkux и не даст их.

AppArmor - это дополнительная защита к классическим правам доступа (rwxr-xr-x), а не его замена!

Если вы хотите более тонко настроить профиль и одновременно лишить программу доступа в сеть, то вам придётся освоить синтаксис AppArmor и указать в профиле ваши пожелания. В данной статье это не рассматривается.

Как вернуть программе доступ в сеть?
Удалите созданный профиль и заставьте AppArmor перечитать профили.

Похожие материалы
Правила AppArmor.
Безопасность Ubuntu.
Безопасный сёрфинг в Интернете.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments