netbirdio / netbird

Connect your devices into a secure WireGuard®-based overlay network with SSO, MFA and granular access controls.
https://netbird.io
BSD 3-Clause "New" or "Revised" License
10.58k stars 473 forks source link

ACLs have no effects on Network Routes #1414

Open benjvfr opened 8 months ago

benjvfr commented 8 months ago

Describe the problem When adding a network route with a routing peer, the ACL do not seems to apply. See below for the complete use case. (NetBird 0.25.2)

To Reproduce Steps to reproduce the behavior:

  1. Add a routing peer named "edge-gw" (Docker) which is placed in the DMZ of the private network. The underlying network is configured to let this routing peer being able to route to a service (my-private-service) hosted in the private network at 10.50.0.4/32 (web service on TCP 443).

  2. Tag the "edge-gw" routing peer with "Edge" tag.

  3. In "Network Routes", click "Add route" :

    • Network Identifier > my-private-service
    • Network Range > 10.50.0.4/32
    • Routing Peer > Select "edge-gw"
    • Distribution groups > "Developers"
    • Enabled > True
    • Masquerade > True
  4. In "Access Control" :

    • All rules are disabled, except for DNS forwarding (which is routed through the same "edge-gw" routing peer).
  5. On a "dev-peer" machine, which belongs to the 'Developers" group :

    • "netstat -nr" show the route 10.50.0.4/32 being distributed (which seems right)
    • curl https://my-private-service.<redacted-domain> (10.50.0.4) returns the web HTML page, which seems wrong as no ACL rules are setup to allow traffic for TCP 443 in NetBird ACL. Same for pinging 10.50.0.4.

Expected behavior If no ACL are enabled, traffic should not be forwarded to the private network via routing peer (even if route is distributed). As no ACL route exists for "Developers > Edge" on TCP 443, traffic should be dropped. This is not the case.

Screenshots

  1. Routing peer "edge-gw" : Capture d’écran 2023-12-28 à 11 24 49
Capture d’écran 2023-12-28 à 11 27 03
  1. Network routes

    Capture d’écran 2023-12-28 à 11 29 45
  2. ACL

    Capture d’écran 2023-12-28 à 11 33 28
  3. Dev peer

    Capture d’écran 2023-12-28 à 11 32 52
routes curl

Is this the normal behavior ? Or I misconfigured something ?

benjvfr commented 8 months ago

After further troubleshooting, here is what I found :

So for my use case :

It seems to be a bug.

mlsmaycon commented 8 months ago

Hello @benjvfr, this is the current behavior of network routes; there is no access control for routed networks.

The access control rule you created only affects traffic targeting the edge node.

We have plans to add support to access control for routed networks this quarter.

benjvfr commented 8 months ago

Hello, thank you for your answer.

Okay, I asked because in your documentation related to "Manage DNS in your network" it is indicated to add an ACL for UDP/53 to the routing peer, suggesting that ACLs can filter traffic by port/protocol to the private network.

In fact, any ACL can be added here, not specifically UDP/53 to routing peer : there must simply be an ACL authorizing some kind of connection to the routing peer (anything, can be: ICMP, HTTP...).

buzzzo commented 8 months ago

Hello @benjvfr, this is the current behavior of network routes; there is no access control for routed networks.

The access control rule you created only affects traffic targeting the edge node.

We have plans to add support to access control for routed networks this quarter.

Does it means that we could just do an acl like: src group_a -> dst 192.168.1.0/20 proto tcp port 22 action allow

where 192.168.1.0/24 is a network route

Could i also have an acl like src group_a -> dst 192.168.1.1/32 proto tcp port 22 action allow where 192.168.1.1/32 is only an ip under network route reachable tru network routes.

Thx

logan-hcg commented 5 months ago

We have plans to add support to access control for routed networks this quarter.

Hi @mlsmaycon , any chance there has been progress on this? I really want to start using netbird at my org, but can't until we can lock down routed networks.

