Est-il possible de bloquer l'accès réseau (sortant) d'un processus unique?
linux
networking
process
iptables
larkee
la source
la source
localhost
(au même ordinateur) pour effectuer leur travail.Réponses:
Avec Linux 2.6.24+ (considéré comme expérimental jusqu’au 2.6.29), vous pouvez utiliser des espaces de noms réseau pour cela. Les 'espaces de noms réseau' doivent être activés dans votre noyau (
CONFIG_NET_NS=y
) et util-linux avec l'unshare
outil.Ensuite, démarrer un processus sans accès réseau est aussi simple que:
Cela crée un espace de nom de réseau vide pour le processus. C'est-à-dire qu'il est exécuté sans aucune interface réseau, y compris aucune boucle de rappel . Dans l'exemple ci-dessous, nous ajoutons -r pour exécuter le programme uniquement après que les ID utilisateur et groupe actuels ont été mappés sur ceux du super-utilisateur (éviter sudo):
Si votre application nécessite une interface réseau, vous pouvez en créer une nouvelle:
Notez que cela créera un nouveau bouclage local . Autrement dit, le processus créé ne pourra pas accéder aux ports ouverts de l'hôte
127.0.0.1
.Si vous avez besoin d'accéder au réseau d'origine à l'intérieur de l'espace de noms, vous pouvez utiliser
nsenter
pour entrer l'autre espace de noms.L'exemple suivant s'exécute
ping
avec un espace de noms réseau utilisé par le PID 1 (spécifié via-t 1
):la source
unshare -n
semble jeter "Opération non autorisée" sansroot
privilèges, tout ce qui me manque à ce sujet?sudo unshare -n
le droit racine. Comme j'ai besoin que le sudo appelle unshare, je me demande comment je peux m'assurer que le programme appelé n'a pas les droits root.sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
@ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240Linux possède une fonctionnalité appelée espaces de noms réseau qui vous permet d’avoir essentiellement plusieurs piles réseau sur le même ordinateur et d’en assigner une à un programme lors de son exécution. C'est une fonctionnalité généralement utilisée pour les conteneurs, mais vous pouvez également l'utiliser pour accomplir ce que vous voulez.
Les
ip netns
sous-commandes le gèrent. Créer un nouvel espace de noms réseau sans accès à rien est facile, c'est l'état par défaut d'un nouvel espace de noms:Maintenant, si vous basculez vers cet espace de noms, vous pouvez le configurer assez facilement. Vous voudrez probablement en parler, et c'est tout:
Maintenant, lorsque vous voulez exécuter votre commande sans réseau, vous devez simplement l'exécuter dans cette prison:
Le réseau est, comme vous le souhaitez, inaccessible. (Vous pouvez faire toutes sortes de choses intéressantes en tant que pile réseau séparée comprenant des
iptables
règles, etc.)la source
sudo ip
d'exécuter les commandes ip, une fois que j'étais dans bash, je viens de l'exécutersu someuser
pour obtenir un shell non privilégié pour l'utilisateur 'someuser'.Vous pouvez utiliser iptables et déplacer ce processus dans un groupe de contrôle:
la source
/sys/fs/cgroup/net_cls/tasks
(pas de 'blocage' dans le chemin)Oui, avec profil Apparmor personnalisé, c.-à-d.
Mais de cette façon, vous aurez besoin de générer une liste de fichiers autorisés à accéder également. Toute la procédure peut être un peu compliquée. Et voir le document d'aide ici
la source
Vous pouvez utiliser le bac à sable firejail (devrait fonctionner sur les noyaux avec la fonction seccomp).
Pour l'utiliser, il suffit de
--noprofile
désactive le sandbox par défaut--net=none
désactive la mise en réseauJe pense que la plupart des distributions fournissent déjà un paquet, mais même si elles ne tirent pas dessus, il n’existe pratiquement pas de dépendances autres que build toolchain et namespace / seccomp.
Firejail offre d’autres fonctionnalités intéressantes
firejail --help
, comme le fait de ne fournir que l’interface de bouclage ou de bloquer les adresses IP / DNS, etc.), mais cela devrait suffire. Aussi, çadoesn't require root
.la source
Vous ne pouvez pas le faire avec iptables seul. Cette fonctionnalité existait brièvement , mais ne pouvait pas fonctionner de manière fiable et a été abandonnée.
Si vous pouvez exécuter le processus en tant qu'ID utilisateur dédié, iptables peut le faire avec le
owner
module:Voir des exemples dans Iptables: correspondance du trafic sortant avec conntrack et propriétaire. Fonctionne avec des gouttes étranges , la règle iptables / pf ne permettant que les applications / utilisateurs XY?
Si vous pouvez exécuter le processus dans son propre conteneur, vous pouvez pare-feu de manière indépendante sur ce conteneur (même s'il est complètement déconnecté du réseau).
Un module de sécurité peut filtrer l'accès d'un processus aux fonctionnalités réseau. La réponse de warl0ck donne un exemple avec AppArmor.
la source
Solution 1: Pare-feu:
Nous pourrions utiliser des pare-feu comme Douane ou Opensnitch MAIS ces applications ne sont pas efficaces à 100% ou sont à un stade précoce de développement (ont beaucoup de bugs, etc. à partir de 2019)
Solution 2: MAC du noyau:
Les MAC du noyau peuvent être utilisés comme pare-feu. Les solutions les plus connues sont Tomoyo , Selinux et Apparmor. Cette solution est la meilleure en termes de stabilité et d’efficacité (solution de pare-feu), mais la plupart du temps, il est assez compliqué de la définir.
Solution 3: Firejail:
Firejail peut être utilisé pour bloquer l’accès au réseau d’une application qui ne nécessite pas d’utilisateur root, aucun utilisateur ne pouvant en bénéficier.
Solution 4: annuler le partage
Unshare peut démarrer une application sur une adresse de nom différente sans réseau, mais cela nécessite la solution de root firejail qui fait presque exactement la même chose mais ne nécessite pas de root.
Solution 5: Proxify:
Une solution consiste à proxy l’application sur un proxy null / faux . Nous pouvons utiliser tsocks ou proxybound . Voici quelques détails sur la configuration
Solution 6: Iptables:
Une autre solution facile est iptables, il pourrait être configuré pour bloquer une application
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
Remarque: Si vous modifiez un utilisateur déjà existant, vous devez exécuter:
usermod -a -G no-internet userName
vérifier avec:sudo groups userName
nano /home/username/.local/bin/no-internet
chmod 755 /home/username/.local/bin/no-internet
#!/bin/bash
sg no-internet "$@"
iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP
Remarque: N'oubliez pas de rendre les modifications permanentes afin qu'elles soient appliquées automatiquement après le redémarrage . Cela dépend de votre distribution Linux.
4. Vérifiez-le, par exemple sur Firefox en exécutant:
no-internet "firefox"
5. Si vous souhaitez créer une exception et autoriser un programme à accéder au réseau local :
iptables -A OUTPUT -m owner --gid-owner no-internet -d 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -d 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP
6. le rendre permanent
Une façon d’appliquer la règle iptables au démarrage est d’ajouter la règle en tant que service avec systemd
la source
sg no-internet
pour le moment.Cela dépend de la distribution que vous utilisez, mais c'est une fonctionnalité généralement incluse dans le système MAC du système d'exploitation. Comme indiqué précédemment, Ubuntu ou AppArmor de SuSE peuvent le faire. Si vous utilisez RHEL, vous pouvez configurer SELinux pour autoriser ou refuser l'accès à un numéro de port particulier en fonction de l'étiquette du processus en cours d'exécution. C’est tout ce que je pouvais trouver après une recherche rapide sur Google, mais il existe probablement des ressources plus détaillées en ligne si vous cherchez plus et vous donne l’idée générale.
la source
Vous pouvez utiliser seccomp-bpf pour bloquer certains appels système. Par exemple, vous pouvez vouloir bloquer l'
socket
appel système afin d'empêcher le processus de créer des FD de sockets.J'ai écrit un exemple de cet approcah qui empêche l'
socket
appel système de travailler avec libseccomp. Le résumé est (sans vérification d'erreur):Cela n'a pas besoin de privilèges root.
Un sandbox complet est beaucoup plus complexe, vous ne devez donc pas utiliser cet ordre pour bloquer les programmes non coopératifs / malveillants.
la source
Vous pouvez utiliser un programme en ligne de commande appelé "proxychains" et essayer l’une des possibilités suivantes:
Configurez-le qu'il utilise ...
Je ne l'ai pas testé moi-même, donc je ne sais pas si cela fonctionne ...
la source