Часто требуется лишить программу возможности работы с сетью. То есть для отдельного приложения создать иллюзию, что сети нет и тем самым запретить ей передавать какие-либо данные.
Запрет программе доступа в сеть через 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.
Безопасный сёрфинг в Интернете.
Немає коментарів:
Дописати коментар