我托管一个实验室服务器,我是 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
所有其他端口都没有特权,任何用户都可以使用,只要这些端口尚未使用。
我不知道有什么替代方法可以允许特定用户使用特定端口。
默认情况下,docker 守护进程在 Debian Bullseye 安装上以 root 身份运行。将用户添加到docker
组中会为该用户提供伪 root 访问权限,因为它可以控制具有该访问权限的 docker 守护进程。docker组中的每个用户都可以完全控制主机和其他容器,并且可以运行一个容器--publish
任何端口的容器。
有一些选项可以为用户 docker 访问提供安全性。
sudo
无根 docker 设置将使每个用户都可以运行 docker deamon。对于低于 1024 的端口,需要遵守bob 提供的非特权端口信息,因为每个用户将“拥有”自己的守护进程。Docker也提供了相关指导。这并不能阻止安娜占领鲍勃港口。
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)
如果您希望用户能够添加自己的选项,您需要非常小心地控制他们的输入,因为这很容易
由于 Docker 不在守护进程上提供任何授权层,因此您需要添加一些内容来控制用户访问。
Docker 提供了一个内置的授权插件框架来实现这一点。一些示例是opa-docker-authz和casbin-authz-plugin
您可以让用户访问某种形式的代理 API,该 API 可以对传递到 Docker REST API 的内容进行身份验证和授权。大多数编程语言都有 docker 库。Kubernetes+RBAC 是位于 Docker 守护进程前面并控制访问的 API 的一个示例(只是一个非常大/复杂的 API,但它的功能却更多)。
只要端口没有特权,非 root 用户就可以绑定到任何端口(超过 1024)。他们可以通过以下方式启动容器:
docker run --expose 1300-1350 <image-name>
Run Code Online (Sandbox Code Playgroud)
先到先得。如果两个程序尝试绑定到同一端口,则只有第一个绑定的程序会成功。
对于特权端口(小于 1024),您需要 root 或 CAP_NET_BIND_SERVICE 功能。man capabilities
详情请参阅。
归档时间: |
|
查看次数: |
5120 次 |
最近记录: |