프로세스의 네트워크 액세스를 차단 하시겠습니까?


74

단일 프로세스의 (발신) 네트워크 액세스를 차단할 수 있습니까?


6
프로세스를 어떻게 식별 하시겠습니까? PID, 이름, 경로?
Marco

1
어떤 액세스를 차단 하시겠습니까? 일부 프로그램 localhost은 (동일한 시스템으로) 네트워크 액세스를 사용 하여 작업을 수행합니다.
vonbrand

프로세스가 협력하는 경우 네트워크 액세스를 방지하려면 LD_PRELOAD 또는 이와 유사한 것을 참조하십시오 .
Gilles

답변:


78

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다른 네임 스페이스를 입력하는 데 사용할 수 있습니다 .

다음 예제는 pingPID 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

4
unshare -nroot권한 없이 "작업이 허용되지 않음"을 던지는 것 같습니다 .
baldrs

1
어리석은 질문은 ...이 네임 스페이스가 하위 프로세스 / 공유되지 않은 응용 프로그램의 프로세스라고도합니까?
bonanza

3
예. 네임 스페이스를 전환 한 후 생성 된 모든 자식에 의해 상속됩니다.
Michał Górny

2
예를 들어 공유를 취소하려는 프로그램이 sudo unshare -n루트 권한 을 상속받는 것처럼 보입니다 . unshare를 호출하려면 sudo가 필요하기 때문에 호출 된 프로그램에 루트 권한이 없는지 확인하는 방법이 궁금합니다.
bonanza

3
프로세스를 사용자로 제한하는 하나의 라이너. 두 sudo unshare -n sudo -u dude bash -c 'echo Hello, my name is $USER'번만 sudo : @ThorSummoner bbs.archlinux.org/viewtopic.php?id=205240
Jakub

21

리눅스는 네트워크 네임 스페이스 ( 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 ipip 명령을 실행 해야했지만 bash에 들어가면 su someuser'someuser'사용자를 위해 권한이없는 쉘을 얻었습니다.
Sage

11

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

1
루트 사용자로 im을 통해 파일에서 데이터를 제거하거나 삭제하려고 할 때 해당 작업 파일에서 pid를 제거하는 방법 오류
pkm

@pkm 네트워킹을 다시 활성화하려면 [pid]를 /sys/fs/cgroup/net_cls/tasks(경로에 '차단 없음') 으로 반향하면됩니다.
Grief

10

예, 맞춤형 의류 프로필, 즉

/usr/bin/curl {
    ...

    # block ipv4 acces
    deny network inet,
    # ipv6 
    deny network inet6,
    # raw socket
    deny network raw,

}

그러나 그런 식으로 액세스 할 수있는 파일 목록을 생성해야합니다. 전체 절차가 약간 복잡 할 수 있습니다. 그리고 여기에 도움말 문서를 참조하십시오


7

firejail 샌드 박스 를 사용할 수 있습니다 (seccomp 기능이있는 커널에서 작동해야 함).

그것을 사용하려면 그냥

firejail --noprofile --net=none <path to executable>

--noprofile기본 샌드 박스 --net=none사용 안함 네트워킹 사용 안함

나는 대부분의 배포판이 이미 패키지를 제공한다고 믿지만 firejail이 없어도 빌드 툴 체인 및 네임 스페이스 / seccomp 지원 커널 외에 다른 종속성이 거의 없습니다.

firejail --help네트워킹 (루프백 인터페이스 만 제공하거나 ip / dns 차단 등)과 관련하여 표시 할 수있는 firejail의 다른 멋진 기능 이 있지만이 작업을 수행해야합니다. 또한 doesn't require root.


5

iptables만으로는 할 수 없습니다. 이 기능은 잠시 동안 존재 했지만 안정적으로 작동하지 않아 포기되었습니다.

프로세스를 전용 사용자 ID로 실행할 수 있으면 iptables가 owner모듈을 사용하여 수행 할 수 있습니다 .

iptables -A OUTPUT -m owner --uid-owner 1234 -j DROP

Iptables : 발신 트래픽과 conntrack 및 소유자 일치의 예를 참조하십시오 . XY 응용 프로그램 / 사용자 만 허용 하는 이상한 삭제 , iptables / pf 규칙 과 함께 작동 합니까?

자체 컨테이너에서 프로세스를 실행할 수있는 경우 해당 컨테이너를 독립적으로 방화벽 처리 할 수 ​​있습니다 (네트워크에서 완전히 연결 해제 됨).

보안 모듈은 네트워킹 기능에 대한 프로세스 액세스를 필터링 할 수 있습니다. warl0ck의 답변 은 AppArmor의 예입니다.


3

해결 방법 1 : 방화벽 :

우리는 Douane 또는 Opensnitch 와 같은 방화벽을 사용할 수 있지만 이러한 응용 프로그램은 100 % 효율적이지 않거나 개발 초기 단계입니다 (2019 년 현재 많은 버그가 있음)

해결 방법 2 : 커널 MAC :

커널 MAC은 Tomoyo , SelinuxApparmor로 가장 잘 알려진 방화벽으로 사용될 수 있습니다. 이 솔루션은 안정성과 효율성 (방화벽 솔루션)에있어 가장 좋은 방법이지만 대부분의 경우이를 설정하는 것은 다소 복잡합니다.

해결책 3 : Firejail :

Firejail 은 응용 프로그램의 네트워크 액세스를 차단하는 데 사용할 수 있습니다. 루트가 필요하지 않으므로 모든 사용자가 혜택을 누릴 수 있습니다.

firejail --noprofile --net=none command-application

해결 방법 4 : 공유 해제

공유를 해제하면 네트워크없이 다른 네임 스페이스에서 응용 프로그램을 시작할 수 있지만 루트 firejail의 솔루션은 거의 똑같은 작업을 수행하지만 루트는 필요하지 않습니다.

unshare -r -n application-comand

해결 방법 5 : 근접 :

하나 개의 솔루션은 응용 프로그램을 proxify하는 널 (null) / 가짜 프록시. tsocks 또는 proxybound를 사용할 수 있습니다 . 설정에 대한 자세한 내용은 다음과 같습니다.

해결책 6 : IP 테이블 :

다른 쉬운 해결책은 iptables이며, 응용 프로그램을 차단하도록 설정할 수 있습니다.

  1. 작성 확인 새 그룹을 ; 이 그룹에 필요한 사용자를 추가하십시오.
    • 창조하다: groupadd no-internet
    • 확인: grep no-internet /etc/group
    • 사용자 추가 : useradd -g no-internet username

      참고 : 기존 사용자를 수정하는 경우 다음을 실행해야합니다 usermod -a -G no-internet userName .sudo groups userName

  2. 경로에 스크립트 를 작성하고 실행 가능하게 만드십시오.
    • 창조하다: nano /home/username/.local/bin/no-internet
    • 실행 가능 : chmod 755 /home/username/.local/bin/no-internet
    • 함유량: #!/bin/bash
                    sg no-internet "$@"

  3. 인터넷이없는 그룹의 네트워크 활동을 삭제하기위한 iptables 규칙 추가 :
    • iptables -I OUTPUT 1 -m owner --gid-owner no-internet -j DROP

      참고 : 변경 사항을 영구적으로 유지하는 것을 잊지 마십시오 . 재부팅 후 자동으로 적용됩니다 . 이를 수행하는 것은 Linux 배포판에 따라 다릅니다.


   예를 들어 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

1
이것은 매우 훌륭한 안내서입니다. 감사합니다. 나를 위해 인터넷이없는 명령이 매개 변수를 전달하지 않는 것처럼 보였으므로 지금 사용 sg no-internet하고 있습니다.
Zach Bloomquist

@Zach 나는 내 답변을 업데이트했습니다. firejail에 관심이 있으실 것입니다.)
intika

