Авторские статьи

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


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

Запрет программе доступа в сеть через 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
# Больше информации по адресу 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 < 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.
Безопасный сёрфинг в Интернете.

Дата последней правки: 2024-03-28 10:47:23

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта