跳转到主要内容

在降权并作为非特权用户运行之前,以root身份运行钩子

项目描述

jupyterhub-roothooks

Tests passing codecov PyPI version pre-commit.ci status

在启动用户服务器之前以root身份运行钩子。

为什么?

当在Kubernetes上运行JupyterHub时,您希望用户Pod以非root用户身份运行。这是一种好的安全实践,并且在发生妥协的情况下可以大大减少影响范围。例如,如果您使用privileged: True运行容器,用户服务器被妥协后可能会控制您的整个Kubernetes集群,甚至可能是您的云账户!没有人希望这样。

然而,人们确实希望在用户服务器启动之前以root身份运行一些命令。通常,这是为了进行一些挂载操作,尽管还有其他用例。

所以目标是

  1. 在用户服务器启动之前以root身份运行一些命令
  2. 如果这些命令失败,不应导致服务器无法启动。这通常只会向用户显示一个无用的“服务器启动失败”错误。在大多数情况下,启动服务器并记录一些日志,以便用户可以调查出错原因会更好。

jupyterhub-roothooks就是为了解决这个具体问题而设计的。

如何?

准备镜像:使用repo2docker

repo2docker是用于与JupyterHub一起构建镜像的常用方法,因此jupyterhub-roothooks指定了一些默认设置,使得与repo2docker集成变得容易。

  1. jupyterhub-roothooks安装到您的容器中,通过将其添加到您的requirements.txt文件或environment.yml文件中的pip:部分。

  2. 在您的repo中添加一个roothooks.d目录。

  3. roothooks.d目录内添加您希望以root身份执行的脚本。这些脚本将按顺序执行,因此您可以通过在它们前面添加数字(如01-first-script.sh02-second-script.sh)来明确指定它们的顺序。

  4. 确保这些脚本被标记为可执行(使用 chmod +x <脚本名称>),并具有适当的shebang

  5. 添加一个类似下面的start脚本

    #!/bin/bash -l
    exec jupyterhub-roothooks --uid 1000 --gid 1000 -- "$@"
    

    这将启动jupyterhub-roothooks,它将在roothooks.d中执行找到的任何可执行脚本,然后运行适当的命令,以非root用户ID 1000和组ID 1000启动用户服务器(通过$@传递)。

z2jh配置

现在镜像已经准备就绪,您可以通过z2jh配置为用户pod授予提升的root权限。请注意,虽然容器将具有这些权限,但用户服务器本身将不会。在启动用户服务器之前,jupyterhub-roothooks将丢弃这些权限。

hub:
    config:
        KubeSpawner:
            container_security_context:
                # Run the container *truly* as privileged. This can be very dangerous,
                # but is required for doing most filesystem mounts
                privileged: true
                runAsUser: 0
                allowPrivilegeEscalation: true
                capabilities:
                    add:
                    - SYS_ADMIN

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源分布

jupyterhub-roothooks-0.2.1.tar.gz (5.0 kB 查看哈希值

上传时间:

构建分布

jupyterhub_roothooks-0.2.1-py3-none-any.whl (6.9 kB 查看哈希值

上传时间: Python 3

支持者