授予非 root 用户使用一个端口的权限

Osc*_*son 7 linux docker

我托管一个实验室服务器,我是 root(也是普通用户)。

域名是 example.org,我给每个成员一个子域,例如 Bob.example.org 代表 Bob,anna.example.org 代表用户 Anna。我想你明白了。:) 使用 nginx 将子域反向代理到特定端口。

我的问题是,有什么方法可以授予非 root 用户在其特定端口范围上启动 docker 容器的权限。例如,Anna 的范围为 1300-1350,其中端口 1300 绑定到 anna.example.org,其他端口保留。

该系统运行 Debian 11 Bullseye 和最新的 Docker 版本。

小智 10

AFAIK Linux 只有特权端口与非特权端口的概念。

Linux 内核调整参数 net.ipv4.ip_unprivileged_port_start 定义哪些端口具有特权。0 到 0 之间的所有端口都net.ipv4.ip_unprivileged_port_start具有特权。

特权端口只能由 root 用户启动的进程或具有 root 权限的进程使用,或者由分配了该功能 CAP_NET_BIND_SERVICE的进程使用,例如sudo setcap cap_net_bind_service=ep /path/bin/application

所有其他端口都没有特权,任何用户都可以使用,只要这些端口尚未使用。

我不知道有什么替代方法可以允许特定用户使用特定端口。


Mat*_*att 7

首先,只有受信任的用户才可以控制你的 Docker 守护进程

默认情况下,docker 守护进程在 Debian Bullseye 安装上以 root 身份运行。将用户添加到docker组中会为该用户提供伪 root 访问权限,因为它可以控制具有该访问权限的 docker 守护进程。docker组中的每个用户都可以完全控制主机和其他容器,并且可以运行一个容器--publish任何端口的容器。

有一些选项可以为用户 docker 访问提供安全性。

  1. 无根码头工人
  2. sudo
  3. 应用程序编程接口

1.无根docker

根 docker 设置将使每个用户都可以运行 docker deamon。对于低于 1024 的端口,需要遵守bob 提供的非特权端口信息,因为每个用户将“拥有”自己的守护进程。Docker也提供了相关指导。这并不能阻止安娜占领鲍勃港口。

2.sudo

允许用户运行 docker 命令的最简单方法是通过 sudo 提供根控制的脚本,该脚本可以是静态的,也可以控制用户输入可选参数:

#!/bin/bash
docker run --detach --publish 1300:1300 anna/app-image
Run Code Online (Sandbox Code Playgroud)
anna    ALL=(root) NOPASSWD: /usr/local/bin/start-anna-image
Run Code Online (Sandbox Code Playgroud)

如果您希望用户能够添加自己的选项,您需要非常小心地控制他们的输入,因为这很容易

3. Docker的授权插件或API

由于 Docker 不在守护进程上提供任何授权层,因此您需要添加一些内容来控制用户访问。

Docker 提供了一个内置的授权插件框架来实现这一点。一些示例是opa-docker-authzcasbin-authz-plugin

您可以让用户访问某种形式的代理 API,该 API 可以对传递到 Docker REST API 的内容进行身份验证和授权。大多数编程语言都有 docker 库。Kubernetes+RBAC 是位于 Docker 守护进程前面并控制访问的 API 的一个示例(只是一个非常大/复杂的 API,但它的功能却更多)。


Mir*_*ici 5

只要端口没有特权,非 root 用户就可以绑定到任何端口(超过 1024)。他们可以通过以下方式启动容器:

docker run --expose 1300-1350  <image-name>
Run Code Online (Sandbox Code Playgroud)

先到先得。如果两个程序尝试绑定到同一端口,则只有第一个绑定的程序会成功。

对于特权端口(小于 1024),您需要 root 或 CAP_NET_BIND_SERVICE 功能。man capabilities详情请参阅。

  • @OscarAndersson 不,“docker”组中的任何用户,当 docker 守护进程以 root 身份运行时,都具有机器的 root 访问权限,并且可以控制其他容器 (3认同)
  • 如果 docker 守护进程以“root”身份运行,那么哪个用户运行“docker”命令并不重要。用户本质上是通过执行该工作的守护进程获得 root 访问权限。 (2认同)