как запретить конкретному приложению выход в инет?

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

tull
Сообщения: 484

как запретить конкретному приложению выход в инет?

Сообщение tull »

или доступ к конкретным портам/адресам

а также как зашейпить скорость сетевого соединения для конкретного приложения?
Спасибо сказали:
Michael
Сообщения: 92

Re: как запретить конкретному приложению выход в инет?

Сообщение Michael »

man iptables, на предмет расширения owner.
Спасибо сказали:
Аватара пользователя
TrustyVic
Сообщения: 235
Статус: Потребитель
ОС: W9PE

Re: как запретить конкретному приложению выход в инет?

Сообщение TrustyVic »

Michael писал(а):
08.02.2008 03:36
man iptables, на предмет расширения owner.


apparmor разве не этим занимается?
Пингвины - фарава!
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

Michael писал(а):
08.02.2008 03:36
man iptables, на предмет расширения owner.
не катит:
--cmd-owner name
Matches if the packet was created by a process with the given command name. (this option is present only if iptables was compiled under a kernel supporting this feature)

NOTE: pid, sid and command matching are broken on SMP


TrustyVic писал(а):
08.02.2008 12:08
apparmor разве не этим занимается?
вот мне тоже показалось, что его можно использовать. только пока непонятно как им пользоваться.

но как я понял, простых и удобных гуевых средств нету? типа аналога вендового netlimiter или хотя бы маковского little snitch?
Спасибо сказали:
Michael
Сообщения: 92

Re: как запретить конкретному приложению выход в инет?

Сообщение Michael »

Порты блокировать - это iptables. Шейпить на SMP траффик отдельного приложения, наверное, действительно придётся apparmor'ом. Однако, если приложение отдельные порты использует, то можно обойтись iptables + tc (из iproute2 который).
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

Michael писал(а):
08.02.2008 17:59
Однако, если приложение отдельные порты использует, то можно обойтись iptables + tc (из iproute2 который).
не отдельные. скажем надо закрыть 80 порт конкретному приложению.
Спасибо сказали:
neru_dead
Сообщения: 331
ОС: Debian Etch

Re: как запретить конкретному приложению выход в инет?

Сообщение neru_dead »

У меня вот так сделано:

Код: Выделить всё

    # Radio record
    $IPT -A OUTPUT -p tcp -o $inet -d 193.125.195.148 -m owner --uid-owner 33 --dport 80 -j ACCEPT
    # MTS
    $IPT -A OUTPUT -p tcp -o $inet -d 80.83.224.157 -m owner --uid-owner 33 --dport 80 -j ACCEPT
    # Gismeteo
    $IPT -A OUTPUT -p tcp -o $inet -d 212.48.138.18 -m owner --uid-owner 33 --dport 80 -j ACCEPT

    $IPT -A OUTPUT -p tcp -o $inet -d 0.0.0.0/0 -m owner --uid-owner 33 --dport 80 -j DROP

uid 33 это apache2 у меня...
Debian GNU/Linux 4.0
Registered User # 410887
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

neru_dead,
и опять говорю - надо по ПРИЛОЖЕНИЮ. не по владельцу, не по группе, не по пиду.
Спасибо сказали:
pingod
Сообщения: 11
ОС: RedHat

Re: как запретить конкретному приложению выход в инет?

Сообщение pingod »

посмотрите в сторону Tcpwrapers
Спасибо сказали:
Аватара пользователя
JackYF
Сообщения: 129
ОС: Debian GNU/Linux

Re: как запретить конкретному приложению выход в инет?

Сообщение JackYF »

tull писал(а):
08.02.2008 21:16
и опять говорю - надо по ПРИЛОЖЕНИЮ


Что есть "приложение"? Побайтное совпадение бинарника? путь? md5-хэш?
"В природе не существует инструмента, машины или устройства, по силе и виртуозности сравнимого с человеческой рукой."
В. Г. Бэнхэм.
---
Ваяю "нелинейный" клавиатурный тренажёр для GNU/Linux - nlkt.
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

