iptables 소유자 모듈(gid-owner)을 작동시킬 수 없습니다

iptables 소유자 모듈(gid-owner)을 작동시킬 수 없습니다

iptables내 우분투 16.04 노트북에서 기본적으로 모든 애플리케이션에 대한 인터넷 액세스를 거부하고 이름이 지정된 그룹만 허용하도록 규칙을 설정하려고 합니다 internet. 대신에 그룹을 사용 sudo -g하거나 액세스합니다. 필요할 때 인터넷 sg. 예를 들어:

sudo -g internet firefox

또는

sg internet -c "firefox"

그러나 이 접근법은 효과가 없었습니다. iptables내가 추가한 규칙은 다음과 같습니다 .

/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner --gid-owner internet   -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 443  -m owner --gid-owner internet   -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport 53  -m owner --gid-owner internet   -j ACCEPT

위의 규칙을 테스트했으며 소유자 모듈을 제거하면 제대로 작동하고 모든 앱에서 인터넷을 허용합니다. 그러나 소유자 모듈과 gid-owner필터를 추가하면 어떤 응용 프로그램도 인터넷에 액세스할 수 없습니다( 언급된 sgsudo -g명령을 사용해도).

내가 뭘 잘못했나요?

답변1

이미 해결된 것으로 표시되었지만 이 문제를 겪는 다른 사람들의 건전한 정신을 위해 여기에서 자세히 설명하고 발견한 문제의 실제 원인을 설명해야 한다고 생각했습니다. 문제는iptables. 특히 인간이 기대하는 방식으로 그룹 ID 필터링을 처리하지 않습니다. 이것이 WAD인지 버그인지 확실하지 않습니다. IMHO 이건 실수야iptables -m owner확장 코드.

문제는 처리에 있습니다 --gid-owner. 것 같다iptables 확장코드는 그룹 ID를 문자 그대로 필터링하지 않습니다(즉, 그룹의 사용자가 예 또는 아니오입니까?). 모듈의 동작을 보면 더 깊이 파고들어 사용자 이름 설정을 조사한 다음 사용자의 기본 그룹 멤버십을 기반으로 결정을 내리는 것이 분명합니다. 이는 그룹 구성원 목록을 문자 그대로 확인하는 것과는 다릅니다(나 자신과 이 문제를 겪은 다른 사람들이 기대하는 것). 이 동작은 관련 매뉴얼 페이지에 문서화되어 있지 않습니다.

즉, Ubuntu의 iptables 구현은 확인만 합니다.메인 그룹현재 네트워크 패킷의 소유자입니다. 특정 사용자 그룹이 사용되는 분할 VPN을 생성한다고 가정해 보겠습니다.VPN트래픽을 VPN 인터페이스로 강제 실행합니다.

소유자별을 지정하는 경우 확장 --uid-owner아래의 매개변수가 -m owner예상대로 작동합니다. 그런 다음 분기하려는 사용자 이름이 여러 개 있고 시간이 지남에 따라 사용자 목록이 변경될 수 있다고 가정해 보겠습니다. 따라서 그룹 ID 필터링을 사용하는 것이 더 효율적이라고 결정합니다( --gid-owner). 모든 VPN 트래픽 사용자를VPNiptables 매개변수를 --gid-owner vpn. 보시다시피 많은 경우 필터가 예상대로 작동하지 않습니다. 왜?

패킷 소유자의 기본/기본 그룹만 비교됩니다. 따라서 귀하가 추가하는 모든 사용자 이름은VPN사용자가 생성된 후 그룹은 다음 위치에 있게 됩니다.VPN보조 사용자로 그룹화하고그룹에 속해 있어도 분기되지 않습니다!

"루트" 사용자가 작동하지 않는 이유는 기본/기본 그룹이 "루트"이기 때문입니다.

예를 들어

사용자 이름이 있다고 가정VPN주니어 그룹에서VPN및 사용자 이름테스트 더미주니어 그룹에서시험하지만테스트 더미역시 그 조직의 일원VPN그룹. 도착하다테스트 더미,VPN마이너 그룹이다.

이 iptables 규칙은VPN사용자는 아니지만테스트 더미두 사용자 모두가 그룹에 속하기 때문에 두 사용자의 패킷이 태그될 것이라고 본능적으로 생각하는 경우에도 마찬가지입니다.VPN:

iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1

문제를 해결하려면 다음 해결 방법과 같은 다른 규칙을 만들어야 합니다.

iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --gid-owner vpn -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! -d 192.168.1.1 -m owner --uid-owner testdummy -j MARK --set-mark 0x1

답변2

많은 시행착오 끝에 나는 내 질문에 대한 답을 찾았습니다. 문제는 iptables나 내가 사용하는 Ubuntu/Linux 버전이 아니라 세 번째 규칙에 있습니다.

/sbin/iptables -A OUTPUT -p udp --dport 53  -m owner --gid-owner internet   -j ACCEPT

udp/53포트는 DNS 이름 확인에 사용되므로 백그라운드 dnsmasq서비스에서 사용될 수 있으므로 해당 그룹에서 프로그램을 실행하려고 하면 internet해당 그룹에 다른 서비스가 없기 때문에 이름 확인이 발생하지 않습니다. 그러나 이상적으로 이러한 서비스는 루트 계정으로 실행되므로( 그리고 루트는 무엇이든 할 수 있습니다! ) 여전히 포트에 액세스할 수 있어야 하지만 iptables 소유자 모듈의 설계는 이 루트 권한을 존중하지 않는 것 같습니다.

마지막 규칙에서 소유자 모듈 검사를 제거하자 인터넷이 작동하기 시작했습니다.

/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

편집하다

직접 연결되지는 않았지만 관련 질문은 루트 그룹의 소유자 모듈을 사용하는 것입니다. 우리는 다음과 같이 루트 그룹에 인터넷에 대한 액세스 권한을 할당하는 경향이 있습니다( internet그룹에 추가로 또는 그룹 대신).

/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner --gid-owner root   -j ACCEPT

그러나 많은 애플리케이션이 보안상의 이유로 루트 사용자를 사용하여 인터넷에 연결하지 않기 때문에 실제로는 작동하지 않습니다. 예를 들어 위의 작업을 수행한 후에도 다음 명령은 작동하지 않습니다.

sudo apt-get update

이는 보안상의 이유로 apt프로그램이 내부적으로 사용자가 다운로드한 패키지를 사용하기 때문입니다 ._apt

답변3

이를 위해 사용할 수 있습니다 --suppl-groups.EA6CC2FD. ~에서iptables-extensions(8):

   --suppl-groups
          Causes group(s) specified with --gid-owner to be also checked in
          the supplementary groups of a process.

당신은 또한 볼 수 있습니다iptables 그룹 일치: 사용자의 기본 그룹 수정

답변4

/sbin/iptables -A OUTPUT -p tcp --dport 80  -m owner ! --gid-owner root -j DROP

관련 정보