Часто требуется лишить программу возможности работы с сетью. То есть для отдельного приложения создать иллюзию, что сети нет и тем самым запретить ей передавать какие-либо данные.
Есть такой трюк через файрвол 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, запрещающий программе доступ в сеть, рекомендую создать скрипт deny-app-net.sh.
#!/bin/bash
# Больше информации по адресу vasilisc.com/deny-app-net
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 <
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.
Безопасный сёрфинг в Интернете.