JackYF писал(а):
08.02.2008 23:23
Что есть "приложение"? Побайтное совпадение бинарника? путь? md5-хэш?
видимо по пути и имени бинарника.
вы видели как работают такие проги в виндузе? например в netlimiter выбираешь среди активных процессов нужный и выставляешь лимит скорости. в следующий раз эти ограничения уже действуют.
или скажем касперский (да и нетлимитер тоже) спрашивает - "такая-то прога долбится в инет, разрешить/запретить?". запретил - все, в следующий раз уже не спрашивает, а прога думает, что инета нет.
уверен, что запоминается просто по имени и расположению файла (что логичней всего).

неужели под линух нет ничего подобного?! типа вирусов нет, троянов нет, зачем что-то ограничивать? :) ну и скорость тоже незачем - все на быстром халявном инете (а страдальцев на ЖПРС или скайлинке не учитываем)
Спасибо сказали:
Michael
Сообщения: 92

Re: как запретить конкретному приложению выход в инет?

Сообщение Michael »

Так у тебя SMP или нет?
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

Michael писал(а):
09.02.2008 14:41
Так у тебя SMP или нет?
да, двухядерный amd
Спасибо сказали:
Аватара пользователя
gordon01
Сообщения: 216

Re: как запретить конкретному приложению выход в инет?

Сообщение gordon01 »

Мда, отличную сцылку дали.... тему закрыли, а а в этой так ничего и не решено. Хотя ьуь автори темы папру раз сфеормулировал то, что ему надо.
«Hello World!» 17 errors, 31 warnings
Mandriva Cooker
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: как запретить конкретному приложению выход в инет?

Сообщение KiWi »

gordon01 писал(а):
13.02.2008 06:02
Мда, отличную сцылку дали.... тему закрыли, а а в этой так ничего и не решено. Хотя ьуь автори темы папру раз сфеормулировал то, что ему надо.

Здесь её решили как минимум 2 раза.
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: как запретить конкретному приложению выход в инет?

Сообщение Goodvin »

tull писал(а):
08.02.2008 16:22
TrustyVic писал(а):
08.02.2008 12:08
apparmor разве не этим занимается?
вот мне тоже показалось, что его можно использовать. только пока непонятно как им пользоваться.

но как я понял, простых и удобных гуевых средств нету? типа аналога вендового netlimiter или хотя бы маковского little snitch?
А Вы пробовали хотя бы минимально поискать ?
В дистрибутивах семейства SUSE это настраивается через YAST, отличным гуёвым инструментом.

Про сам AppArmor была отличная статья в журнале LinuxFormat в прошлом или позапрошлом году.
"Ищите и обрящете"(С)

update:
http://ru.wikipedia.org/wiki/AppArmor
http://ru.opensuse.org/AppArmor
Анонс журнала "Linux Format" Номер 9 (83) Сентябрь 2006, внутри которого статья "Армированный Linux — руководство по использованию AppArmor"
Скачать этот номер журнала бесплатно в электронном виде.
Спасибо сказали:
Michael
Сообщения: 92

Re: как запретить конкретному приложению выход в инет?

Сообщение Michael »

Вообще то, мне не кажется адекватным решение через apparmor. Ставить его ради простой задачи - это перебор. Но управлять траффиком отдельных приложений на SMP с помощью только iptables не получается.
Спасибо сказали:
tull
Сообщения: 484

Re: как запретить конкретному приложению выход в инет?

Сообщение tull »

KiWi писал(а):
13.02.2008 09:06
Здесь её решили как минимум 2 раза.
простите, а второй раз, это как?
использование ограничения по владельцу процесса это решение совсем другой задачи.

