localhost: TCP 포트에서 인바운드 액세스 제한

localhost: TCP 포트에서 인바운드 액세스 제한

제가 통제할 수 없는 이유로 TCP "localhost:$PORT"에 바인딩된 바이너리가 있습니다. (Unix 소켓 바인딩으로 인해 이 질문에 대한 의문이 생길 수 있습니다).

내가 올바르게 이해했다면 이는 네트워크 시스템이 연결할 수 없더라도 해당 시스템의 다른 사용자(권한이 없는 데몬 사용자 포함)가 해당 포트에 연결할 수 있음을 의미합니다.

$me로 실행되는 바이너리만 이 포트에 연결할 수 있도록 지정할 수 있는 방법이 있나요? 구성을 지정하기 위해 루트가 될 수 있지만 수신 바이너리와 연결 바이너리 모두 루트가 아닌 $me 사용자로 실행됩니다.

답변1

iptables 에는 일치하는 확장이 있지만 ownerOUTPUT 및 POSTROUTING 체인에서만 사용할 수 있습니다. 따라서 다음과 같이 iptables OUTPUT 체인의 시작 부분에 두 개의 규칙을 추가할 수 있습니다(루트 액세스 필요).

iptables -I OUTPUT 1 -o lo -p tcp --dport $PORT -m owner --uid-owner $me -j ACCEPT
iptables -I OUTPUT 2 -o lo -p tcp --dport $PORT -j DROP
  • 규칙 1: 패킷이 TCP를 통해 루프백 인터페이스에서 나오고 대상 포트가 $PORT이고 패킷 소유자가 $me인 경우 해당 패킷을 통과시키십시오(그리고 이 체인의 다른 규칙은 처리하지 마십시오).
  • 규칙 2: 패킷이 TCP를 통해 루프백 인터페이스에서 나오고 대상 포트가 $PORT이지만 규칙 1과 일치하지 않는 경우(즉, $me가 아닌 다른 사람이 패킷을 소유한 경우) 패킷을 삭제합니다.

시스템에 iptables 설정을 관리하는 서비스가 있는 경우(예: ufwDebian/Ubuntu 또는 firewalldRedHat/Fedora 시스템) 수동으로 직접 추가하는 대신 이러한 iptables 규칙을 생성하도록 서비스를 구성할 수 있습니다.

답변2

Nftable 참조:https://wiki.nftables.org/wiki-nftables/index.php/Matching_packet_metainformation#Matching_by_socket_UID_.2F_GID

이 경우http://127.0.0.1:8000다른 사용자는 접근할 수 없고 루트로만 접근 가능

table inet filter {
        # [...]
        chain output {
                type filter hook output priority filter; policy accept;
                oif "lo" tcp dport 8000 meta skuid 0 accept
                oif "lo" tcp dport 8000 drop
        }
}

다음을 사용하여 이를 테스트할 수 있습니다.

# dropped
curl http://127.0.0.1:8000/

# accepted
sudo curl http://127.0.0.1:8000/

관련 정보