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"
我正在尝试使用runAsUser
和runAsGroup
运行容器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?我的印象是,提供runAsUser
、runAsGroup
和fsGroup
将确保 /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 权限传递给在容器内创建的文件的主要内容,如果未能解决你的问题,请参考以下文章