как запретить конкретному приложению выход в инет?
Модераторы: SLEDopit, Модераторы разделов
-
tull
- Сообщения: 484
как запретить конкретному приложению выход в инет?
или доступ к конкретным портам/адресам
а также как зашейпить скорость сетевого соединения для конкретного приложения?
а также как зашейпить скорость сетевого соединения для конкретного приложения?
-
Michael
- Сообщения: 92
Re: как запретить конкретному приложению выход в инет?
man iptables, на предмет расширения owner.
-
TrustyVic
- Сообщения: 235
- Статус: Потребитель
- ОС: W9PE
Re: как запретить конкретному приложению выход в инет?
apparmor разве не этим занимается?
Пингвины - фарава!
-
tull
- Сообщения: 484
Re: как запретить конкретному приложению выход в инет?
не катит:
--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
вот мне тоже показалось, что его можно использовать. только пока непонятно как им пользоваться.
но как я понял, простых и удобных гуевых средств нету? типа аналога вендового netlimiter или хотя бы маковского little snitch?
-
Michael
- Сообщения: 92
Re: как запретить конкретному приложению выход в инет?
Порты блокировать - это iptables. Шейпить на SMP траффик отдельного приложения, наверное, действительно придётся apparmor'ом. Однако, если приложение отдельные порты использует, то можно обойтись iptables + tc (из iproute2 который).
-
tull
- Сообщения: 484
-
neru_dead
- Сообщения: 331
- ОС: Debian Etch
Re: как запретить конкретному приложению выход в инет?
У меня вот так сделано:
uid 33 это apache2 у меня...
Код: Выделить всё
# 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 DROPuid 33 это apache2 у меня...
Debian GNU/Linux 4.0
Registered User # 410887
Registered User # 410887
-
tull
- Сообщения: 484
Re: как запретить конкретному приложению выход в инет?
neru_dead,
и опять говорю - надо по ПРИЛОЖЕНИЮ. не по владельцу, не по группе, не по пиду.
и опять говорю - надо по ПРИЛОЖЕНИЮ. не по владельцу, не по группе, не по пиду.
-
pingod
- Сообщения: 11
- ОС: RedHat
Re: как запретить конкретному приложению выход в инет?
посмотрите в сторону Tcpwrapers
-
JackYF
- Сообщения: 129
- ОС: Debian GNU/Linux
Re: как запретить конкретному приложению выход в инет?
Что есть "приложение"? Побайтное совпадение бинарника? путь? md5-хэш?
"В природе не существует инструмента, машины или устройства, по силе и виртуозности сравнимого с человеческой рукой."
В. Г. Бэнхэм.
---
Ваяю "нелинейный" клавиатурный тренажёр для GNU/Linux - nlkt.
В. Г. Бэнхэм.
---
Ваяю "нелинейный" клавиатурный тренажёр для GNU/Linux - nlkt.
-
tull
- Сообщения: 484
Re: как запретить конкретному приложению выход в инет?
видимо по пути и имени бинарника.
вы видели как работают такие проги в виндузе? например в netlimiter выбираешь среди активных процессов нужный и выставляешь лимит скорости. в следующий раз эти ограничения уже действуют.
или скажем касперский (да и нетлимитер тоже) спрашивает - "такая-то прога долбится в инет, разрешить/запретить?". запретил - все, в следующий раз уже не спрашивает, а прога думает, что инета нет.
уверен, что запоминается просто по имени и расположению файла (что логичней всего).
неужели под линух нет ничего подобного?! типа вирусов нет, троянов нет, зачем что-то ограничивать?
-
Michael
- Сообщения: 92
Re: как запретить конкретному приложению выход в инет?
Так у тебя SMP или нет?
-
tull
- Сообщения: 484
-
gordon01
- Сообщения: 216
Re: как запретить конкретному приложению выход в инет?
Мда, отличную сцылку дали.... тему закрыли, а а в этой так ничего и не решено. Хотя ьуь автори темы папру раз сфеормулировал то, что ему надо.
«Hello World!» 17 errors, 31 warnings
Mandriva Cooker
Mandriva Cooker
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
-
Goodvin
- Ведущий рубрики
- Сообщения: 4333
- Статус: ⚝⚠⚒⚑⚖☭☞☣☤&
Re: как запретить конкретному приложению выход в инет?
А Вы пробовали хотя бы минимально поискать ?
В дистрибутивах семейства 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: как запретить конкретному приложению выход в инет?
Вообще то, мне не кажется адекватным решение через apparmor. Ставить его ради простой задачи - это перебор. Но управлять траффиком отдельных приложений на SMP с помощью только iptables не получается.
-
tull
- Сообщения: 484
Re: как запретить конкретному приложению выход в инет?
простите, а второй раз, это как?
использование ограничения по владельцу процесса это решение совсем другой задачи.
Goodvin,
огромное вам спасибо за ссылки! буду изучать.
жаль конечно, что только такое тяжеловесное решение есть, но ничего не поделаешь... может когда-нибудь напишут аналог нетлимитера. нетлимитер, кстати, показывает сетевую скорость даже по отдельному треду, и позволяет ее ограничивать (например, когда одним приложением качается несколько файлов, можно для каждого поставить свою скорость в обе стороны)
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
-
vantaker
- Сообщения: 166
Re: как запретить конкретному приложению выход в инет?
--pid-owner, --sid-owner, --cmd-owner начиная с 2.6.15 не работают вобще
но есть TuxGuardian
tuxguardian.sf.net
но есть TuxGuardian
tuxguardian.sf.net
-
ivan1986
- Сообщения: 14
- ОС: Debian sid
Re: как запретить конкретному приложению выход в инет?
Сделал патч для не SMP ядер на 26 ядро - они в очередной раз там все изменили 
файл - net/netfilter/xt_owner.c
Описание ошибки с SMP какое-то мутное
если после патча убрать между
#ifdef CONFIG_SMP
#endif
может все будет нормально работать, но не гарантирую, так как у меня одноядерник, проверить не могу.
также в iptables-1.4.1 закомментировали cmd-owner, вернул.
Вообще кто подскажет нормальное решение?
TuxGuardian под дебиан ленни не собирается.
файл - 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 под дебиан ленни не собирается.