Goodvin,
огромное вам спасибо за ссылки! буду изучать.
жаль конечно, что только такое тяжеловесное решение есть, но ничего не поделаешь... может когда-нибудь напишут аналог нетлимитера. нетлимитер, кстати, показывает сетевую скорость даже по отдельному треду, и позволяет ее ограничивать (например, когда одним приложением качается несколько файлов, можно для каждого поставить свою скорость в обе стороны)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: как запретить конкретному приложению выход в инет?

Сообщение KiWi »

tull писал(а):
17.02.2008 17:30
KiWi писал(а):
13.02.2008 09:06
Здесь её решили как минимум 2 раза.
простите, а второй раз, это как?
использование ограничения по владельцу процесса это решение совсем другой задачи.

Для smp систем второй способ отпадает -- cmd-owner.
Спасибо сказали:
vantaker
Сообщения: 166

Re: как запретить конкретному приложению выход в инет?

Сообщение vantaker »

--pid-owner, --sid-owner, --cmd-owner начиная с 2.6.15 не работают вобще
но есть TuxGuardian
tuxguardian.sf.net
Спасибо сказали:
ivan1986
Сообщения: 14
ОС: Debian sid

Re: как запретить конкретному приложению выход в инет?

Сообщение ivan1986 »

Сделал патч для не SMP ядер на 26 ядро - они в очередной раз там все изменили :)
файл - net/netfilter/xt_owner.c

Код: Выделить всё

--- xt_owner.c.orig    2008-07-14 23:04:01.000000000 +0400
+++ xt_owner.c    2008-07-15 01:55:43.000000000 +0400
@@ -14,12 +14,115 @@
 #include <linux/module.h>
 #include <linux/skbuff.h>
 #include <linux/file.h>
+#include <linux/fdtable.h>
 #include <net/sock.h>
 #include <linux/netfilter/x_tables.h>
 #include <linux/netfilter/xt_owner.h>
 #include <linux/netfilter_ipv4/ipt_owner.h>
 #include <linux/netfilter_ipv6/ip6t_owner.h>

+
+static int
+match_comm(const struct sk_buff *skb, const char *comm)
+{
+    struct task_struct *g, *p;
+    struct files_struct *files;
+    int i;
+
+    read_lock(&tasklist_lock);
+    do_each_thread(g, p) {
+        if(strncmp(p->comm, comm, sizeof(p->comm)))
+            continue;
+
+        task_lock(p);
+        files = p->files;
+        if(files) {
+            spin_lock(&files->file_lock);
+            for (i=0; i < files->fdt->max_fds; i++) {
+                if (fcheck_files(files, i) ==
+                    skb->sk->sk_socket->file) {
+                    spin_unlock(&files->file_lock);
+                    task_unlock(p);
+                    read_unlock(&tasklist_lock);
+                    return 1;
+                }
+            }
+            spin_unlock(&files->file_lock);
+        }
+        task_unlock(p);
+    } while_each_thread(g, p);
+    read_unlock(&tasklist_lock);
+    return 0;
+}
+
+static int
+match_pid(const struct sk_buff *skb, pid_t pid)
+{
+    struct task_struct *p;
+    struct files_struct *files;
+    int i;
+
+    read_lock(&tasklist_lock);
+    p = find_task_by_pid(pid);
+    if (!p)
+        goto out;
+    task_lock(p);
+    files = p->files;
+    if(files) {
+        spin_lock(&files->file_lock);
+        for (i=0; i < files->fdt->max_fds; i++) {
+            if (fcheck_files(files, i) ==
+                skb->sk->sk_socket->file) {
+                spin_unlock(&files->file_lock);
+                task_unlock(p);
+                read_unlock(&tasklist_lock);
+                return 1;
+            }
+        }
+        spin_unlock(&files->file_lock);
+    }
+    task_unlock(p);
+out:
+    read_unlock(&tasklist_lock);
+    return 0;
+}
+
+static int
+match_sid(const struct sk_buff *skb, pid_t sid)
+{
+    struct task_struct *g, *p;
+    struct file *file = skb->sk->sk_socket->file;
+    int i, found=0;
+
+    read_lock(&tasklist_lock);
+    do_each_thread(g, p) {
+        struct files_struct *files;
+        if (p->signal->session != sid)
+            continue;
+
+        task_lock(p);
+        files = p->files;
+        if (files) {
+            spin_lock(&files->file_lock);
+            for (i=0; i < files->fdt->max_fds; i++) {
+                if (fcheck_files(files, i) == file) {
+                    found = 1;
+                    break;
+                }
+            }
+            spin_unlock(&files->file_lock);
+        }
+        task_unlock(p);
+        if (found)
+            goto out;
+    } while_each_thread(g, p);
+out:
+    read_unlock(&tasklist_lock);
+
+    return found;
+}
+
+
 static bool
 owner_mt_v0(const struct sk_buff *skb, const struct net_device *in,
             const struct net_device *out, const struct xt_match *match,
@@ -46,6 +149,24 @@
             !!(info->invert & IPT_OWNER_GID))
             return false;