2

사용하는 배포판에 따라 다르지만 일반적으로 OS의 MAC 시스템에 포함 된 기능입니다. 앞에서 언급했듯이 Ubuntu 또는 SuSE의 AppArmor가이를 수행 할 수 있습니다. RHEL을 사용하는 경우 실행중인 프로세스 레이블을 기반으로 특정 포트 번호에 대한 액세스를 허용하거나 거부하도록 SELinux를 구성 할 수 있습니다. 이것은 빠른 인터넷 검색 후 찾을 수있는 모든 것이지만 더 어려워지면 일반적으로 깊이있는 리소스가 더 많이있을 수 있으며 일반적인 아이디어를 제공합니다.


2

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);

루트 권한이 필요하지 않습니다.

완전한 샌드 박스는 훨씬 더 복잡하지만 비협조적 / 악의적 인 프로그램을 차단하기 위해이 순서를 사용하지 않아야합니다.


이것을 사용하는 방법의 예를 들어 주시겠습니까? 작동하려면 루트 권한이 필요합니까?
bonanza

-4

"proxychains"라는 명령 행 프로그램을 사용하여 다음 가능성 중 하나를 시도 할 수 있습니다.

사용하도록 설정하십시오 ...

  • ... 존재하지 않는 프록시? ( "잘못된"프록시로 실행할지 모르겠습니다)
  • ... 인터넷 접속을 제한하는 로컬 프록시 (예 : "tinyproxy", "오징어", "privoxy"등)? (ACL 만 사용하십시오)

나는 그것을 직접 테스트하지 않았으므로 작동하는지 알 수 없습니다 ...


테스트되지 않은 솔루션을 게시하는 것은 일반적으로 좋은 생각이 아닙니다.
Twirrim

존재하지 않는 프록시 (localhost : 1234 등)를 가진 프록시 체인은 실제로 확실한 접근 방법 일 수 있습니다.
phil294
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.