Eh bien, pas tout à fait interactif, mais je connais environ 3 façons de restreindre l’accès réseau aux programmes.
Par défaut, linux attribue des autorisations aux utilisateurs et chaque programme qu'ils exécutent possède les mêmes autorisations. Exécutez le programme non approuvé en tant qu'utilisateur distinct. C'est assez simple si vous pouvez le faire. (Parfois, vous ne pouvez pas aimer quand un programme réclame des privilèges root.) Ajoutez la règle de pare-feu suivante:
iptables -A OUTPUT -m owner --uid-owner ${untrusted_uid} -j DROP
Si vous n’avez pas peur de patcher le noyau, essayez grsecurity . Il autorise différentes autorisations pour différents exécutables pour le même utilisateur. C'est probablement la meilleure solution car vous pouvez l'intégrer aux règles iptables et spécifier des restrictions détaillées. Les règles devraient ressembler à quelque chose comme:
...
role your_regular_user u
...
subject /path/to/untrusted/program
connect disabled
...
...
Désactivez la fonction connect () avec LD_PRELOAD. C'est la façon la plus laide de ne l'utiliser que si vous n'avez pas d'autre choix. Vous aurez besoin d'une bibliothèque comme celle-ci:
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr const* addr, socklen_t addrlen) {
errno = ECONNREFUSED;
printf("connection refused\n");
return -1;
}
Compiler ceci avec
gcc -fPIC -shared -Wl,-soname,fake_connect fake_connect.c -o libfake_connect.so
Commencez le programme avec
LD_PRELOAD="./libfake_connect.so" ./untrusted_program