Skip to content

Commit 2b696a2

Browse files
mihalicyndavem330
authored andcommitted
ipvs: allow some sysctls in non-init user namespaces
Let's make all IPVS sysctls writtable even when network namespace is owned by non-initial user namespace. Let's make a few sysctls to be read-only for non-privileged users: - sync_qlen_max - sync_sock_size - run_estimation - est_cpulist - est_nice I'm trying to be conservative with this to prevent introducing any security issues in there. Maybe, we can allow more sysctls to be writable, but let's do this on-demand and when we see real use-case. This patch is motivated by user request in the LXC project [1]. Having this can help with running some Kubernetes [2] or Docker Swarm [3] workloads inside the system containers. Link: lxc/lxc#4278 [1] Link: https://github.com/kubernetes/kubernetes/blob/b722d017a34b300a2284b890448e5a605f21d01e/pkg/proxy/ipvs/proxier.go#L103 [2] Link: https://github.com/moby/libnetwork/blob/3797618f9a38372e8107d8c06f6ae199e1133ae8/osl/namespace_linux.go#L682 [3] Cc: Julian Anastasov <[email protected]> Cc: Simon Horman <[email protected]> Cc: Pablo Neira Ayuso <[email protected]> Cc: Jozsef Kadlecsik <[email protected]> Cc: Florian Westphal <[email protected]> Signed-off-by: Alexander Mikhalitsyn <[email protected]> Acked-by: Julian Anastasov <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 643bb5d commit 2b696a2

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

net/netfilter/ipvs/ip_vs_ctl.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4269,6 +4269,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
42694269
struct ctl_table *tbl;
42704270
int idx, ret;
42714271
size_t ctl_table_size = ARRAY_SIZE(vs_vars);
4272+
bool unpriv = net->user_ns != &init_user_ns;
42724273

42734274
atomic_set(&ipvs->dropentry, 0);
42744275
spin_lock_init(&ipvs->dropentry_lock);
@@ -4283,10 +4284,6 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
42834284
tbl = kmemdup(vs_vars, sizeof(vs_vars), GFP_KERNEL);
42844285
if (tbl == NULL)
42854286
return -ENOMEM;
4286-
4287-
/* Don't export sysctls to unprivileged users */
4288-
if (net->user_ns != &init_user_ns)
4289-
ctl_table_size = 0;
42904287
} else
42914288
tbl = vs_vars;
42924289
/* Initialize sysctl defaults */
@@ -4312,10 +4309,17 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
43124309
ipvs->sysctl_sync_ports = 1;
43134310
tbl[idx++].data = &ipvs->sysctl_sync_ports;
43144311
tbl[idx++].data = &ipvs->sysctl_sync_persist_mode;
4312+
43154313
ipvs->sysctl_sync_qlen_max = nr_free_buffer_pages() / 32;
4314+
if (unpriv)
4315+
tbl[idx].mode = 0444;
43164316
tbl[idx++].data = &ipvs->sysctl_sync_qlen_max;
4317+
43174318
ipvs->sysctl_sync_sock_size = 0;
4319+
if (unpriv)
4320+
tbl[idx].mode = 0444;
43184321
tbl[idx++].data = &ipvs->sysctl_sync_sock_size;
4322+
43194323
tbl[idx++].data = &ipvs->sysctl_cache_bypass;
43204324
tbl[idx++].data = &ipvs->sysctl_expire_nodest_conn;
43214325
tbl[idx++].data = &ipvs->sysctl_sloppy_tcp;
@@ -4338,15 +4342,22 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
43384342
tbl[idx++].data = &ipvs->sysctl_conn_reuse_mode;
43394343
tbl[idx++].data = &ipvs->sysctl_schedule_icmp;
43404344
tbl[idx++].data = &ipvs->sysctl_ignore_tunneled;
4345+
43414346
ipvs->sysctl_run_estimation = 1;
4347+
if (unpriv)
4348+
tbl[idx].mode = 0444;
43424349
tbl[idx].extra2 = ipvs;
43434350
tbl[idx++].data = &ipvs->sysctl_run_estimation;
43444351

43454352
ipvs->est_cpulist_valid = 0;
4353+
if (unpriv)
4354+
tbl[idx].mode = 0444;
43464355
tbl[idx].extra2 = ipvs;
43474356
tbl[idx++].data = &ipvs->sysctl_est_cpulist;
43484357

43494358
ipvs->sysctl_est_nice = IPVS_EST_NICE;
4359+
if (unpriv)
4360+
tbl[idx].mode = 0444;
43504361
tbl[idx].extra2 = ipvs;
43514362
tbl[idx++].data = &ipvs->sysctl_est_nice;
43524363

0 commit comments

Comments
 (0)