K8S:将 runAsUser 权限传递给在容器内创建的文件

Posted

技术标签:

【中文标题】K8S:将 runAsUser 权限传递给在容器内创建的文件【英文标题】:K8S: Pass the runAsUser permission to files created inside container 【发布时间】:2020-06-04 21:15:13 【问题描述】:

假设我有以下 yaml:

spec:
  securityContext:
    fsGroup: 5678
  serviceAccountName: some-account
  volumes:
    - name: secrets
      secret:
        secretName: data-secrets
    - name: secrets-sftp-passwd-key
      secret:
        secretName: sftp-passwd-key
  containers:
    - name: sftp
      securityContext:
        runAsUser: 1234
        runAsGroup: 5678
      image: "some/some"
      imagePullPolicy: always
      ports:
        - name: tcp-sftp
          containerPort: 22
      volumeMounts:
      - name: secrets-sftp-passwd-key
        mountPath: /etc/sftp/secret/
      - name: data
        mountPath: "/var/data"
      env:
        - name: "SFTP_USER"
          value: "some_user"
        - name: "SFTP_PASSWD"
          value: "password-1"

我正在尝试使用runAsUserrunAsGroup 运行容器sftp。图像的入口点脚本应该采用 SFTP_USER、SFTP_PASSWD 并使用此输入创建某些密码和组文件。这些文件应该在 /var/data 文件夹中创建。在此之后,应该以 1234 用户身份使用这些密码和组文件启动一个 proftpd 进程。容器以 1234 用户身份启动。但是这些文件的权限是root:5678。我收到以下错误:

unable to set UID to 0, current UID: 1234

图片的入口点脚本如下:

echo "Starting to create password file"
PASSWORD=123456
echo $PASSWORD | /usr/bin/ftpasswd --passwd --file=/var/data/ftpd.passwd --name=virtual --uid=1234 --gid=5678 --home=/var/data/ --shell=/bin/bash --stdin
echo "Password file created"
/usr/bin/ftpasswd --group --name=--group --name=virtual --file=/var/data/ftpd.group --gid=5678 --member=1234
proftpd -n  -4 -c /var/data/proftpd.conf --> This line is throwing the above error. 

这里出了什么问题?为什么它试图将 UID 设置为 0?我的印象是,提供runAsUserrunAsGroupfsGroup 将确保 /var/data 文件夹拥有正确的 1234 所有权。

【问题讨论】:

您能否提供足以复制的完整 yaml 文件?我看到您安装了数据卷,但我看不到它的声明位置。 proftpd.conf 来自哪里?文件里有什么? 【参考方案1】:

你遇到的错误正在被code打印出来:

if (geteuid() != daemon_uid) 
    pr_log_pri(PR_LOG_ERR, "unable to set UID to %s, current UID: %s",
    pr_uid2str(permanent_pool, daemon_uid),
    pr_uid2str(permanent_pool, geteuid()));
    exit(1);

您看到这个是因为您的容器用户 ID 不等于 daemon_uid。 如果您继续寻找daemon_uid,您将找到以下行:

uid_t *uid = (uid_t *) get_param_ptr(main_server->conf, "UserID", FALSE);
daemon_uid = (uid != NULL ? *uid : PR_ROOT_UID);

这意味着如果配置中未提供UserID,代码会将PR_ROOT_UID 值分配给看起来为0(根ID)的daemon_uid。 这就是前面提到的 if 语句生成此错误消息的原因。

看看example config如何提供userID。

【讨论】:

以上是关于K8S:将 runAsUser 权限传递给在容器内创建的文件的主要内容,如果未能解决你的问题,请参考以下文章

k8s文件挂载权限分析

将变量传递给在 TabBar 中调用的视图

将动态格式化的日期时间传递给 K8s 容器配置

将 int 文字传递给在 java 中采用整数的方法

如何将 ServletRequest 传递给在 graphql-java 中执行 i/o 的 pojo

解决 Docker 数据卷挂载的文件权限问题