+    if(info->match & IPT_OWNER_PID) {
+        if (!match_pid(skb, info->pid) ^
+            !!(info->invert & IPT_OWNER_PID))
+            return false;
+    }
+
+    if(info->match & IPT_OWNER_SID) {
+        if (!match_sid(skb, info->sid) ^
+            !!(info->invert & IPT_OWNER_SID))
+            return false;
+    }
+
+    if(info->match & IPT_OWNER_COMM) {
+        if (!match_comm(skb, info->comm) ^
+            !!(info->invert & IPT_OWNER_COMM))
+            return false;
+    }
+
     return true;
 }

@@ -123,12 +244,20 @@
 {
     const struct ipt_owner_info *info = matchinfo;

-    if (info->match & (IPT_OWNER_PID | IPT_OWNER_SID | IPT_OWNER_COMM)) {
-        printk(KERN_WARNING KBUILD_MODNAME
-               ": PID, SID and command matching is not "
-               "supported anymore\n");
+    if (hook_mask
+        & ~((1 << NF_INET_LOCAL_OUT) | (1 << NF_INET_POST_ROUTING))) {
+        printk("ipt_owner: only valid for LOCAL_OUT or POST_ROUTING.\n");
+        return false;
+    }
+
+#ifdef CONFIG_SMP
+    /* files->file_lock can not be used in a BH */
+    if (info->match & (IPT_OWNER_PID|IPT_OWNER_SID|IPT_OWNER_COMM)) {
+        printk("ipt_owner: pid, sid and command matching is broken "
+               "on SMP.\n");
         return false;
     }
+#endif

     return true;
 }

Описание ошибки с SMP какое-то мутное
если после патча убрать между
#ifdef CONFIG_SMP
#endif
может все будет нормально работать, но не гарантирую, так как у меня одноядерник, проверить не могу.
также в iptables-1.4.1 закомментировали cmd-owner, вернул.

Код: Выделить всё

diff -urN iptables-1.4.1.1.orig/extensions/libxt_owner.c iptables-1.4.1.1/extensions/libxt_owner.c
--- iptables-1.4.1.1.orig/extensions/libxt_owner.c    2008-06-16 17:12:40.000000000 +0400
+++ iptables-1.4.1.1/extensions/libxt_owner.c    2008-07-25 00:43:20.000000000 +0400
@@ -591,6 +591,6 @@
 {
     xtables_register_match(&owner_mt_reg_v0);
     xtables_register_match(&owner_mt6_reg_v0);
-    xtables_register_match(&owner_mt_reg);
-    xtables_register_match(&owner_mt6_reg);
+    //xtables_register_match(&owner_mt_reg);
+    //xtables_register_match(&owner_mt6_reg);
 }


Вообще кто подскажет нормальное решение?
TuxGuardian под дебиан ленни не собирается.
Спасибо сказали: