단일 프로세스의 (발신) 네트워크 액세스를 차단할 수 있습니까?
localhost
은 (동일한 시스템으로) 네트워크 액세스를 사용 하여 작업을 수행합니다.
단일 프로세스의 (발신) 네트워크 액세스를 차단할 수 있습니까?
localhost
은 (동일한 시스템으로) 네트워크 액세스를 사용 하여 작업을 수행합니다.
답변:
Linux 2.6.24 이상 (2.6.29까지 실험적인 것으로 간주 됨)에서는 네트워크 네임 스페이스를 사용할 수 있습니다. 커널 ( CONFIG_NET_NS=y
) 및 unshare
도구를 사용하여 util-linux 에서 '네트워크 네임 스페이스'를 활성화해야합니다 .
그런 다음 네트워크 액세스없이 프로세스를 시작하는 것은 다음과 같이 간단합니다.
unshare -n program ...
프로세스의 빈 네트워크 네임 스페이스가 생성됩니다. 즉, 루프백 없음을 포함하여 네트워크 인터페이스없이 실행됩니다 . 아래 예에서는 현재 유효 사용자 및 그룹 ID가 수퍼 유저 ID에 매핑 된 후에 만 프로그램을 실행하기 위해 -r을 추가합니다 (sudo 제외).
$ unshare -r -n ping 127.0.0.1
connect: Network is unreachable
앱에 네트워크 인터페이스가 필요한 경우 새 인터페이스를 설정할 수 있습니다.
$ unshare -n -- sh -c 'ip link set dev lo up; ping 127.0.0.1'
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=32 time=0.066 ms
이렇게하면 새로운 로컬 루프백 이 생성됩니다 . 즉, 생성 된 프로세스는 호스트의 열린 포트에 액세스 할 수 없습니다 127.0.0.1
.
네임 스페이스 내의 원래 네트워킹에 액세스해야하는 경우 nsenter
다른 네임 스페이스를 입력하는 데 사용할 수 있습니다 .
다음 예제는 ping
PID 1에서 사용되는 네트워크 네임 스페이스로 실행됩니다 (를 통해 지정됨 -t 1
).
$ nsenter -n -t 1 -- ping -c4 example.com
PING example.com (93.184.216.119) 56(84) bytes of data.
64 bytes from 93.184.216.119: icmp_seq=1 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=2 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=3 ttl=50 time=134 ms
64 bytes from 93.184.216.119: icmp_seq=4 ttl=50 time=139 ms
--- example.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 134.621/136.028/139.848/2.252 ms
unshare -n
root
권한 없이 "작업이 허용되지 않음"을 던지는 것 같습니다 .
sudo unshare -n
루트 권한 을 상속받는 것처럼 보입니다 . unshare를 호출하려면 sudo가 필요하기 때문에 호출 된 프로그램에 루트 권한이 없는지 확인하는 방법이 궁금합니다.
sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'
번만 sudo : @ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
리눅스는 네트워크 네임 스페이스 ( network namespaces) 라는 기능을 가지고있어 동일한 머신에 여러 개의 네트워크 스택을 가질 수 있으며,이를 실행할 때 하나의 프로그램에 하나를 할당 할 수 있습니다. 이것은 일반적으로 컨테이너에 사용되는 기능이지만 원하는 기능을 수행하는 데 사용할 수도 있습니다.
ip netns
부속 명령을 관리 할 수 있습니다. 아무것도 액세스하지 않고 새 네트워크 네임 스페이스를 만드는 것은 쉽습니다. 새 네임 스페이스의 기본 상태입니다.
root@host:~# ip netns add jail
이제 해당 네임 스페이스로 전환하면 상당히 쉽게 구성 할 수 있습니다. 당신은 아마 그것을 가져오고 싶을 것입니다.
root@host:~# ip netns exec jail /bin/bash
root@host:~# ip addr add 127.0.0.1/8 dev lo
root@host:~# ip link set dev lo up
root@host:~# exit
이제 네트워크없이 명령을 실행하려면 해당 감옥에서 명령을 실행하십시오.
root@host:~# ip netns exec jail su user -c 'ping 8.8.8.8'
connect: Network is unreachable
원하는대로 네트워크에 연결할 수 없습니다. 별도의 네트워크 스택에 iptables
규칙 등이 포함되어 있기 때문에 모든 종류의 흥미로운 작업을 수행 할 수 있습니다 .
sudo ip
ip 명령을 실행 해야했지만 bash에 들어가면 su someuser
'someuser'사용자를 위해 권한이없는 쉘을 얻었습니다.
iptables를 사용하여 해당 프로세스를 cgroup으로 옮길 수 있습니다.
mkdir /sys/fs/cgroup/net_cls/block
echo 42 > /sys/fs/cgroup/net_cls/block/net_cls.classid
iptables -A OUTPUT -m cgroup --cgroup 42 -j DROP
echo [pid] > /sys/fs/cgroup/net_cls/block/tasks
/sys/fs/cgroup/net_cls/tasks
(경로에 '차단 없음') 으로 반향하면됩니다.
예, 맞춤형 의류 프로필, 즉
/usr/bin/curl {
...
# block ipv4 acces
deny network inet,
# ipv6
deny network inet6,
# raw socket
deny network raw,
}
그러나 그런 식으로 액세스 할 수있는 파일 목록을 생성해야합니다. 전체 절차가 약간 복잡 할 수 있습니다. 그리고 여기에 도움말 문서를 참조하십시오
firejail 샌드 박스 를 사용할 수 있습니다 (seccomp 기능이있는 커널에서 작동해야 함).
그것을 사용하려면 그냥
firejail --noprofile --net=none <path to executable>
--noprofile
기본 샌드 박스
--net=none
사용 안함 네트워킹 사용 안함
나는 대부분의 배포판이 이미 패키지를 제공한다고 믿지만 firejail이 없어도 빌드 툴 체인 및 네임 스페이스 / seccomp 지원 커널 외에 다른 종속성이 거의 없습니다.
firejail --help
네트워킹 (루프백 인터페이스 만 제공하거나 ip / dns 차단 등)과 관련하여 표시 할 수있는 firejail의 다른 멋진 기능 이 있지만이 작업을 수행해야합니다. 또한 doesn't require root
.
iptables만으로는 할 수 없습니다. 이 기능은 잠시 동안 존재 했지만 안정적으로 작동하지 않아 포기되었습니다.
프로세스를 전용 사용자 ID로 실행할 수 있으면 iptables가 owner
모듈을 사용하여 수행 할 수 있습니다 .
iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP
Iptables : 발신 트래픽과 conntrack 및 소유자 일치의 예를 참조하십시오 . XY 응용 프로그램 / 사용자 만 허용 하는 이상한 삭제 , iptables / pf 규칙 과 함께 작동 합니까?
자체 컨테이너에서 프로세스를 실행할 수있는 경우 해당 컨테이너를 독립적으로 방화벽 처리 할 수 있습니다 (네트워크에서 완전히 연결 해제 됨).
보안 모듈은 네트워킹 기능에 대한 프로세스 액세스를 필터링 할 수 있습니다. warl0ck의 답변 은 AppArmor의 예입니다.
해결 방법 1 : 방화벽 :
우리는 Douane 또는 Opensnitch 와 같은 방화벽을 사용할 수 있지만 이러한 응용 프로그램은 100 % 효율적이지 않거나 개발 초기 단계입니다 (2019 년 현재 많은 버그가 있음)
해결 방법 2 : 커널 MAC :
커널 MAC은 Tomoyo , Selinux 및 Apparmor로 가장 잘 알려진 방화벽으로 사용될 수 있습니다. 이 솔루션은 안정성과 효율성 (방화벽 솔루션)에있어 가장 좋은 방법이지만 대부분의 경우이를 설정하는 것은 다소 복잡합니다.
해결책 3 : Firejail :
Firejail 은 응용 프로그램의 네트워크 액세스를 차단하는 데 사용할 수 있습니다. 루트가 필요하지 않으므로 모든 사용자가 혜택을 누릴 수 있습니다.
firejail --noprofile --net=none command-application
해결 방법 4 : 공유 해제
공유를 해제하면 네트워크없이 다른 네임 스페이스에서 응용 프로그램을 시작할 수 있지만 루트 firejail의 솔루션은 거의 똑같은 작업을 수행하지만 루트는 필요하지 않습니다.
unshare -r -n application-comand
해결 방법 5 : 근접 :
하나 개의 솔루션은 응용 프로그램을 proxify하는 널 (null) / 가짜 프록시. tsocks 또는 proxybound를 사용할 수 있습니다 . 설정에 대한 자세한 내용은 다음과 같습니다.
해결책 6 : IP 테이블 :
다른 쉬운 해결책은 iptables이며, 응용 프로그램을 차단하도록 설정할 수 있습니다.
groupadd no-internet
grep no-internet /etc/group
useradd -g no-internet username
usermod -a -G no-internet userName
.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
예를 들어 Firefox에서 다음을 실행하여 확인하십시오.
no-internet "firefox"
5. 예외를 만들고 프로그램이 로컬 네트워크 에 액세스하도록 허용하려는 경우 :
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. 영구히
부팅시 iptables 규칙을 적용하는 한 가지 방법은 systemd를 사용하여 규칙을 서비스로 추가하는 것입니다
cat /usr/lib/systemd/system/nonet.service
[Unit]
Description=Nonet group iptable update
After=network.target
After=xsession.target
After=iptables.service
After=shorewall.service
[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/bin/bash /home/user/Scripts/Nonet.iptables.sh
sg no-internet
하고 있습니다.
seccomp-bpf 를 사용 하여 일부 시스템 호출을 차단할 수 있습니다 . 예를 들어 프로세스가 소켓 FD를 작성하지 못하게하기 위해 시스템 호출 을 차단socket
하려고 할 수 있습니다 .
나는 libseccomp를 사용하여 시스템 호출을 방지하는이 접근법 의 예 를 썼습니다 socket
. 요약은 (오류 점검없이) :
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);
seccomp_arch_add(ctx, SCMP_ARCH_NATIVE);
seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCES), SCMP_SYS(socket), 1, SCMP_CMP(0, SCMP_CMP_EQ, pf));
seccomp_load(ctx);
execvp(argv[1], argv+1);
루트 권한이 필요하지 않습니다.
완전한 샌드 박스는 훨씬 더 복잡하지만 비협조적 / 악의적 인 프로그램을 차단하기 위해이 순서를 사용하지 않아야합니다.
"proxychains"라는 명령 행 프로그램을 사용하여 다음 가능성 중 하나를 시도 할 수 있습니다.
사용하도록 설정하십시오 ...
나는 그것을 직접 테스트하지 않았으므로 작동하는지 알 수 없습니다 ...