logan-hcg commented 5 months ago

I did some additional experimentation with this. My initial main concern was being able to restrict what ports users could speak to on the routed network when they had access, however I think it is even more critical now.

If a connected peer routes a network, any client that has access to talk to that peer can pass traffic to the routed network, even if that client is not in any of the "distribution groups" for the routed network as long as:

  1. the user knows the CIDR of the routed network; and
  2. which peer(s) are the "routing peer"; and
  3. have at least one ACL which allows them to communicate with that "routing peer"

To "manually" activate access to that routed network:

sudo ip route add <NETWORK/NETMASK> dev wt0 table netbird
sudo wg set wt0 peer <ROUTING_PEER_KEY> allowed-ips <EXISTING_ALLOWED_IPS>,<NETWORK/NETMASK>

This makes sense, because the Netbird documentation talks about "route distribution", and does not make any claims that it is a security boundary. However, I would expect many users would have a similar assumption as I did that there is some security checks preventing traffic being passed if the user's peer is not in the "distribution groups".

florian-obradovic commented 4 months ago

I am also affected by this.

From my findings, clients only can access peers behind the routing peer, if you have any ACL which allows some protocol like ICMP to the network group where the advertising node sits: image CleanShot 2024-05-10 at 07 27 36@2x CleanShot 2024-05-10 at 07 19 57@2x

marcportabellaclotet-mt commented 3 months ago

Hello @benjvfr, this is the current behavior of network routes; there is no access control for routed networks.

The access control rule you created only affects traffic targeting the edge node.

We have plans to add support to access control for routed networks this quarter.

I am curious on how you are tackling the routed network filtering. Are there any updates? Just looking into the current IPTables logic on routers, I understand that these iptable routes need to be updated with a more fine-grained rules.

Ip Tables router rules ``` Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- !100.113.0.0/16 100.113.0.0/16 ACCEPT all -- 100.113.0.0/16 !100.113.0.0/16 NETBIRD-ACL-INPUT all -- 100.113.0.0/16 100.113.0.0/16 DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination NETBIRD-RT-FWD all -- anywhere anywhere NETBIRD-RT-FWD all -- anywhere anywhere NETBIRD-RT-FWD all -- anywhere anywhere ACCEPT all -- anywhere anywhere mark match 0x7e4 ACCEPT all -- anywhere anywhere mark match 0x7e4 NETBIRD-ACL-INPUT all -- anywhere anywhere DROP all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- !100.113.0.0/16 100.113.0.0/16 ACCEPT all -- 100.113.0.0/16 !100.113.0.0/16 NETBIRD-ACL-OUTPUT all -- 100.113.0.0/16 100.113.0.0/16 DROP all -- anywhere anywhere Chain NETBIRD-ACL-INPUT (2 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:8888 ACCEPT tcp -- anywhere anywhere tcp spt:8888 ACCEPT tcp -- anywhere anywhere tcp spt:http-alt ACCEPT tcp -- anywhere anywhere tcp dpt:http-alt Chain NETBIRD-ACL-OUTPUT (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:8888 ACCEPT tcp -- anywhere anywhere tcp dpt:8888 ACCEPT tcp -- anywhere anywhere tcp dpt:http-alt ACCEPT tcp -- anywhere anywhere tcp spt:http-alt Chain NETBIRD-RT-FWD (3 references) target prot opt source destination ACCEPT all -- ip-10-170-0-2.eu-west-1.compute.internal 100.113.0.0/16 ACCEPT all -- 100.113.0.0/16 ip-10-170-0-2.eu-west-1.compute.internal .... ```

Is that correct?

Thanks @mlsmaycon!

sat-dish commented 2 months ago

We are also waiting on an update on this as it's kind of a show stopper for us.

Mntz commented 2 months ago

Same, we're currently testing Netbird and won't be able to deploy if network routes are not secured.